• 検索結果がありません。

実行できない DML

ドキュメント内 Citus 7.5検証結果 (ページ 35-39)

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文

ドキュメント内 Citus 7.5検証結果 (ページ 35-39)

関連したドキュメント