🔑
BigQuery クエリ性能改善: Primary key カラムを 16 列を超えて設定可能かどうか確認
本記事は、BigQuery の主キーと外部キーにより、クエリの性能改善が得られるかどうか検証してみたの検証の一部になります。
ここでは、Primary key カラムを 16 列を超えて設定可能かどうかを確認します。
データセット・テーブルの準備
-- データセット作成
CREATE SCHEMA IF NOT EXISTS pk_fk_dataset;
-- 通常テーブル作成
CREATE OR REPLACE TABLE pk_fk_dataset.normal1
(
title STRING NOT NULL,
id INTEGER,
language STRING NOT NULL,
wp_namespace INTEGER NOT NULL,
is_redirect BOOLEAN,
revision_id INTEGER,
contributor_ip STRING,
contributor_id INTEGER,
contributor_username STRING,
timestamp INTEGER NOT NULL,
is_minor BOOLEAN,
is_bot BOOLEAN,
reversion_id INTEGER,
comment STRING,
num_characters INTEGER NOT NULL,
extra1 STRING,
extra2 STRING,
) AS (
SELECT
*,
'extra1',
'extra2'
FROM
bigquery-public-data.samples.wikipedia
);
CREATE OR REPLACE TABLE
pk_fk_dataset.normal2
CLONE pk_fk_dataset.normal1;
CREATE OR REPLACE TABLE
pk_fk_dataset.pk1
CLONE pk_fk_dataset.normal1;
CREATE OR REPLACE TABLE
pk_fk_dataset.fk1
CLONE pk_fk_dataset.normal1;
ALTER table pk_fk_dataset.pk1 ADD PRIMARY KEY(title, id, language, wp_namespace,is_redirect, revision_id, contributor_ip, contributor_id, contributor_username, timestamp, is_minor, is_bot, reversion_id, comment, num_characters, extra1, extra2) NOT ENFORCED;
ALTER table pk_fk_dataset.fk1 ADD FOREIGN KEY(title, id, language, wp_namespace,is_redirect, revision_id, contributor_ip, contributor_id, contributor_username, timestamp, is_minor, is_bot, reversion_id, comment, num_characters, extra1, extra2) REFERENCES pk_fk_dataset.pk1(title, id, language, wp_namespace,is_redirect, revision_id, contributor_ip, contributor_id, contributor_username, timestamp, is_minor, is_bot, reversion_id, comment, num_characters, extra1, extra2) NOT ENFORCED;
上記 SQL を実行して Primary key を設定したテーブルを作成しようとしましたが、
以下エラーが発生し、16 列を超える Primary key を設定することはできませんでした。
Invalid value: The primary key has 17 columns. The maximum allowed number of columns is 16. at [41:1]
まとめ
公式ドキュメントTABLE_CONSTRAINTS ビューには、以下のような記載がありますが、17 列以上設定しようとすると、BigQuery でエラーが発生し設定することは出来ませんでした。
主キーと外部キーの値の制約は適用されません。ユーザーは、各制約に値が一致することを確認する必要があります。そうしないと、誤った結果が生じる可能性があります。具体的な内容は以下のとおりです。
- (中略)
- 主キーは 16 列を超えることはできません。
Discussion