Do not record relation accessess unnecessarily

Before this commit, we've recorded the relation accesses in 3 different
places
    - FindPlacementListConnection         -- applies all executor in tx block
    - StartPlacementExecutionOnSession()  -- adaptive executor only
    - StartPlacementListConnection()      -- router/real-time only

This is different than Citus 8.2, and could lead to query execution times
increase considerably on multi-shard commands in transaction block
that are on partitioned tables.

Benchmarks:

```
1+8 c5.4xlarge cluster

Empty distributed partitioned table with 365 partitions: https://gist.github.com/onderkalaci/1edace4ed6bd6f061c8a15594865bb51#file-partitions_365-sql

./pgbench -f /tmp/multi_shard.sql -c10 -j10 -P 1 -T 120 postgres://citus:w3r6KLJpv3mxe9E-NIUeJw@c.fy5fkjcv45vcepaogqcaskmmkee.db.citusdata.com:5432/citus?sslmode=require

cat  /tmp/multi_shard.sql
BEGIN;
	DELETE FROM collections_list;
	DELETE FROM collections_list;
	DELETE FROM collections_list;
COMMIT;
cat  /tmp/single_shard.sql
BEGIN;
	DELETE FROM collections_list WHERE key = :aid;
	DELETE FROM collections_list WHERE key = :aid;
	DELETE FROM collections_list WHERE key = :aid;
COMMIT;

cat  /tmp/mix.sql
BEGIN;
	DELETE FROM collections_list WHERE key = :aid;
	DELETE FROM collections_list WHERE key = :aid;
	DELETE FROM collections_list WHERE key = :aid;

	DELETE FROM collections_list;
	DELETE FROM collections_list;
	DELETE FROM collections_list;
COMMIT;
```

The table shows `latency average` of pgbench runs explained above, so we have a pretty solid improvement even over 8.2.2.

| Test  | Citus 8.2.2  |  Citus 8.3.1   | Citus 8.3.2 (this branch)  | Citus 8.3.1 (FKEYs disabled via GUC)  |
| ------------- | ------------- | ------------- |------------- | ------------- |
|multi_shard |  2370.083 ms  |3605.040 ms |1324.094 ms |1247.255 ms  |
| single_shard  | 85.338 ms  |120.934 ms  |73.216 ms  | 78.765 ms |
| mix  | 2434.459 ms | 3727.080 ms  |1306.456 ms  | 1280.326 ms |
pull/2866/head
Onder Kalaci 2019-08-05 10:08:44 +02:00
parent 35ee896f3d
commit 060ac11476
6 changed files with 329 additions and 279 deletions

View File

@ -2346,6 +2346,8 @@ CitusCopyDestReceiverStartup(DestReceiver *dest, int operation,
copyDest->shardStateHash = CreateShardStateHash(TopTransactionContext); copyDest->shardStateHash = CreateShardStateHash(TopTransactionContext);
copyDest->connectionStateHash = CreateConnectionStateHash(TopTransactionContext); copyDest->connectionStateHash = CreateConnectionStateHash(TopTransactionContext);
RecordRelationAccessIfReferenceTable(tableId, PLACEMENT_ACCESS_DML);
} }

View File

@ -366,6 +366,8 @@ AssignPlacementListToConnection(List *placementAccessList, MultiConnection *conn
ConnectionPlacementHashEntry *placementEntry = NULL; ConnectionPlacementHashEntry *placementEntry = NULL;
ConnectionReference *placementConnection = NULL; ConnectionReference *placementConnection = NULL;
Oid relationId = InvalidOid;
if (placement->shardId == INVALID_SHARD_ID) if (placement->shardId == INVALID_SHARD_ID)
{ {
/* /*
@ -452,8 +454,9 @@ AssignPlacementListToConnection(List *placementAccessList, MultiConnection *conn
placementConnection->hadDML = true; placementConnection->hadDML = true;
} }
/* record the relation access mapping */ /* record the relation access */
AssociatePlacementAccessWithRelation(placement, accessType); relationId = RelationIdForShard(placement->shardId);
RecordRelationAccessIfReferenceTable(relationId, accessType);
} }
} }
@ -700,9 +703,6 @@ FindPlacementListConnection(int flags, List *placementAccessList, const char *us
Assert(!placementConnection->hadDML); Assert(!placementConnection->hadDML);
Assert(accessType != PLACEMENT_ACCESS_DDL); Assert(accessType != PLACEMENT_ACCESS_DDL);
} }
/* record the relation access mapping */
AssociatePlacementAccessWithRelation(placement, accessType);
} }
return chosenConnection; return chosenConnection;

View File

@ -82,7 +82,7 @@ static HTAB *RelationAccessHash;
/* functions related to access recording */ /* functions related to access recording */
static void RecordRelationAccess(Oid relationId, ShardPlacementAccessType accessType); static void RecordRelationAccessBase(Oid relationId, ShardPlacementAccessType accessType);
static void RecordPlacementAccessToCache(Oid relationId, static void RecordPlacementAccessToCache(Oid relationId,
ShardPlacementAccessType accessType); ShardPlacementAccessType accessType);
static void RecordRelationParallelSelectAccessForTask(Task *task); static void RecordRelationParallelSelectAccessForTask(Task *task);
@ -148,25 +148,32 @@ AllocateRelationAccessHash(void)
/* /*
* AssociatePlacementAccessWithRelation associates the placement access to the * RecordRelationAccessIfReferenceTable marks the relation accessed if it is a
* distributed relation that the placement belongs to. * reference relation.
*
* The function is a wrapper around RecordRelationAccessBase().
*/ */
void void
AssociatePlacementAccessWithRelation(ShardPlacement *placement, RecordRelationAccessIfReferenceTable(Oid relationId, ShardPlacementAccessType accessType)
ShardPlacementAccessType accessType)
{ {
Oid relationId = InvalidOid;
uint64 shardId = INVALID_SHARD_ID;
if (!ShouldRecordRelationAccess()) if (!ShouldRecordRelationAccess())
{ {
return; return;
} }
shardId = placement->shardId; /*
relationId = RelationIdForShard(shardId); * We keep track of relation accesses for the purposes of foreign keys to
* reference tables. So, other distributed tables are not relevant for now.
* Additionally, partitioned tables with lots of partitions might require
* recursively calling RecordRelationAccessBase(), so becareful about
* removing this check.
*/
if (PartitionMethod(relationId) != DISTRIBUTE_BY_NONE)
{
return;
}
RecordRelationAccess(relationId, accessType); RecordRelationAccessBase(relationId, accessType);
} }
@ -205,15 +212,15 @@ PlacementAccessTypeToText(ShardPlacementAccessType accessType)
/* /*
* RecordRelationAccess associates the access to the distributed relation. The * RecordRelationAccessBase associates the access to the distributed relation. The
* function takes partitioned relations into account as well. * function takes partitioned relations into account as well.
* *
* We implemented this function to prevent accessing placement metadata during * We implemented this function to prevent accessing placement metadata during
* recursive calls of the function itself (e.g., avoid * recursive calls of the function itself (e.g., avoid
* AssociatePlacementAccessWithRelation()). * RecordRelationAccessBase()).
*/ */
static void static void
RecordRelationAccess(Oid relationId, ShardPlacementAccessType accessType) RecordRelationAccessBase(Oid relationId, ShardPlacementAccessType accessType)
{ {
/* make sure that this is not a conflicting access */ /* make sure that this is not a conflicting access */
CheckConflictingRelationAccesses(relationId, accessType); CheckConflictingRelationAccesses(relationId, accessType);
@ -244,7 +251,7 @@ RecordRelationAccess(Oid relationId, ShardPlacementAccessType accessType)
} }
/* recursively call the function to cover multi-level partitioned tables */ /* recursively call the function to cover multi-level partitioned tables */
RecordRelationAccess(partitionOid, accessType); RecordRelationAccessBase(partitionOid, accessType);
} }
} }
else if (PartitionTableNoLock(relationId)) else if (PartitionTableNoLock(relationId))
@ -680,7 +687,7 @@ GetRelationAccessMode(Oid relationId, ShardPlacementAccessType accessType)
} }
else else
{ {
return RELATION_SEQUENTIAL_ACCESSED; return RELATION_REFERENCE_ACCESSED;
} }
} }

View File

@ -23,13 +23,20 @@ struct ShardPlacement;
typedef enum RelationAccessMode typedef enum RelationAccessMode
{ {
RELATION_NOT_ACCESSED, RELATION_NOT_ACCESSED,
RELATION_SEQUENTIAL_ACCESSED,
/* only valid for reference tables */
RELATION_REFERENCE_ACCESSED,
/*
* Only valid for distributed tables and set
* if table is accessed in parallel mode
*/
RELATION_PARALLEL_ACCESSED RELATION_PARALLEL_ACCESSED
} RelationAccessMode; } RelationAccessMode;
extern void AllocateRelationAccessHash(void); extern void AllocateRelationAccessHash(void);
extern void ResetRelationAccessHash(void); extern void ResetRelationAccessHash(void);
extern void AssociatePlacementAccessWithRelation(ShardPlacement *placement, extern void RecordRelationAccessIfReferenceTable(Oid relationId,
ShardPlacementAccessType accessType); ShardPlacementAccessType accessType);
extern void RecordParallelRelationAccessForTaskList(List *taskList); extern void RecordParallelRelationAccessForTaskList(List *taskList);
extern void RecordParallelSelectAccess(Oid relationId); extern void RecordParallelSelectAccess(Oid relationId);

View File

@ -22,14 +22,30 @@ CREATE OR REPLACE FUNCTION relation_ddl_access_mode(relationId Oid)
RETURNS int RETURNS int
LANGUAGE C STABLE STRICT LANGUAGE C STABLE STRICT
AS 'citus', $$relation_ddl_access_mode$$; AS 'citus', $$relation_ddl_access_mode$$;
CREATE OR REPLACE FUNCTION relation_access_mode_to_text(relationShardAccess int) CREATE OR REPLACE FUNCTION distributed_relation(relation_name text)
RETURNS bool AS
$$
DECLARE
part_method char;
BEGIN
select partmethod INTO part_method from pg_dist_partition WHERE logicalrelid = relation_name::regclass;
IF part_method = 'h' THEN
RETURN true;
ELSE
RETURN false;
END IF;
END;
$$ LANGUAGE 'plpgsql' IMMUTABLE;
CREATE OR REPLACE FUNCTION relation_access_mode_to_text(relation_name text, relationShardAccess int)
RETURNS text AS RETURNS text AS
$$ $$
BEGIN BEGIN
IF relationShardAccess = 0 THEN IF relationShardAccess = 0 and distributed_relation(relation_name) THEN
RETURN 'not_parallel_accessed';
ELSIF relationShardAccess = 0 and NOT distributed_relation(relation_name) THEN
RETURN 'not_accessed'; RETURN 'not_accessed';
ELSIF relationShardAccess = 1 THEN ELSIF relationShardAccess = 1 THEN
RETURN 'sequential_access'; RETURN 'reference_table_access';
ELSE ELSE
RETURN 'parallel_access'; RETURN 'parallel_access';
END IF; END IF;
@ -37,9 +53,9 @@ END;
$$ LANGUAGE 'plpgsql' IMMUTABLE; $$ LANGUAGE 'plpgsql' IMMUTABLE;
CREATE VIEW relation_acesses AS CREATE VIEW relation_acesses AS
SELECT table_name, SELECT table_name,
relation_access_mode_to_text(relation_select_access_mode(table_name::regclass)) as select_access, relation_access_mode_to_text(table_name, relation_select_access_mode(table_name::regclass)) as select_access,
relation_access_mode_to_text(relation_dml_access_mode(table_name::regclass)) as dml_access, relation_access_mode_to_text(table_name, relation_dml_access_mode(table_name::regclass)) as dml_access,
relation_access_mode_to_text(relation_ddl_access_mode(table_name::regclass)) as ddl_access relation_access_mode_to_text(table_name, relation_ddl_access_mode(table_name::regclass)) as ddl_access
FROM FROM
((SELECT 'table_' || i as table_name FROM generate_series(1, 7) i) UNION (SELECT 'partitioning_test') UNION (SELECT 'partitioning_test_2009') UNION (SELECT 'partitioning_test_2010')) tables; ((SELECT 'table_' || i as table_name FROM generate_series(1, 7) i) UNION (SELECT 'partitioning_test') UNION (SELECT 'partitioning_test_2009') UNION (SELECT 'partitioning_test_2010')) tables;
SET citus.shard_replication_factor TO 1; SET citus.shard_replication_factor TO 1;
@ -102,8 +118,8 @@ BEGIN;
SELECT * FROM relation_acesses WHERE table_name IN ('table_7') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_7') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+---------------+--------------+----------------- ------------+-----------------------+-----------------------+-----------------
table_7 | not_accessed | not_accessed | parallel_access table_7 | not_parallel_accessed | not_parallel_accessed | parallel_access
(1 row) (1 row)
COMMIT; COMMIT;
@ -116,8 +132,8 @@ SELECT count(*) FROM table_1;
SELECT * FROM relation_acesses WHERE table_name = 'table_1'; SELECT * FROM relation_acesses WHERE table_name = 'table_1';
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+---------------+--------------+-------------- ------------+-----------------------+-----------------------+-----------------------
table_1 | not_accessed | not_accessed | not_accessed table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(1 row) (1 row)
-- a very simple test that first checks sequential -- a very simple test that first checks sequential
@ -125,8 +141,8 @@ SELECT * FROM relation_acesses WHERE table_name = 'table_1';
BEGIN; BEGIN;
SELECT * FROM relation_acesses WHERE table_name = 'table_1'; SELECT * FROM relation_acesses WHERE table_name = 'table_1';
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+---------------+--------------+-------------- ------------+-----------------------+-----------------------+-----------------------
table_1 | not_accessed | not_accessed | not_accessed table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(1 row) (1 row)
SELECT count(*) FROM table_1 WHERE key = 1; SELECT count(*) FROM table_1 WHERE key = 1;
@ -137,8 +153,8 @@ BEGIN;
SELECT * FROM relation_acesses WHERE table_name = 'table_1'; SELECT * FROM relation_acesses WHERE table_name = 'table_1';
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-------------------+--------------+-------------- ------------+-----------------------+-----------------------+-----------------------
table_1 | sequential_access | not_accessed | not_accessed table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(1 row) (1 row)
SELECT count(*) FROM table_1 WHERE key = 1 OR key = 2; SELECT count(*) FROM table_1 WHERE key = 1 OR key = 2;
@ -149,30 +165,30 @@ BEGIN;
SELECT * FROM relation_acesses WHERE table_name = 'table_1'; SELECT * FROM relation_acesses WHERE table_name = 'table_1';
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-----------------+--------------+-------------- ------------+-----------------+-----------------------+-----------------------
table_1 | parallel_access | not_accessed | not_accessed table_1 | parallel_access | not_parallel_accessed | not_parallel_accessed
(1 row) (1 row)
INSERT INTO table_1 VALUES (1,1); INSERT INTO table_1 VALUES (1,1);
SELECT * FROM relation_acesses WHERE table_name = 'table_1'; SELECT * FROM relation_acesses WHERE table_name = 'table_1';
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-----------------+-------------------+-------------- ------------+-----------------+-----------------------+-----------------------
table_1 | parallel_access | sequential_access | not_accessed table_1 | parallel_access | not_parallel_accessed | not_parallel_accessed
(1 row) (1 row)
INSERT INTO table_1 VALUES (1,1), (2,2); INSERT INTO table_1 VALUES (1,1), (2,2);
SELECT * FROM relation_acesses WHERE table_name = 'table_1'; SELECT * FROM relation_acesses WHERE table_name = 'table_1';
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-----------------+-------------------+-------------- ------------+-----------------+-----------------------+-----------------------
table_1 | parallel_access | sequential_access | not_accessed table_1 | parallel_access | not_parallel_accessed | not_parallel_accessed
(1 row) (1 row)
ALTER TABLE table_1 ADD COLUMN test_col INT; ALTER TABLE table_1 ADD COLUMN test_col INT;
-- now see that the other tables are not accessed at all -- now see that the other tables are not accessed at all
SELECT * FROM relation_acesses WHERE table_name = 'table_1'; SELECT * FROM relation_acesses WHERE table_name = 'table_1';
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-----------------+-------------------+----------------- ------------+-----------------+-----------------------+-----------------
table_1 | parallel_access | sequential_access | parallel_access table_1 | parallel_access | not_parallel_accessed | parallel_access
(1 row) (1 row)
ROLLBACK; ROLLBACK;
@ -187,8 +203,8 @@ BEGIN;
SELECT * FROM relation_acesses WHERE table_name = 'table_1'; SELECT * FROM relation_acesses WHERE table_name = 'table_1';
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-------------------+--------------+-------------- ------------+-----------------------+-----------------------+-----------------------
table_1 | sequential_access | not_accessed | not_accessed table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(1 row) (1 row)
SELECT count(*) FROM table_1 WHERE key = 2; SELECT count(*) FROM table_1 WHERE key = 2;
@ -199,22 +215,22 @@ BEGIN;
SELECT * FROM relation_acesses WHERE table_name = 'table_1'; SELECT * FROM relation_acesses WHERE table_name = 'table_1';
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-------------------+--------------+-------------- ------------+-----------------------+-----------------------+-----------------------
table_1 | sequential_access | not_accessed | not_accessed table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(1 row) (1 row)
INSERT INTO table_1 VALUES (1,1); INSERT INTO table_1 VALUES (1,1);
SELECT * FROM relation_acesses WHERE table_name = 'table_1'; SELECT * FROM relation_acesses WHERE table_name = 'table_1';
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-------------------+-------------------+-------------- ------------+-----------------------+-----------------------+-----------------------
table_1 | sequential_access | sequential_access | not_accessed table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(1 row) (1 row)
INSERT INTO table_1 VALUES (2,2); INSERT INTO table_1 VALUES (2,2);
SELECT * FROM relation_acesses WHERE table_name = 'table_1'; SELECT * FROM relation_acesses WHERE table_name = 'table_1';
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-------------------+-------------------+-------------- ------------+-----------------------+-----------------------+-----------------------
table_1 | sequential_access | sequential_access | not_accessed table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(1 row) (1 row)
ROLLBACK; ROLLBACK;
@ -223,8 +239,8 @@ BEGIN;
ALTER TABLE table_1 ADD CONSTRAINT table_1_u UNIQUE (key); ALTER TABLE table_1 ADD CONSTRAINT table_1_u UNIQUE (key);
SELECT * FROM relation_acesses WHERE table_name = 'table_1'; SELECT * FROM relation_acesses WHERE table_name = 'table_1';
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+---------------+--------------+----------------- ------------+-----------------------+-----------------------+-----------------
table_1 | not_accessed | not_accessed | parallel_access table_1 | not_parallel_accessed | not_parallel_accessed | parallel_access
(1 row) (1 row)
ROLLBACK; ROLLBACK;
@ -245,14 +261,14 @@ BEGIN;
SELECT * FROM relation_acesses WHERE table_name LIKE 'table_%' ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name LIKE 'table_%' ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-------------------+--------------+-------------- ------------+-----------------------+-----------------------+-----------------------
table_1 | sequential_access | not_accessed | not_accessed table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
table_2 | sequential_access | not_accessed | not_accessed table_2 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
table_3 | sequential_access | not_accessed | not_accessed table_3 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
table_4 | sequential_access | not_accessed | not_accessed table_4 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
table_5 | sequential_access | not_accessed | not_accessed table_5 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
table_6 | not_accessed | not_accessed | not_accessed table_6 | not_accessed | not_accessed | not_accessed
table_7 | not_accessed | not_accessed | not_accessed table_7 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(7 rows) (7 rows)
ROLLBACK; ROLLBACK;
@ -271,9 +287,9 @@ BEGIN;
SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-----------------+--------------+-------------- ------------+-----------------+-----------------------+-----------------------
table_1 | parallel_access | not_accessed | not_accessed table_1 | parallel_access | not_parallel_accessed | not_parallel_accessed
table_2 | parallel_access | not_accessed | not_accessed table_2 | parallel_access | not_parallel_accessed | not_parallel_accessed
(2 rows) (2 rows)
ROLLBACK; ROLLBACK;
@ -294,9 +310,9 @@ BEGIN;
SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-------------------+--------------+-------------- ------------+-----------------------+-----------------------+-----------------------
table_1 | sequential_access | not_accessed | not_accessed table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
table_2 | sequential_access | not_accessed | not_accessed table_2 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(2 rows) (2 rows)
ROLLBACK; ROLLBACK;
@ -321,14 +337,14 @@ BEGIN;
SELECT * FROM relation_acesses WHERE table_name LIKE 'table_%' ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name LIKE 'table_%' ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-----------------+--------------+-------------- ------------+-----------------------+-----------------------+-----------------------
table_1 | parallel_access | not_accessed | not_accessed table_1 | parallel_access | not_parallel_accessed | not_parallel_accessed
table_2 | parallel_access | not_accessed | not_accessed table_2 | parallel_access | not_parallel_accessed | not_parallel_accessed
table_3 | parallel_access | not_accessed | not_accessed table_3 | parallel_access | not_parallel_accessed | not_parallel_accessed
table_4 | parallel_access | not_accessed | not_accessed table_4 | parallel_access | not_parallel_accessed | not_parallel_accessed
table_5 | parallel_access | not_accessed | not_accessed table_5 | parallel_access | not_parallel_accessed | not_parallel_accessed
table_6 | not_accessed | not_accessed | not_accessed table_6 | not_accessed | not_accessed | not_accessed
table_7 | not_accessed | not_accessed | not_accessed table_7 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(7 rows) (7 rows)
ROLLBACK; ROLLBACK;
@ -339,17 +355,17 @@ BEGIN;
UPDATE table_1 SET value = 15; UPDATE table_1 SET value = 15;
SELECT * FROM relation_acesses WHERE table_name = 'table_1'; SELECT * FROM relation_acesses WHERE table_name = 'table_1';
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-----------------+-----------------+-------------- ------------+-----------------+-----------------+-----------------------
table_1 | parallel_access | parallel_access | not_accessed table_1 | parallel_access | parallel_access | not_parallel_accessed
(1 row) (1 row)
SET LOCAL citus.multi_shard_modify_mode = 'sequential'; SET LOCAL citus.multi_shard_modify_mode = 'sequential';
UPDATE table_2 SET value = 15; UPDATE table_2 SET value = 15;
SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-------------------+-------------------+-------------- ------------+-----------------------+-----------------------+-----------------------
table_1 | parallel_access | parallel_access | not_accessed table_1 | parallel_access | parallel_access | not_parallel_accessed
table_2 | sequential_access | sequential_access | not_accessed table_2 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(2 rows) (2 rows)
ROLLBACK; ROLLBACK;
@ -360,10 +376,10 @@ BEGIN;
WHERE key IN (SELECT key FROM table_2 JOIN table_3 USING (key) WHERE table_2.value = 15); WHERE key IN (SELECT key FROM table_2 JOIN table_3 USING (key) WHERE table_2.value = 15);
SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2', 'table_3') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2', 'table_3') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-----------------+-----------------+-------------- ------------+-----------------+-----------------------+-----------------------
table_1 | parallel_access | parallel_access | not_accessed table_1 | parallel_access | parallel_access | not_parallel_accessed
table_2 | parallel_access | not_accessed | not_accessed table_2 | parallel_access | not_parallel_accessed | not_parallel_accessed
table_3 | parallel_access | not_accessed | not_accessed table_3 | parallel_access | not_parallel_accessed | not_parallel_accessed
(3 rows) (3 rows)
ROLLBACK; ROLLBACK;
@ -372,9 +388,9 @@ BEGIN;
INSERT INTO table_2 SELECT * FROM table_1; INSERT INTO table_2 SELECT * FROM table_1;
SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-----------------+-----------------+-------------- ------------+-----------------------+-----------------------+-----------------------
table_1 | parallel_access | not_accessed | not_accessed table_1 | parallel_access | not_parallel_accessed | not_parallel_accessed
table_2 | not_accessed | parallel_access | not_accessed table_2 | not_parallel_accessed | parallel_access | not_parallel_accessed
(2 rows) (2 rows)
ROLLBACK; ROLLBACK;
@ -384,9 +400,9 @@ BEGIN;
INSERT INTO table_2 SELECT * FROM table_1; INSERT INTO table_2 SELECT * FROM table_1;
SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-------------------+-------------------+-------------- ------------+-----------------------+-----------------------+-----------------------
table_1 | sequential_access | not_accessed | not_accessed table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
table_2 | not_accessed | sequential_access | not_accessed table_2 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(2 rows) (2 rows)
ROLLBACK; ROLLBACK;
@ -395,9 +411,9 @@ BEGIN;
INSERT INTO table_2 SELECT * FROM table_1 OFFSET 0; INSERT INTO table_2 SELECT * FROM table_1 OFFSET 0;
SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-----------------+-----------------+-------------- ------------+-----------------------+-----------------------+-----------------------
table_1 | parallel_access | not_accessed | not_accessed table_1 | parallel_access | not_parallel_accessed | not_parallel_accessed
table_2 | not_accessed | parallel_access | not_accessed table_2 | not_parallel_accessed | parallel_access | not_parallel_accessed
(2 rows) (2 rows)
ROLLBACK; ROLLBACK;
@ -423,9 +439,9 @@ BEGIN;
SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-----------------+--------------+-------------- ------------+-----------------+-----------------------+-----------------------
table_1 | parallel_access | not_accessed | not_accessed table_1 | parallel_access | not_parallel_accessed | not_parallel_accessed
table_2 | parallel_access | not_accessed | not_accessed table_2 | parallel_access | not_parallel_accessed | not_parallel_accessed
(2 rows) (2 rows)
ROLLBACK; ROLLBACK;
@ -446,10 +462,10 @@ BEGIN;
) as foo; ) as foo;
SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2', 'table_3') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2', 'table_3') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-----------------+-----------------+-------------- ------------+-----------------------+-----------------------+-----------------------
table_1 | parallel_access | not_accessed | not_accessed table_1 | parallel_access | not_parallel_accessed | not_parallel_accessed
table_2 | parallel_access | not_accessed | not_accessed table_2 | parallel_access | not_parallel_accessed | not_parallel_accessed
table_3 | not_accessed | parallel_access | not_accessed table_3 | not_parallel_accessed | parallel_access | not_parallel_accessed
(3 rows) (3 rows)
ROLLBACK; ROLLBACK;
@ -472,10 +488,10 @@ BEGIN;
) as foo; ) as foo;
SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2', 'table_3') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2', 'table_3') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-------------------+-------------------+-------------- ------------+-----------------------+-----------------------+-----------------------
table_1 | sequential_access | not_accessed | not_accessed table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
table_2 | sequential_access | not_accessed | not_accessed table_2 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
table_3 | not_accessed | sequential_access | not_accessed table_3 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(3 rows) (3 rows)
ROLLBACK; ROLLBACK;
@ -498,11 +514,11 @@ BEGIN;
) AND value IN (SELECT key FROM table_4); ) AND value IN (SELECT key FROM table_4);
SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2', 'table_3', 'table_4') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2', 'table_3', 'table_4') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-----------------+-----------------+-------------- ------------+-----------------+-----------------------+-----------------------
table_1 | parallel_access | not_accessed | not_accessed table_1 | parallel_access | not_parallel_accessed | not_parallel_accessed
table_2 | parallel_access | not_accessed | not_accessed table_2 | parallel_access | not_parallel_accessed | not_parallel_accessed
table_3 | parallel_access | parallel_access | not_accessed table_3 | parallel_access | parallel_access | not_parallel_accessed
table_4 | parallel_access | not_accessed | not_accessed table_4 | parallel_access | not_parallel_accessed | not_parallel_accessed
(4 rows) (4 rows)
ROLLBACK; ROLLBACK;
@ -514,8 +530,8 @@ BEGIN;
3 3 3 3
SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-----------------+--------------+-------------- ------------+-----------------+-----------------------+-----------------------
table_1 | parallel_access | not_accessed | not_accessed table_1 | parallel_access | not_parallel_accessed | not_parallel_accessed
(1 row) (1 row)
ROLLBACK; ROLLBACK;
@ -524,8 +540,8 @@ BEGIN;
COPY table_1 FROM STDIN WITH CSV; COPY table_1 FROM STDIN WITH CSV;
SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+---------------+-----------------+-------------- ------------+-----------------------+-----------------+-----------------------
table_1 | not_accessed | parallel_access | not_accessed table_1 | not_parallel_accessed | parallel_access | not_parallel_accessed
(1 row) (1 row)
ROLLBACK; ROLLBACK;
@ -534,8 +550,8 @@ BEGIN;
COPY table_1 FROM STDIN WITH CSV; COPY table_1 FROM STDIN WITH CSV;
SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+---------------+-------------------+-------------- ------------+-----------------------+-----------------------+-----------------------
table_1 | not_accessed | sequential_access | not_accessed table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(1 row) (1 row)
ROLLBACK; ROLLBACK;
@ -549,22 +565,22 @@ BEGIN;
SELECT * FROM relation_acesses WHERE table_name IN ('table_6'); SELECT * FROM relation_acesses WHERE table_name IN ('table_6');
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-------------------+--------------+-------------- ------------+------------------------+--------------+--------------
table_6 | sequential_access | not_accessed | not_accessed table_6 | reference_table_access | not_accessed | not_accessed
(1 row) (1 row)
UPDATE table_6 SET value = 15; UPDATE table_6 SET value = 15;
SELECT * FROM relation_acesses WHERE table_name IN ('table_6'); SELECT * FROM relation_acesses WHERE table_name IN ('table_6');
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-------------------+-------------------+-------------- ------------+------------------------+------------------------+--------------
table_6 | sequential_access | sequential_access | not_accessed table_6 | reference_table_access | reference_table_access | not_accessed
(1 row) (1 row)
ALTER TABLE table_6 ADD COLUMN x INT; ALTER TABLE table_6 ADD COLUMN x INT;
SELECT * FROM relation_acesses WHERE table_name IN ('table_6'); SELECT * FROM relation_acesses WHERE table_name IN ('table_6');
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-------------------+-------------------+------------------- ------------+------------------------+------------------------+------------------------
table_6 | sequential_access | sequential_access | sequential_access table_6 | reference_table_access | reference_table_access | reference_table_access
(1 row) (1 row)
ROLLBACK; ROLLBACK;
@ -578,8 +594,8 @@ BEGIN;
SELECT * FROM relation_acesses WHERE table_name IN ('table_6', 'table_1') ORDER BY 1,2; SELECT * FROM relation_acesses WHERE table_name IN ('table_6', 'table_1') ORDER BY 1,2;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-----------------+--------------+-------------- ------------+-----------------+-----------------------+-----------------------
table_1 | parallel_access | not_accessed | not_accessed table_1 | parallel_access | not_parallel_accessed | not_parallel_accessed
table_6 | parallel_access | not_accessed | not_accessed table_6 | parallel_access | not_accessed | not_accessed
(2 rows) (2 rows)
@ -589,8 +605,8 @@ BEGIN;
TRUNCATE table_1; TRUNCATE table_1;
SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+---------------+--------------+----------------- ------------+-----------------------+-----------------------+-----------------
table_1 | not_accessed | not_accessed | parallel_access table_1 | not_parallel_accessed | not_parallel_accessed | parallel_access
(1 row) (1 row)
ROLLBACK; ROLLBACK;
@ -600,8 +616,8 @@ BEGIN;
TRUNCATE table_1; TRUNCATE table_1;
SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+---------------+--------------+------------------- ------------+-----------------------+-----------------------+-----------------------
table_1 | not_accessed | not_accessed | sequential_access table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(1 row) (1 row)
ROLLBACK; ROLLBACK;
@ -610,8 +626,8 @@ BEGIN;
TRUNCATE table_6; TRUNCATE table_6;
SELECT * FROM relation_acesses WHERE table_name IN ('table_6') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_6') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+---------------+--------------+------------------- ------------+---------------+--------------+------------------------
table_6 | not_accessed | not_accessed | sequential_access table_6 | not_accessed | not_accessed | reference_table_access
(1 row) (1 row)
ROLLBACK; ROLLBACK;
@ -621,9 +637,9 @@ BEGIN;
ALTER TABLE table_2 ADD CONSTRAINT table_2_u FOREIGN KEY (key) REFERENCES table_1(key); ALTER TABLE table_2 ADD CONSTRAINT table_2_u FOREIGN KEY (key) REFERENCES table_1(key);
SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+---------------+--------------+----------------- ------------+-----------------------+-----------------------+-----------------
table_1 | not_accessed | not_accessed | parallel_access table_1 | not_parallel_accessed | not_parallel_accessed | parallel_access
table_2 | not_accessed | not_accessed | parallel_access table_2 | not_parallel_accessed | not_parallel_accessed | parallel_access
(2 rows) (2 rows)
ROLLBACK; ROLLBACK;
@ -634,9 +650,9 @@ BEGIN;
ALTER TABLE table_2 ADD CONSTRAINT table_2_u FOREIGN KEY (key) REFERENCES table_1(key); ALTER TABLE table_2 ADD CONSTRAINT table_2_u FOREIGN KEY (key) REFERENCES table_1(key);
SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+---------------+--------------+------------------- ------------+-----------------------+-----------------------+-----------------------
table_1 | not_accessed | not_accessed | sequential_access table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
table_2 | not_accessed | not_accessed | sequential_access table_2 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(2 rows) (2 rows)
ROLLBACK; ROLLBACK;
@ -652,9 +668,9 @@ BEGIN;
CREATE TABLE partitioning_test_2009 PARTITION OF partitioning_test FOR VALUES FROM ('2009-01-01') TO ('2010-01-01'); CREATE TABLE partitioning_test_2009 PARTITION OF partitioning_test FOR VALUES FROM ('2009-01-01') TO ('2010-01-01');
SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------------------+---------------+--------------+----------------- ------------------------+-----------------------+-----------------------+-----------------
partitioning_test | not_accessed | not_accessed | parallel_access partitioning_test | not_parallel_accessed | not_parallel_accessed | parallel_access
partitioning_test_2009 | not_accessed | not_accessed | parallel_access partitioning_test_2009 | not_parallel_accessed | not_parallel_accessed | parallel_access
(2 rows) (2 rows)
ROLLBACK; ROLLBACK;
@ -664,9 +680,9 @@ BEGIN;
ALTER TABLE partitioning_test ATTACH PARTITION partitioning_test_2009 FOR VALUES FROM ('2009-01-01') TO ('2010-01-01'); ALTER TABLE partitioning_test ATTACH PARTITION partitioning_test_2009 FOR VALUES FROM ('2009-01-01') TO ('2010-01-01');
SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------------------+---------------+--------------+----------------- ------------------------+-----------------------+-----------------------+-----------------
partitioning_test | not_accessed | not_accessed | parallel_access partitioning_test | not_parallel_accessed | not_parallel_accessed | parallel_access
partitioning_test_2009 | not_accessed | not_accessed | parallel_access partitioning_test_2009 | not_parallel_accessed | not_parallel_accessed | parallel_access
(2 rows) (2 rows)
COMMIT; COMMIT;
@ -682,9 +698,9 @@ BEGIN;
ALTER TABLE partitioning_test ATTACH PARTITION partitioning_test_2010 FOR VALUES FROM ('2010-01-01') TO ('2011-01-01'); ALTER TABLE partitioning_test ATTACH PARTITION partitioning_test_2010 FOR VALUES FROM ('2010-01-01') TO ('2011-01-01');
SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2010') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2010') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------------------+---------------+--------------+----------------- ------------------------+-----------------------+-----------------------+-----------------
partitioning_test | not_accessed | not_accessed | parallel_access partitioning_test | not_parallel_accessed | not_parallel_accessed | parallel_access
partitioning_test_2010 | not_accessed | not_accessed | parallel_access partitioning_test_2010 | not_parallel_accessed | not_parallel_accessed | parallel_access
(2 rows) (2 rows)
COMMIT; COMMIT;
@ -698,10 +714,10 @@ BEGIN;
SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------------------+-----------------+--------------+-------------- ------------------------+-----------------+-----------------------+-----------------------
partitioning_test | parallel_access | not_accessed | not_accessed partitioning_test | parallel_access | not_parallel_accessed | not_parallel_accessed
partitioning_test_2009 | parallel_access | not_accessed | not_accessed partitioning_test_2009 | parallel_access | not_parallel_accessed | not_parallel_accessed
partitioning_test_2010 | parallel_access | not_accessed | not_accessed partitioning_test_2010 | parallel_access | not_parallel_accessed | not_parallel_accessed
(3 rows) (3 rows)
COMMIT; COMMIT;
@ -716,10 +732,10 @@ BEGIN;
SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------------------+-------------------+--------------+-------------- ------------------------+-----------------------+-----------------------+-----------------------
partitioning_test | sequential_access | not_accessed | not_accessed partitioning_test | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
partitioning_test_2009 | sequential_access | not_accessed | not_accessed partitioning_test_2009 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
partitioning_test_2010 | sequential_access | not_accessed | not_accessed partitioning_test_2010 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(3 rows) (3 rows)
COMMIT; COMMIT;
@ -728,10 +744,10 @@ BEGIN;
UPDATE partitioning_test SET time = now(); UPDATE partitioning_test SET time = now();
SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------------------+-----------------+-----------------+-------------- ------------------------+-----------------+-----------------+-----------------------
partitioning_test | parallel_access | parallel_access | not_accessed partitioning_test | parallel_access | parallel_access | not_parallel_accessed
partitioning_test_2009 | parallel_access | parallel_access | not_accessed partitioning_test_2009 | parallel_access | parallel_access | not_parallel_accessed
partitioning_test_2010 | parallel_access | parallel_access | not_accessed partitioning_test_2010 | parallel_access | parallel_access | not_parallel_accessed
(3 rows) (3 rows)
COMMIT; COMMIT;
@ -741,10 +757,10 @@ BEGIN;
UPDATE partitioning_test SET time = now(); UPDATE partitioning_test SET time = now();
SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------------------+-------------------+-------------------+-------------- ------------------------+-----------------------+-----------------------+-----------------------
partitioning_test | sequential_access | sequential_access | not_accessed partitioning_test | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
partitioning_test_2009 | sequential_access | sequential_access | not_accessed partitioning_test_2009 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
partitioning_test_2010 | sequential_access | sequential_access | not_accessed partitioning_test_2010 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(3 rows) (3 rows)
COMMIT; COMMIT;
@ -753,10 +769,10 @@ BEGIN;
ALTER TABLE partitioning_test ADD COLUMN X INT; ALTER TABLE partitioning_test ADD COLUMN X INT;
SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------------------+---------------+--------------+----------------- ------------------------+-----------------------+-----------------------+-----------------
partitioning_test | not_accessed | not_accessed | parallel_access partitioning_test | not_parallel_accessed | not_parallel_accessed | parallel_access
partitioning_test_2009 | not_accessed | not_accessed | parallel_access partitioning_test_2009 | not_parallel_accessed | not_parallel_accessed | parallel_access
partitioning_test_2010 | not_accessed | not_accessed | parallel_access partitioning_test_2010 | not_parallel_accessed | not_parallel_accessed | parallel_access
(3 rows) (3 rows)
ROLLBACK; ROLLBACK;
@ -766,10 +782,10 @@ BEGIN;
ALTER TABLE partitioning_test ADD COLUMN X INT; ALTER TABLE partitioning_test ADD COLUMN X INT;
SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------------------+---------------+--------------+------------------- ------------------------+-----------------------+-----------------------+-----------------------
partitioning_test | not_accessed | not_accessed | sequential_access partitioning_test | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
partitioning_test_2009 | not_accessed | not_accessed | sequential_access partitioning_test_2009 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
partitioning_test_2010 | not_accessed | not_accessed | sequential_access partitioning_test_2010 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(3 rows) (3 rows)
ROLLBACK; ROLLBACK;
@ -783,10 +799,10 @@ BEGIN;
SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------------------+-----------------+--------------+-------------- ------------------------+-----------------------+-----------------------+-----------------------
partitioning_test | parallel_access | not_accessed | not_accessed partitioning_test | parallel_access | not_parallel_accessed | not_parallel_accessed
partitioning_test_2009 | parallel_access | not_accessed | not_accessed partitioning_test_2009 | parallel_access | not_parallel_accessed | not_parallel_accessed
partitioning_test_2010 | not_accessed | not_accessed | not_accessed partitioning_test_2010 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(3 rows) (3 rows)
COMMIT; COMMIT;
@ -801,10 +817,10 @@ BEGIN;
SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------------------+-------------------+--------------+-------------- ------------------------+-----------------------+-----------------------+-----------------------
partitioning_test | sequential_access | not_accessed | not_accessed partitioning_test | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
partitioning_test_2009 | sequential_access | not_accessed | not_accessed partitioning_test_2009 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
partitioning_test_2010 | not_accessed | not_accessed | not_accessed partitioning_test_2010 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(3 rows) (3 rows)
COMMIT; COMMIT;
@ -813,10 +829,10 @@ BEGIN;
UPDATE partitioning_test_2009 SET time = now(); UPDATE partitioning_test_2009 SET time = now();
SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------------------+-----------------+-----------------+-------------- ------------------------+-----------------------+-----------------------+-----------------------
partitioning_test | parallel_access | parallel_access | not_accessed partitioning_test | parallel_access | parallel_access | not_parallel_accessed
partitioning_test_2009 | parallel_access | parallel_access | not_accessed partitioning_test_2009 | parallel_access | parallel_access | not_parallel_accessed
partitioning_test_2010 | not_accessed | not_accessed | not_accessed partitioning_test_2010 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(3 rows) (3 rows)
COMMIT; COMMIT;
@ -826,10 +842,10 @@ BEGIN;
UPDATE partitioning_test_2009 SET time = now(); UPDATE partitioning_test_2009 SET time = now();
SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------------------+-------------------+-------------------+-------------- ------------------------+-----------------------+-----------------------+-----------------------
partitioning_test | sequential_access | sequential_access | not_accessed partitioning_test | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
partitioning_test_2009 | sequential_access | sequential_access | not_accessed partitioning_test_2009 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
partitioning_test_2010 | not_accessed | not_accessed | not_accessed partitioning_test_2010 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(3 rows) (3 rows)
COMMIT; COMMIT;
@ -838,10 +854,10 @@ BEGIN;
CREATE INDEX i1000000 ON partitioning_test_2009 (id); CREATE INDEX i1000000 ON partitioning_test_2009 (id);
SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------------------+---------------+--------------+----------------- ------------------------+-----------------------+-----------------------+-----------------------
partitioning_test | not_accessed | not_accessed | parallel_access partitioning_test | not_parallel_accessed | not_parallel_accessed | parallel_access
partitioning_test_2009 | not_accessed | not_accessed | parallel_access partitioning_test_2009 | not_parallel_accessed | not_parallel_accessed | parallel_access
partitioning_test_2010 | not_accessed | not_accessed | not_accessed partitioning_test_2010 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(3 rows) (3 rows)
ROLLBACK; ROLLBACK;
@ -851,10 +867,10 @@ BEGIN;
CREATE INDEX i1000000 ON partitioning_test_2009 (id); CREATE INDEX i1000000 ON partitioning_test_2009 (id);
SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------------------+---------------+--------------+------------------- ------------------------+-----------------------+-----------------------+-----------------------
partitioning_test | not_accessed | not_accessed | sequential_access partitioning_test | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
partitioning_test_2009 | not_accessed | not_accessed | sequential_access partitioning_test_2009 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
partitioning_test_2010 | not_accessed | not_accessed | not_accessed partitioning_test_2010 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(3 rows) (3 rows)
ROLLBACK; ROLLBACK;
@ -865,9 +881,9 @@ BEGIN;
NOTICE: truncate cascades to table "table_2" NOTICE: truncate cascades to table "table_2"
SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+---------------+--------------+----------------- ------------+-----------------------+-----------------------+-----------------
table_1 | not_accessed | not_accessed | parallel_access table_1 | not_parallel_accessed | not_parallel_accessed | parallel_access
table_2 | not_accessed | not_accessed | parallel_access table_2 | not_parallel_accessed | not_parallel_accessed | parallel_access
(2 rows) (2 rows)
ROLLBACK; ROLLBACK;
@ -883,8 +899,8 @@ BEGIN;
SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-----------------+--------------+-------------- ------------+-----------------+-----------------------+-----------------------
table_1 | parallel_access | not_accessed | not_accessed table_1 | parallel_access | not_parallel_accessed | not_parallel_accessed
(1 row) (1 row)
COMMIT; COMMIT;
@ -900,8 +916,8 @@ BEGIN;
SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-------------------+--------------+-------------- ------------+-----------------------+-----------------------+-----------------------
table_1 | sequential_access | not_accessed | not_accessed table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(1 row) (1 row)
COMMIT; COMMIT;
@ -919,8 +935,8 @@ BEGIN;
SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+---------------+-------------------+-------------- ------------+-----------------------+-----------------------+-----------------------
table_1 | not_accessed | sequential_access | not_accessed table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(1 row) (1 row)
ROLLBACK; ROLLBACK;
@ -936,8 +952,8 @@ BEGIN;
SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-----------------+-----------------+-------------- ------------+-----------------+-----------------+-----------------------
table_1 | parallel_access | parallel_access | not_accessed table_1 | parallel_access | parallel_access | not_parallel_accessed
(1 row) (1 row)
ROLLBACK; ROLLBACK;
@ -953,8 +969,8 @@ BEGIN;
SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+-----------------+-----------------+-------------- ------------+-----------------+-----------------+-----------------------
table_1 | parallel_access | parallel_access | not_accessed table_1 | parallel_access | parallel_access | not_parallel_accessed
(1 row) (1 row)
ROLLBACK; ROLLBACK;
@ -973,18 +989,19 @@ NOTICE: Copying data from local table...
SELECT * FROM relation_acesses WHERE table_name IN ('table_3') ORDER BY 1; SELECT * FROM relation_acesses WHERE table_name IN ('table_3') ORDER BY 1;
table_name | select_access | dml_access | ddl_access table_name | select_access | dml_access | ddl_access
------------+---------------+-----------------+----------------- ------------+-----------------------+-----------------+-----------------
table_3 | not_accessed | parallel_access | parallel_access table_3 | not_parallel_accessed | parallel_access | parallel_access
(1 row) (1 row)
COMMIT; COMMIT;
SET search_path TO 'public'; SET search_path TO 'public';
DROP SCHEMA access_tracking CASCADE; DROP SCHEMA access_tracking CASCADE;
NOTICE: drop cascades to 13 other objects NOTICE: drop cascades to 14 other objects
DETAIL: drop cascades to function access_tracking.relation_select_access_mode(oid) DETAIL: drop cascades to function access_tracking.relation_select_access_mode(oid)
drop cascades to function access_tracking.relation_dml_access_mode(oid) drop cascades to function access_tracking.relation_dml_access_mode(oid)
drop cascades to function access_tracking.relation_ddl_access_mode(oid) drop cascades to function access_tracking.relation_ddl_access_mode(oid)
drop cascades to function access_tracking.relation_access_mode_to_text(integer) drop cascades to function access_tracking.distributed_relation(text)
drop cascades to function access_tracking.relation_access_mode_to_text(text,integer)
drop cascades to view access_tracking.relation_acesses drop cascades to view access_tracking.relation_acesses
drop cascades to table access_tracking.table_1 drop cascades to table access_tracking.table_1
drop cascades to table access_tracking.table_2 drop cascades to table access_tracking.table_2

View File

@ -23,15 +23,32 @@ CREATE OR REPLACE FUNCTION relation_ddl_access_mode(relationId Oid)
LANGUAGE C STABLE STRICT LANGUAGE C STABLE STRICT
AS 'citus', $$relation_ddl_access_mode$$; AS 'citus', $$relation_ddl_access_mode$$;
CREATE OR REPLACE FUNCTION distributed_relation(relation_name text)
RETURNS bool AS
$$
DECLARE
part_method char;
BEGIN
select partmethod INTO part_method from pg_dist_partition WHERE logicalrelid = relation_name::regclass;
IF part_method = 'h' THEN
RETURN true;
ELSE
RETURN false;
END IF;
END;
$$ LANGUAGE 'plpgsql' IMMUTABLE;
CREATE OR REPLACE FUNCTION relation_access_mode_to_text(relationShardAccess int)
CREATE OR REPLACE FUNCTION relation_access_mode_to_text(relation_name text, relationShardAccess int)
RETURNS text AS RETURNS text AS
$$ $$
BEGIN BEGIN
IF relationShardAccess = 0 THEN IF relationShardAccess = 0 and distributed_relation(relation_name) THEN
RETURN 'not_parallel_accessed';
ELSIF relationShardAccess = 0 and NOT distributed_relation(relation_name) THEN
RETURN 'not_accessed'; RETURN 'not_accessed';
ELSIF relationShardAccess = 1 THEN ELSIF relationShardAccess = 1 THEN
RETURN 'sequential_access'; RETURN 'reference_table_access';
ELSE ELSE
RETURN 'parallel_access'; RETURN 'parallel_access';
END IF; END IF;
@ -42,9 +59,9 @@ $$ LANGUAGE 'plpgsql' IMMUTABLE;
CREATE VIEW relation_acesses AS CREATE VIEW relation_acesses AS
SELECT table_name, SELECT table_name,
relation_access_mode_to_text(relation_select_access_mode(table_name::regclass)) as select_access, relation_access_mode_to_text(table_name, relation_select_access_mode(table_name::regclass)) as select_access,
relation_access_mode_to_text(relation_dml_access_mode(table_name::regclass)) as dml_access, relation_access_mode_to_text(table_name, relation_dml_access_mode(table_name::regclass)) as dml_access,
relation_access_mode_to_text(relation_ddl_access_mode(table_name::regclass)) as ddl_access relation_access_mode_to_text(table_name, relation_ddl_access_mode(table_name::regclass)) as ddl_access
FROM FROM
((SELECT 'table_' || i as table_name FROM generate_series(1, 7) i) UNION (SELECT 'partitioning_test') UNION (SELECT 'partitioning_test_2009') UNION (SELECT 'partitioning_test_2010')) tables; ((SELECT 'table_' || i as table_name FROM generate_series(1, 7) i) UNION (SELECT 'partitioning_test') UNION (SELECT 'partitioning_test_2009') UNION (SELECT 'partitioning_test_2010')) tables;