3. 検証結果
3.3 SQL 文の実行
3.3.4 実行できない DML
Citusにより作成されたテーブルに対しては基本的に全SQLが実行できますが、いくつ
か例外があります。
□ TABLESAMPLE句
分散テーブルに対してはTABLESAMPLE 句が使用できません。参照テーブルには実行 可能です。
例 52 TABLESAMPLE句
postgres=> TRUNCATE TABLE dist2 ; TRUNCATE TABLE
LOG: statement: TRUNCATE TABLE public.dist2_102111 CASCADE
postgres=> ANALYZE dist1 ; ANALYZE
LOG: statement: ANALYZE public.dist1_102081
postgres=> SELECT * FROM dist1 TABLESAMPLE SYSTEM(1) ;
ERROR: could not run distributed query which use TABLESAMPLE
HINT: Consider using an equality filter on the distributed table's partition column.
© 2018 Hewlett-Packard Enterprise Japan Co, Ltd. 36
□ 再帰CTE
WITH RECURSIVE句は分散テーブルでは使用できません。参照テーブルに対しては
実行できます。
例 53 WITH RECURSIVE句
□ SELECT … FOR UPDATE
分散テーブルと参照テーブルに対してはSELECT FOR UPDATE文が使用できません。
例 54 SELECT FOR UPDATE文
ただし以下の条件がすべて合致している場合にはSELECT FOR UPDATE文を実行でき ます。
分散テーブルをパーティション・テーブルとして作成
分散キーとパーティション化列が一致
分散キーに対する等価検索(WHERE 分散キー=値)
□ ローカル・テーブルとの結合
コーディネータ・ノードに作成されたローカル・テーブルと、分散テーブルは結合でき ません。
postgres=> SELECT * FROM dist1 WHERE c1 = 100 FOR UPDATE ;
ERROR: could not run distributed query with FOR UPDATE/SHARE commands
HINT: Consider using an equality filter on the distributed table's partition column.
postgres=> WITH RECURSIVE r AS (
SELECT * FROM dist1 WHERE c1 = 1 UNION ALL
SELECT dist1.* FROM dist1, r WHERE dist1.c1 = r.c1 )
SELECT * FROM r ORDER BY c1 ;
ERROR: recursive CTEs are not supported in distributed queries
© 2018 Hewlett-Packard Enterprise Japan Co, Ltd. 37 例 55 ローカル・テーブルと分散テーブルの結合
ただしローカル・テーブルをサブクエリー化することで実行できるようになります。
例 56 ローカル・テーブルと分散テーブルの結合(サブクエリー化)
□ 相関サブクエリー
分散テーブルでは、相関サブクエリーの記述に制限があります。GROUP BY句を伴わ ない集計関数は記述できません。GROUP BY句の記述がある場合でも一部制限がありま す。
例 57 相関サブクエリー
□ GROUPING SETS句
分散テーブルに対してはGROUPING SETS句、CUBE句、ROLLUP句は実行できま せん。参照テーブルには実行可能です。
postgres=> CREATE TABLE local1(c1 INT PRIMARY KEY, c2 VARCHAR(10)) ; CREATE TABLE
postgres=> SELECT d.* FROM dist1 d INNER JOIN local1 l ON d.c1 = l.c1 ; ERROR: relation local1 is not distributed
postgres=> SELECT c1, c2 FROM dist1 d1 WHERE
d1.c1 = (SELECT max(c1) FROM dist1 d2 WHERE d1.c1 = d2.c1) ; ERROR: cannot push down this subquery
DETAIL: Aggregates without group by are currently unsupported when a subquery references a column from another query
postgres=> SELECT d.* FROM dist1 d INNER JOIN (SELECT * FROM local1) l ON d.c1
= l.c1 ;
c1 | c2 | c1 | c2 ---+---+---+--- 31 | data1 | 31 | local1 35 | data1 | 35 | local1
<<以下省略>>
© 2018 Hewlett-Packard Enterprise Japan Co, Ltd. 38 例 58 GROUPING SETS句
□ PARTITION BY句
分散テーブルに対してPARTITION BY句に分散キーを含まないウィンドウ関数は実行 できません。参照テーブルには実行可能です。
例 59 PARTITION BY句
□ INSERT ON CONFLICT文
分散テーブルではINSERT ON CONFLICT文はサポートされていますが、分散キーを 更新することはできません。参照テーブルではこの制限はありません。
例 60 INSERT ON CONFLICT文
postgres=> SELECT c1, c2, SUM(c3) FROM dist1 GROUP BY GROUPING SETS ((c1), (c2), ()) ;
ERROR: could not run distributed query with GROUPING SETS, CUBE, or ROLLUP HINT: Consider using an equality filter on the distributed table's partition column.
postgres=> SELECT c1, RANK() OVER (PARTITION BY c2) FROM dist1 ;
ERROR: could not run distributed query because the window function that is used cannot be pushed down
HINT: Window functions are supported in two ways. Either add an equality filter on the distributed tables' partition column or use the window functions with a PARTITION BY clause containing the distribution column
postgres=> INSERT INTO dist1 VALUES (100, 'conflict') ON CONFLICT ON CONSTRAINT dist1_pkey DO UPDATE SET c2='update' ;
INSERT 0 1
postgres=> INSERT INTO dist1 VALUES (100, 'conflict') ON CONFLICT ON CONSTRAINT dist1_pkey DO UPDATE SET c1=0 ;
ERROR: modifying the partition value of rows is not allowed
© 2018 Hewlett-Packard Enterprise Japan Co, Ltd. 39
□ EXPLAIN ANALYZE文
バグか仕様かは不明ですが、主キー制約が指定された分散テーブルに対してEXPLAIN
ANALYZE文を実行するとエラーが表示されます。実際にはデータは格納されます。
例 61 EXPLAIN ANALYZE文