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->connectionStateHash = CreateConnectionStateHash(TopTransactionContext);
RecordRelationAccessIfReferenceTable(tableId, PLACEMENT_ACCESS_DML);
}

View File

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

View File

@ -82,7 +82,7 @@ static HTAB *RelationAccessHash;
/* functions related to access recording */
static void RecordRelationAccess(Oid relationId, ShardPlacementAccessType accessType);
static void RecordRelationAccessBase(Oid relationId, ShardPlacementAccessType accessType);
static void RecordPlacementAccessToCache(Oid relationId,
ShardPlacementAccessType accessType);
static void RecordRelationParallelSelectAccessForTask(Task *task);
@ -148,25 +148,32 @@ AllocateRelationAccessHash(void)
/*
* AssociatePlacementAccessWithRelation associates the placement access to the
* distributed relation that the placement belongs to.
* RecordRelationAccessIfReferenceTable marks the relation accessed if it is a
* reference relation.
*
* The function is a wrapper around RecordRelationAccessBase().
*/
void
AssociatePlacementAccessWithRelation(ShardPlacement *placement,
ShardPlacementAccessType accessType)
RecordRelationAccessIfReferenceTable(Oid relationId, ShardPlacementAccessType accessType)
{
Oid relationId = InvalidOid;
uint64 shardId = INVALID_SHARD_ID;
if (!ShouldRecordRelationAccess())
{
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.
*
* We implemented this function to prevent accessing placement metadata during
* recursive calls of the function itself (e.g., avoid
* AssociatePlacementAccessWithRelation()).
* RecordRelationAccessBase()).
*/
static void
RecordRelationAccess(Oid relationId, ShardPlacementAccessType accessType)
RecordRelationAccessBase(Oid relationId, ShardPlacementAccessType accessType)
{
/* make sure that this is not a conflicting access */
CheckConflictingRelationAccesses(relationId, accessType);
@ -244,7 +251,7 @@ RecordRelationAccess(Oid relationId, ShardPlacementAccessType accessType)
}
/* recursively call the function to cover multi-level partitioned tables */
RecordRelationAccess(partitionOid, accessType);
RecordRelationAccessBase(partitionOid, accessType);
}
}
else if (PartitionTableNoLock(relationId))
@ -680,7 +687,7 @@ GetRelationAccessMode(Oid relationId, ShardPlacementAccessType accessType)
}
else
{
return RELATION_SEQUENTIAL_ACCESSED;
return RELATION_REFERENCE_ACCESSED;
}
}

View File

@ -23,13 +23,20 @@ struct ShardPlacement;
typedef enum RelationAccessMode
{
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
} RelationAccessMode;
extern void AllocateRelationAccessHash(void);
extern void ResetRelationAccessHash(void);
extern void AssociatePlacementAccessWithRelation(ShardPlacement *placement,
extern void RecordRelationAccessIfReferenceTable(Oid relationId,
ShardPlacementAccessType accessType);
extern void RecordParallelRelationAccessForTaskList(List *taskList);
extern void RecordParallelSelectAccess(Oid relationId);

View File

@ -22,14 +22,30 @@ CREATE OR REPLACE FUNCTION relation_ddl_access_mode(relationId Oid)
RETURNS int
LANGUAGE C STABLE STRICT
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
$$
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';
ELSIF relationShardAccess = 1 THEN
RETURN 'sequential_access';
RETURN 'reference_table_access';
ELSE
RETURN 'parallel_access';
END IF;
@ -37,9 +53,9 @@ END;
$$ LANGUAGE 'plpgsql' IMMUTABLE;
CREATE VIEW relation_acesses AS
SELECT table_name,
relation_access_mode_to_text(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(relation_ddl_access_mode(table_name::regclass)) as ddl_access
relation_access_mode_to_text(table_name, relation_select_access_mode(table_name::regclass)) as select_access,
relation_access_mode_to_text(table_name, relation_dml_access_mode(table_name::regclass)) as dml_access,
relation_access_mode_to_text(table_name, relation_ddl_access_mode(table_name::regclass)) as ddl_access
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;
SET citus.shard_replication_factor TO 1;
@ -101,9 +117,9 @@ BEGIN;
(1 row)
SELECT * FROM relation_acesses WHERE table_name IN ('table_7') ORDER BY 1;
table_name | select_access | dml_access | ddl_access
------------+---------------+--------------+-----------------
table_7 | not_accessed | not_accessed | parallel_access
table_name | select_access | dml_access | ddl_access
------------+-----------------------+-----------------------+-----------------
table_7 | not_parallel_accessed | not_parallel_accessed | parallel_access
(1 row)
COMMIT;
@ -115,18 +131,18 @@ SELECT count(*) FROM table_1;
(1 row)
SELECT * FROM relation_acesses WHERE table_name = 'table_1';
table_name | select_access | dml_access | ddl_access
------------+---------------+--------------+--------------
table_1 | not_accessed | not_accessed | not_accessed
table_name | select_access | dml_access | ddl_access
------------+-----------------------+-----------------------+-----------------------
table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(1 row)
-- a very simple test that first checks sequential
-- and parallel SELECTs,DMLs, and DDLs
BEGIN;
SELECT * FROM relation_acesses WHERE table_name = 'table_1';
table_name | select_access | dml_access | ddl_access
------------+---------------+--------------+--------------
table_1 | not_accessed | not_accessed | not_accessed
table_name | select_access | dml_access | ddl_access
------------+-----------------------+-----------------------+-----------------------
table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(1 row)
SELECT count(*) FROM table_1 WHERE key = 1;
@ -136,9 +152,9 @@ BEGIN;
(1 row)
SELECT * FROM relation_acesses WHERE table_name = 'table_1';
table_name | select_access | dml_access | ddl_access
------------+-------------------+--------------+--------------
table_1 | sequential_access | not_accessed | not_accessed
table_name | select_access | dml_access | ddl_access
------------+-----------------------+-----------------------+-----------------------
table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(1 row)
SELECT count(*) FROM table_1 WHERE key = 1 OR key = 2;
@ -148,31 +164,31 @@ BEGIN;
(1 row)
SELECT * FROM relation_acesses WHERE table_name = 'table_1';
table_name | select_access | dml_access | ddl_access
------------+-----------------+--------------+--------------
table_1 | parallel_access | not_accessed | not_accessed
table_name | select_access | dml_access | ddl_access
------------+-----------------+-----------------------+-----------------------
table_1 | parallel_access | not_parallel_accessed | not_parallel_accessed
(1 row)
INSERT INTO table_1 VALUES (1,1);
SELECT * FROM relation_acesses WHERE table_name = 'table_1';
table_name | select_access | dml_access | ddl_access
------------+-----------------+-------------------+--------------
table_1 | parallel_access | sequential_access | not_accessed
table_name | select_access | dml_access | ddl_access
------------+-----------------+-----------------------+-----------------------
table_1 | parallel_access | not_parallel_accessed | not_parallel_accessed
(1 row)
INSERT INTO table_1 VALUES (1,1), (2,2);
SELECT * FROM relation_acesses WHERE table_name = 'table_1';
table_name | select_access | dml_access | ddl_access
------------+-----------------+-------------------+--------------
table_1 | parallel_access | sequential_access | not_accessed
table_name | select_access | dml_access | ddl_access
------------+-----------------+-----------------------+-----------------------
table_1 | parallel_access | not_parallel_accessed | not_parallel_accessed
(1 row)
ALTER TABLE table_1 ADD COLUMN test_col INT;
-- now see that the other tables are not accessed at all
SELECT * FROM relation_acesses WHERE table_name = 'table_1';
table_name | select_access | dml_access | ddl_access
------------+-----------------+-------------------+-----------------
table_1 | parallel_access | sequential_access | parallel_access
table_name | select_access | dml_access | ddl_access
------------+-----------------+-----------------------+-----------------
table_1 | parallel_access | not_parallel_accessed | parallel_access
(1 row)
ROLLBACK;
@ -186,9 +202,9 @@ BEGIN;
(1 row)
SELECT * FROM relation_acesses WHERE table_name = 'table_1';
table_name | select_access | dml_access | ddl_access
------------+-------------------+--------------+--------------
table_1 | sequential_access | not_accessed | not_accessed
table_name | select_access | dml_access | ddl_access
------------+-----------------------+-----------------------+-----------------------
table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(1 row)
SELECT count(*) FROM table_1 WHERE key = 2;
@ -198,23 +214,23 @@ BEGIN;
(1 row)
SELECT * FROM relation_acesses WHERE table_name = 'table_1';
table_name | select_access | dml_access | ddl_access
------------+-------------------+--------------+--------------
table_1 | sequential_access | not_accessed | not_accessed
table_name | select_access | dml_access | ddl_access
------------+-----------------------+-----------------------+-----------------------
table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(1 row)
INSERT INTO table_1 VALUES (1,1);
SELECT * FROM relation_acesses WHERE table_name = 'table_1';
table_name | select_access | dml_access | ddl_access
------------+-------------------+-------------------+--------------
table_1 | sequential_access | sequential_access | not_accessed
table_name | select_access | dml_access | ddl_access
------------+-----------------------+-----------------------+-----------------------
table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(1 row)
INSERT INTO table_1 VALUES (2,2);
SELECT * FROM relation_acesses WHERE table_name = 'table_1';
table_name | select_access | dml_access | ddl_access
------------+-------------------+-------------------+--------------
table_1 | sequential_access | sequential_access | not_accessed
table_name | select_access | dml_access | ddl_access
------------+-----------------------+-----------------------+-----------------------
table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(1 row)
ROLLBACK;
@ -222,9 +238,9 @@ ROLLBACK;
BEGIN;
ALTER TABLE table_1 ADD CONSTRAINT table_1_u UNIQUE (key);
SELECT * FROM relation_acesses WHERE table_name = 'table_1';
table_name | select_access | dml_access | ddl_access
------------+---------------+--------------+-----------------
table_1 | not_accessed | not_accessed | parallel_access
table_name | select_access | dml_access | ddl_access
------------+-----------------------+-----------------------+-----------------
table_1 | not_parallel_accessed | not_parallel_accessed | parallel_access
(1 row)
ROLLBACK;
@ -244,15 +260,15 @@ BEGIN;
(1 row)
SELECT * FROM relation_acesses WHERE table_name LIKE 'table_%' ORDER BY 1;
table_name | select_access | dml_access | ddl_access
------------+-------------------+--------------+--------------
table_1 | sequential_access | not_accessed | not_accessed
table_2 | sequential_access | not_accessed | not_accessed
table_3 | sequential_access | not_accessed | not_accessed
table_4 | sequential_access | not_accessed | not_accessed
table_5 | sequential_access | not_accessed | not_accessed
table_6 | not_accessed | not_accessed | not_accessed
table_7 | not_accessed | not_accessed | not_accessed
table_name | select_access | dml_access | ddl_access
------------+-----------------------+-----------------------+-----------------------
table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
table_2 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
table_3 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
table_4 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
table_5 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
table_6 | not_accessed | not_accessed | not_accessed
table_7 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(7 rows)
ROLLBACK;
@ -270,10 +286,10 @@ BEGIN;
(1 row)
SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2') ORDER BY 1;
table_name | select_access | dml_access | ddl_access
------------+-----------------+--------------+--------------
table_1 | parallel_access | not_accessed | not_accessed
table_2 | parallel_access | not_accessed | not_accessed
table_name | select_access | dml_access | ddl_access
------------+-----------------+-----------------------+-----------------------
table_1 | parallel_access | not_parallel_accessed | not_parallel_accessed
table_2 | parallel_access | not_parallel_accessed | not_parallel_accessed
(2 rows)
ROLLBACK;
@ -293,10 +309,10 @@ BEGIN;
(1 row)
SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2') ORDER BY 1;
table_name | select_access | dml_access | ddl_access
------------+-------------------+--------------+--------------
table_1 | sequential_access | not_accessed | not_accessed
table_2 | sequential_access | not_accessed | not_accessed
table_name | select_access | dml_access | ddl_access
------------+-----------------------+-----------------------+-----------------------
table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
table_2 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(2 rows)
ROLLBACK;
@ -320,15 +336,15 @@ BEGIN;
(1 row)
SELECT * FROM relation_acesses WHERE table_name LIKE 'table_%' ORDER BY 1;
table_name | select_access | dml_access | ddl_access
------------+-----------------+--------------+--------------
table_1 | parallel_access | not_accessed | not_accessed
table_2 | parallel_access | not_accessed | not_accessed
table_3 | parallel_access | not_accessed | not_accessed
table_4 | parallel_access | not_accessed | not_accessed
table_5 | parallel_access | not_accessed | not_accessed
table_6 | not_accessed | not_accessed | not_accessed
table_7 | not_accessed | not_accessed | not_accessed
table_name | select_access | dml_access | ddl_access
------------+-----------------------+-----------------------+-----------------------
table_1 | parallel_access | not_parallel_accessed | not_parallel_accessed
table_2 | parallel_access | not_parallel_accessed | not_parallel_accessed
table_3 | parallel_access | not_parallel_accessed | not_parallel_accessed
table_4 | parallel_access | not_parallel_accessed | not_parallel_accessed
table_5 | parallel_access | not_parallel_accessed | not_parallel_accessed
table_6 | not_accessed | not_accessed | not_accessed
table_7 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(7 rows)
ROLLBACK;
@ -338,18 +354,18 @@ ROLLBACK;
BEGIN;
UPDATE table_1 SET value = 15;
SELECT * FROM relation_acesses WHERE table_name = 'table_1';
table_name | select_access | dml_access | ddl_access
------------+-----------------+-----------------+--------------
table_1 | parallel_access | parallel_access | not_accessed
table_name | select_access | dml_access | ddl_access
------------+-----------------+-----------------+-----------------------
table_1 | parallel_access | parallel_access | not_parallel_accessed
(1 row)
SET LOCAL citus.multi_shard_modify_mode = 'sequential';
UPDATE table_2 SET value = 15;
SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2') ORDER BY 1;
table_name | select_access | dml_access | ddl_access
------------+-------------------+-------------------+--------------
table_1 | parallel_access | parallel_access | not_accessed
table_2 | sequential_access | sequential_access | not_accessed
table_name | select_access | dml_access | ddl_access
------------+-----------------------+-----------------------+-----------------------
table_1 | parallel_access | parallel_access | not_parallel_accessed
table_2 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(2 rows)
ROLLBACK;
@ -359,11 +375,11 @@ BEGIN;
table_1 SET 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;
table_name | select_access | dml_access | ddl_access
------------+-----------------+-----------------+--------------
table_1 | parallel_access | parallel_access | not_accessed
table_2 | parallel_access | not_accessed | not_accessed
table_3 | parallel_access | not_accessed | not_accessed
table_name | select_access | dml_access | ddl_access
------------+-----------------+-----------------------+-----------------------
table_1 | parallel_access | parallel_access | not_parallel_accessed
table_2 | parallel_access | not_parallel_accessed | not_parallel_accessed
table_3 | parallel_access | not_parallel_accessed | not_parallel_accessed
(3 rows)
ROLLBACK;
@ -371,10 +387,10 @@ ROLLBACK;
BEGIN;
INSERT INTO table_2 SELECT * FROM table_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_1 | parallel_access | not_accessed | not_accessed
table_2 | not_accessed | parallel_access | not_accessed
table_name | select_access | dml_access | ddl_access
------------+-----------------------+-----------------------+-----------------------
table_1 | parallel_access | not_parallel_accessed | not_parallel_accessed
table_2 | not_parallel_accessed | parallel_access | not_parallel_accessed
(2 rows)
ROLLBACK;
@ -383,10 +399,10 @@ BEGIN;
SET LOCAL citus.multi_shard_modify_mode = 'sequential';
INSERT INTO table_2 SELECT * FROM table_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_1 | sequential_access | not_accessed | not_accessed
table_2 | not_accessed | sequential_access | not_accessed
table_name | select_access | dml_access | ddl_access
------------+-----------------------+-----------------------+-----------------------
table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
table_2 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(2 rows)
ROLLBACK;
@ -394,10 +410,10 @@ ROLLBACK;
BEGIN;
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;
table_name | select_access | dml_access | ddl_access
------------+-----------------+-----------------+--------------
table_1 | parallel_access | not_accessed | not_accessed
table_2 | not_accessed | parallel_access | not_accessed
table_name | select_access | dml_access | ddl_access
------------+-----------------------+-----------------------+-----------------------
table_1 | parallel_access | not_parallel_accessed | not_parallel_accessed
table_2 | not_parallel_accessed | parallel_access | not_parallel_accessed
(2 rows)
ROLLBACK;
@ -422,10 +438,10 @@ BEGIN;
(1 row)
SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2') ORDER BY 1;
table_name | select_access | dml_access | ddl_access
------------+-----------------+--------------+--------------
table_1 | parallel_access | not_accessed | not_accessed
table_2 | parallel_access | not_accessed | not_accessed
table_name | select_access | dml_access | ddl_access
------------+-----------------+-----------------------+-----------------------
table_1 | parallel_access | not_parallel_accessed | not_parallel_accessed
table_2 | parallel_access | not_parallel_accessed | not_parallel_accessed
(2 rows)
ROLLBACK;
@ -445,11 +461,11 @@ BEGIN;
OFFSET 0
) as foo;
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_1 | parallel_access | not_accessed | not_accessed
table_2 | parallel_access | not_accessed | not_accessed
table_3 | not_accessed | parallel_access | not_accessed
table_name | select_access | dml_access | ddl_access
------------+-----------------------+-----------------------+-----------------------
table_1 | parallel_access | not_parallel_accessed | not_parallel_accessed
table_2 | parallel_access | not_parallel_accessed | not_parallel_accessed
table_3 | not_parallel_accessed | parallel_access | not_parallel_accessed
(3 rows)
ROLLBACK;
@ -471,11 +487,11 @@ BEGIN;
OFFSET 0
) as foo;
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_1 | sequential_access | not_accessed | not_accessed
table_2 | sequential_access | not_accessed | not_accessed
table_3 | not_accessed | sequential_access | not_accessed
table_name | select_access | dml_access | ddl_access
------------+-----------------------+-----------------------+-----------------------
table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
table_2 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
table_3 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(3 rows)
ROLLBACK;
@ -497,12 +513,12 @@ BEGIN;
) as foo
) 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;
table_name | select_access | dml_access | ddl_access
------------+-----------------+-----------------+--------------
table_1 | parallel_access | not_accessed | not_accessed
table_2 | parallel_access | not_accessed | not_accessed
table_3 | parallel_access | parallel_access | not_accessed
table_4 | parallel_access | not_accessed | not_accessed
table_name | select_access | dml_access | ddl_access
------------+-----------------+-----------------------+-----------------------
table_1 | parallel_access | not_parallel_accessed | not_parallel_accessed
table_2 | parallel_access | not_parallel_accessed | not_parallel_accessed
table_3 | parallel_access | parallel_access | not_parallel_accessed
table_4 | parallel_access | not_parallel_accessed | not_parallel_accessed
(4 rows)
ROLLBACK;
@ -513,9 +529,9 @@ BEGIN;
2 2
3 3
SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1;
table_name | select_access | dml_access | ddl_access
------------+-----------------+--------------+--------------
table_1 | parallel_access | not_accessed | not_accessed
table_name | select_access | dml_access | ddl_access
------------+-----------------+-----------------------+-----------------------
table_1 | parallel_access | not_parallel_accessed | not_parallel_accessed
(1 row)
ROLLBACK;
@ -523,9 +539,9 @@ ROLLBACK;
BEGIN;
COPY table_1 FROM STDIN WITH CSV;
SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1;
table_name | select_access | dml_access | ddl_access
------------+---------------+-----------------+--------------
table_1 | not_accessed | parallel_access | not_accessed
table_name | select_access | dml_access | ddl_access
------------+-----------------------+-----------------+-----------------------
table_1 | not_parallel_accessed | parallel_access | not_parallel_accessed
(1 row)
ROLLBACK;
@ -533,9 +549,9 @@ ROLLBACK;
BEGIN;
COPY table_1 FROM STDIN WITH CSV;
SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1;
table_name | select_access | dml_access | ddl_access
------------+---------------+-------------------+--------------
table_1 | not_accessed | sequential_access | not_accessed
table_name | select_access | dml_access | ddl_access
------------+-----------------------+-----------------------+-----------------------
table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(1 row)
ROLLBACK;
@ -548,23 +564,23 @@ BEGIN;
(1 row)
SELECT * FROM relation_acesses WHERE table_name IN ('table_6');
table_name | select_access | dml_access | ddl_access
------------+-------------------+--------------+--------------
table_6 | sequential_access | not_accessed | not_accessed
table_name | select_access | dml_access | ddl_access
------------+------------------------+--------------+--------------
table_6 | reference_table_access | not_accessed | not_accessed
(1 row)
UPDATE table_6 SET value = 15;
SELECT * FROM relation_acesses WHERE table_name IN ('table_6');
table_name | select_access | dml_access | ddl_access
------------+-------------------+-------------------+--------------
table_6 | sequential_access | sequential_access | not_accessed
table_name | select_access | dml_access | ddl_access
------------+------------------------+------------------------+--------------
table_6 | reference_table_access | reference_table_access | not_accessed
(1 row)
ALTER TABLE table_6 ADD COLUMN x INT;
SELECT * FROM relation_acesses WHERE table_name IN ('table_6');
table_name | select_access | dml_access | ddl_access
------------+-------------------+-------------------+-------------------
table_6 | sequential_access | sequential_access | sequential_access
table_name | select_access | dml_access | ddl_access
------------+------------------------+------------------------+------------------------
table_6 | reference_table_access | reference_table_access | reference_table_access
(1 row)
ROLLBACK;
@ -577,10 +593,10 @@ BEGIN;
(1 row)
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_1 | parallel_access | not_accessed | not_accessed
table_6 | parallel_access | not_accessed | not_accessed
table_name | select_access | dml_access | ddl_access
------------+-----------------+-----------------------+-----------------------
table_1 | parallel_access | not_parallel_accessed | not_parallel_accessed
table_6 | parallel_access | not_accessed | not_accessed
(2 rows)
ROLLBACK;
@ -588,9 +604,9 @@ ROLLBACK;
BEGIN;
TRUNCATE table_1;
SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1;
table_name | select_access | dml_access | ddl_access
------------+---------------+--------------+-----------------
table_1 | not_accessed | not_accessed | parallel_access
table_name | select_access | dml_access | ddl_access
------------+-----------------------+-----------------------+-----------------
table_1 | not_parallel_accessed | not_parallel_accessed | parallel_access
(1 row)
ROLLBACK;
@ -599,9 +615,9 @@ BEGIN;
SET LOCAL citus.multi_shard_modify_mode = 'sequential';
TRUNCATE table_1;
SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1;
table_name | select_access | dml_access | ddl_access
------------+---------------+--------------+-------------------
table_1 | not_accessed | not_accessed | sequential_access
table_name | select_access | dml_access | ddl_access
------------+-----------------------+-----------------------+-----------------------
table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(1 row)
ROLLBACK;
@ -609,9 +625,9 @@ ROLLBACK;
BEGIN;
TRUNCATE table_6;
SELECT * FROM relation_acesses WHERE table_name IN ('table_6') ORDER BY 1;
table_name | select_access | dml_access | ddl_access
------------+---------------+--------------+-------------------
table_6 | not_accessed | not_accessed | sequential_access
table_name | select_access | dml_access | ddl_access
------------+---------------+--------------+------------------------
table_6 | not_accessed | not_accessed | reference_table_access
(1 row)
ROLLBACK;
@ -620,10 +636,10 @@ ALTER TABLE table_1 ADD CONSTRAINT table_1_u UNIQUE (key);
BEGIN;
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;
table_name | select_access | dml_access | ddl_access
------------+---------------+--------------+-----------------
table_1 | not_accessed | not_accessed | parallel_access
table_2 | not_accessed | not_accessed | parallel_access
table_name | select_access | dml_access | ddl_access
------------+-----------------------+-----------------------+-----------------
table_1 | not_parallel_accessed | not_parallel_accessed | parallel_access
table_2 | not_parallel_accessed | not_parallel_accessed | parallel_access
(2 rows)
ROLLBACK;
@ -633,10 +649,10 @@ BEGIN;
SET LOCAL citus.multi_shard_modify_mode = 'sequential';
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;
table_name | select_access | dml_access | ddl_access
------------+---------------+--------------+-------------------
table_1 | not_accessed | not_accessed | sequential_access
table_2 | not_accessed | not_accessed | sequential_access
table_name | select_access | dml_access | ddl_access
------------+-----------------------+-----------------------+-----------------------
table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
table_2 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(2 rows)
ROLLBACK;
@ -651,10 +667,10 @@ SELECT create_distributed_table('partitioning_test', 'id');
BEGIN;
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;
table_name | select_access | dml_access | ddl_access
------------------------+---------------+--------------+-----------------
partitioning_test | not_accessed | not_accessed | parallel_access
partitioning_test_2009 | not_accessed | not_accessed | parallel_access
table_name | select_access | dml_access | ddl_access
------------------------+-----------------------+-----------------------+-----------------
partitioning_test | not_parallel_accessed | not_parallel_accessed | parallel_access
partitioning_test_2009 | not_parallel_accessed | not_parallel_accessed | parallel_access
(2 rows)
ROLLBACK;
@ -663,10 +679,10 @@ CREATE TABLE partitioning_test_2009 AS SELECT * FROM partitioning_test;
BEGIN;
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;
table_name | select_access | dml_access | ddl_access
------------------------+---------------+--------------+-----------------
partitioning_test | not_accessed | not_accessed | parallel_access
partitioning_test_2009 | not_accessed | not_accessed | parallel_access
table_name | select_access | dml_access | ddl_access
------------------------+-----------------------+-----------------------+-----------------
partitioning_test | not_parallel_accessed | not_parallel_accessed | parallel_access
partitioning_test_2009 | not_parallel_accessed | not_parallel_accessed | parallel_access
(2 rows)
COMMIT;
@ -681,10 +697,10 @@ SELECT create_distributed_table('partitioning_test_2010', 'id');
BEGIN;
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;
table_name | select_access | dml_access | ddl_access
------------------------+---------------+--------------+-----------------
partitioning_test | not_accessed | not_accessed | parallel_access
partitioning_test_2010 | not_accessed | not_accessed | parallel_access
table_name | select_access | dml_access | ddl_access
------------------------+-----------------------+-----------------------+-----------------
partitioning_test | not_parallel_accessed | not_parallel_accessed | parallel_access
partitioning_test_2010 | not_parallel_accessed | not_parallel_accessed | parallel_access
(2 rows)
COMMIT;
@ -697,11 +713,11 @@ BEGIN;
(1 row)
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
------------------------+-----------------+--------------+--------------
partitioning_test | parallel_access | not_accessed | not_accessed
partitioning_test_2009 | parallel_access | not_accessed | not_accessed
partitioning_test_2010 | parallel_access | not_accessed | not_accessed
table_name | select_access | dml_access | ddl_access
------------------------+-----------------+-----------------------+-----------------------
partitioning_test | parallel_access | not_parallel_accessed | not_parallel_accessed
partitioning_test_2009 | parallel_access | not_parallel_accessed | not_parallel_accessed
partitioning_test_2010 | parallel_access | not_parallel_accessed | not_parallel_accessed
(3 rows)
COMMIT;
@ -715,11 +731,11 @@ BEGIN;
(1 row)
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
------------------------+-------------------+--------------+--------------
partitioning_test | sequential_access | not_accessed | not_accessed
partitioning_test_2009 | sequential_access | not_accessed | not_accessed
partitioning_test_2010 | sequential_access | not_accessed | not_accessed
table_name | select_access | dml_access | ddl_access
------------------------+-----------------------+-----------------------+-----------------------
partitioning_test | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
partitioning_test_2009 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
partitioning_test_2010 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(3 rows)
COMMIT;
@ -727,11 +743,11 @@ COMMIT;
BEGIN;
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;
table_name | select_access | dml_access | ddl_access
------------------------+-----------------+-----------------+--------------
partitioning_test | parallel_access | parallel_access | not_accessed
partitioning_test_2009 | parallel_access | parallel_access | not_accessed
partitioning_test_2010 | parallel_access | parallel_access | not_accessed
table_name | select_access | dml_access | ddl_access
------------------------+-----------------+-----------------+-----------------------
partitioning_test | parallel_access | parallel_access | not_parallel_accessed
partitioning_test_2009 | parallel_access | parallel_access | not_parallel_accessed
partitioning_test_2010 | parallel_access | parallel_access | not_parallel_accessed
(3 rows)
COMMIT;
@ -740,11 +756,11 @@ BEGIN;
SET LOCAL citus.multi_shard_modify_mode TO 'sequential';
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;
table_name | select_access | dml_access | ddl_access
------------------------+-------------------+-------------------+--------------
partitioning_test | sequential_access | sequential_access | not_accessed
partitioning_test_2009 | sequential_access | sequential_access | not_accessed
partitioning_test_2010 | sequential_access | sequential_access | not_accessed
table_name | select_access | dml_access | ddl_access
------------------------+-----------------------+-----------------------+-----------------------
partitioning_test | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
partitioning_test_2009 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
partitioning_test_2010 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(3 rows)
COMMIT;
@ -752,11 +768,11 @@ COMMIT;
BEGIN;
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;
table_name | select_access | dml_access | ddl_access
------------------------+---------------+--------------+-----------------
partitioning_test | not_accessed | not_accessed | parallel_access
partitioning_test_2009 | not_accessed | not_accessed | parallel_access
partitioning_test_2010 | not_accessed | not_accessed | parallel_access
table_name | select_access | dml_access | ddl_access
------------------------+-----------------------+-----------------------+-----------------
partitioning_test | not_parallel_accessed | not_parallel_accessed | parallel_access
partitioning_test_2009 | not_parallel_accessed | not_parallel_accessed | parallel_access
partitioning_test_2010 | not_parallel_accessed | not_parallel_accessed | parallel_access
(3 rows)
ROLLBACK;
@ -765,11 +781,11 @@ BEGIN;
SET LOCAL citus.multi_shard_modify_mode TO 'sequential';
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;
table_name | select_access | dml_access | ddl_access
------------------------+---------------+--------------+-------------------
partitioning_test | not_accessed | not_accessed | sequential_access
partitioning_test_2009 | not_accessed | not_accessed | sequential_access
partitioning_test_2010 | not_accessed | not_accessed | sequential_access
table_name | select_access | dml_access | ddl_access
------------------------+-----------------------+-----------------------+-----------------------
partitioning_test | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
partitioning_test_2009 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
partitioning_test_2010 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(3 rows)
ROLLBACK;
@ -782,11 +798,11 @@ BEGIN;
(1 row)
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
------------------------+-----------------+--------------+--------------
partitioning_test | parallel_access | not_accessed | not_accessed
partitioning_test_2009 | parallel_access | not_accessed | not_accessed
partitioning_test_2010 | not_accessed | not_accessed | not_accessed
table_name | select_access | dml_access | ddl_access
------------------------+-----------------------+-----------------------+-----------------------
partitioning_test | parallel_access | not_parallel_accessed | not_parallel_accessed
partitioning_test_2009 | parallel_access | not_parallel_accessed | not_parallel_accessed
partitioning_test_2010 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(3 rows)
COMMIT;
@ -800,11 +816,11 @@ BEGIN;
(1 row)
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
------------------------+-------------------+--------------+--------------
partitioning_test | sequential_access | not_accessed | not_accessed
partitioning_test_2009 | sequential_access | not_accessed | not_accessed
partitioning_test_2010 | not_accessed | not_accessed | not_accessed
table_name | select_access | dml_access | ddl_access
------------------------+-----------------------+-----------------------+-----------------------
partitioning_test | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
partitioning_test_2009 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
partitioning_test_2010 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(3 rows)
COMMIT;
@ -812,11 +828,11 @@ COMMIT;
BEGIN;
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;
table_name | select_access | dml_access | ddl_access
------------------------+-----------------+-----------------+--------------
partitioning_test | parallel_access | parallel_access | not_accessed
partitioning_test_2009 | parallel_access | parallel_access | not_accessed
partitioning_test_2010 | not_accessed | not_accessed | not_accessed
table_name | select_access | dml_access | ddl_access
------------------------+-----------------------+-----------------------+-----------------------
partitioning_test | parallel_access | parallel_access | not_parallel_accessed
partitioning_test_2009 | parallel_access | parallel_access | not_parallel_accessed
partitioning_test_2010 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(3 rows)
COMMIT;
@ -825,11 +841,11 @@ BEGIN;
SET LOCAL citus.multi_shard_modify_mode TO 'sequential';
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;
table_name | select_access | dml_access | ddl_access
------------------------+-------------------+-------------------+--------------
partitioning_test | sequential_access | sequential_access | not_accessed
partitioning_test_2009 | sequential_access | sequential_access | not_accessed
partitioning_test_2010 | not_accessed | not_accessed | not_accessed
table_name | select_access | dml_access | ddl_access
------------------------+-----------------------+-----------------------+-----------------------
partitioning_test | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
partitioning_test_2009 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
partitioning_test_2010 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(3 rows)
COMMIT;
@ -837,11 +853,11 @@ COMMIT;
BEGIN;
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;
table_name | select_access | dml_access | ddl_access
------------------------+---------------+--------------+-----------------
partitioning_test | not_accessed | not_accessed | parallel_access
partitioning_test_2009 | not_accessed | not_accessed | parallel_access
partitioning_test_2010 | not_accessed | not_accessed | not_accessed
table_name | select_access | dml_access | ddl_access
------------------------+-----------------------+-----------------------+-----------------------
partitioning_test | not_parallel_accessed | not_parallel_accessed | parallel_access
partitioning_test_2009 | not_parallel_accessed | not_parallel_accessed | parallel_access
partitioning_test_2010 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(3 rows)
ROLLBACK;
@ -850,11 +866,11 @@ BEGIN;
SET LOCAL citus.multi_shard_modify_mode TO 'sequential';
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;
table_name | select_access | dml_access | ddl_access
------------------------+---------------+--------------+-------------------
partitioning_test | not_accessed | not_accessed | sequential_access
partitioning_test_2009 | not_accessed | not_accessed | sequential_access
partitioning_test_2010 | not_accessed | not_accessed | not_accessed
table_name | select_access | dml_access | ddl_access
------------------------+-----------------------+-----------------------+-----------------------
partitioning_test | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
partitioning_test_2009 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
partitioning_test_2010 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(3 rows)
ROLLBACK;
@ -864,10 +880,10 @@ BEGIN;
TRUNCATE table_1 CASCADE;
NOTICE: truncate cascades to table "table_2"
SELECT * FROM relation_acesses WHERE table_name IN ('table_1', 'table_2') ORDER BY 1;
table_name | select_access | dml_access | ddl_access
------------+---------------+--------------+-----------------
table_1 | not_accessed | not_accessed | parallel_access
table_2 | not_accessed | not_accessed | parallel_access
table_name | select_access | dml_access | ddl_access
------------+-----------------------+-----------------------+-----------------
table_1 | not_parallel_accessed | not_parallel_accessed | parallel_access
table_2 | not_parallel_accessed | not_parallel_accessed | parallel_access
(2 rows)
ROLLBACK;
@ -882,9 +898,9 @@ BEGIN;
(1 row)
SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1;
table_name | select_access | dml_access | ddl_access
------------+-----------------+--------------+--------------
table_1 | parallel_access | not_accessed | not_accessed
table_name | select_access | dml_access | ddl_access
------------+-----------------+-----------------------+-----------------------
table_1 | parallel_access | not_parallel_accessed | not_parallel_accessed
(1 row)
COMMIT;
@ -899,9 +915,9 @@ BEGIN;
(1 row)
SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1;
table_name | select_access | dml_access | ddl_access
------------+-------------------+--------------+--------------
table_1 | sequential_access | not_accessed | not_accessed
table_name | select_access | dml_access | ddl_access
------------+-----------------------+-----------------------+-----------------------
table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(1 row)
COMMIT;
@ -918,9 +934,9 @@ BEGIN;
(3 rows)
SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1;
table_name | select_access | dml_access | ddl_access
------------+---------------+-------------------+--------------
table_1 | not_accessed | sequential_access | not_accessed
table_name | select_access | dml_access | ddl_access
------------+-----------------------+-----------------------+-----------------------
table_1 | not_parallel_accessed | not_parallel_accessed | not_parallel_accessed
(1 row)
ROLLBACK;
@ -935,9 +951,9 @@ BEGIN;
(1 row)
SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1;
table_name | select_access | dml_access | ddl_access
------------+-----------------+-----------------+--------------
table_1 | parallel_access | parallel_access | not_accessed
table_name | select_access | dml_access | ddl_access
------------+-----------------+-----------------+-----------------------
table_1 | parallel_access | parallel_access | not_parallel_accessed
(1 row)
ROLLBACK;
@ -952,9 +968,9 @@ BEGIN;
(1 row)
SELECT * FROM relation_acesses WHERE table_name IN ('table_1') ORDER BY 1;
table_name | select_access | dml_access | ddl_access
------------+-----------------+-----------------+--------------
table_1 | parallel_access | parallel_access | not_accessed
table_name | select_access | dml_access | ddl_access
------------+-----------------+-----------------+-----------------------
table_1 | parallel_access | parallel_access | not_parallel_accessed
(1 row)
ROLLBACK;
@ -972,19 +988,20 @@ NOTICE: Copying data from local table...
(1 row)
SELECT * FROM relation_acesses WHERE table_name IN ('table_3') ORDER BY 1;
table_name | select_access | dml_access | ddl_access
------------+---------------+-----------------+-----------------
table_3 | not_accessed | parallel_access | parallel_access
table_name | select_access | dml_access | ddl_access
------------+-----------------------+-----------------+-----------------
table_3 | not_parallel_accessed | parallel_access | parallel_access
(1 row)
COMMIT;
SET search_path TO 'public';
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)
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_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 table access_tracking.table_1
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
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
$$
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';
ELSIF relationShardAccess = 1 THEN
RETURN 'sequential_access';
RETURN 'reference_table_access';
ELSE
RETURN 'parallel_access';
END IF;
@ -42,9 +59,9 @@ $$ LANGUAGE 'plpgsql' IMMUTABLE;
CREATE VIEW relation_acesses AS
SELECT table_name,
relation_access_mode_to_text(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(relation_ddl_access_mode(table_name::regclass)) as ddl_access
relation_access_mode_to_text(table_name, relation_select_access_mode(table_name::regclass)) as select_access,
relation_access_mode_to_text(table_name, relation_dml_access_mode(table_name::regclass)) as dml_access,
relation_access_mode_to_text(table_name, relation_ddl_access_mode(table_name::regclass)) as ddl_access
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;