🔑

BigQuery クエリ性能改善: Primary key の削除、変更方法

2023/09/29に公開

本記事は、BigQuery の主キーと外部キーにより、クエリの性能改善が得られるかどうか検証してみたの検証の一部になります。

BigQuery テーブルに Primary key を設定する場合、 CREATE TABLE ステートメント、追加する場合は ALTER TABLE ADD PRIMARY KEY ステートメントを使用すれば良いことは、比較的容易にわかります。
ただ、削除と変更方法は少しづらかったので、実際に試して確認してみます。

1. データセット・テーブルの準備

pk_drop_test テーブルを作成します。それぞれ id カラムを PK に設定します。

-- データセット作成
CREATE SCHEMA IF NOT EXISTS pk_fk_dataset;

-- Primary key を設定したテーブルを作成
CREATE OR REPLACE TABLE pk_fk_dataset.pk_drop_test(
  id INT64,
  value INT64,
  PRIMARY KEY(id) NOT ENFORCED
);

2. Primary key 削除

下記 2 つの方法で Primary key を変更できることを確認します。

(それぞれ実施するときはテーブルを初期状態に戻しておきます。)

2.1. ALTER TABLE DROP PRIMARY KEY ステートメントを使用

下記 SQLで、Primary key を削除します。

ALTER TABLE pk_fk_dataset.pk_drop_test DROP PRIMARY KEY;

pk_drop_test テーブルを見ると、PK が削除されていることを確認できました。

2.2. ALTER TABLE DROP CONSTRAINT ステートメントを使用

下記 SQL で、pk_drop_test テーブルに設定された PK の制約名を確認します。

SELECT *
FROM pk_fk_dataset.INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE table_name = 'pk_drop_test';

constraint_nameから、制約名が pk_drop_test.pk$ (または、pk$) であることが確認できました。

次に、下記 SQLでこの制約を削除します。

ALTER TABLE pk_fk_dataset.pk_drop_test DROP CONSTRAINT `pk_drop_test.pk$`;

pk_drop_test テーブルを見ると、PK が削除されていることを確認できました。

また、制約名の部分を pk$ にしても削除可能です。

ALTER TABLE pk_fk_dataset.pk_drop_test DROP CONSTRAINT `pk$`;

3. Primary key 変更

下記 2つの方法で Primary key を変更できることを確認します。

(それぞれ実施するときはテーブルを初期状態に戻しておきます。)

3.1. ALTER TABLE ステートメントを使用

下記 SQL で、PK を id だけから、idvalue に変更します。

ALTER TABLE pk_fk_dataset.pk_drop_test DROP PRIMARY KEY;
ALTER TABLE pk_fk_dataset.pk_drop_test ADD PRIMARY KEY (id, value) NOT ENFORCED;

pk_drop_test テーブルを見ると、PK が idvalue に変更されていることを確認できました。

3.2. テーブル再作成

下記 SQLで、pk_drop_test テーブルを再作成します。

CREATE OR REPLACE TABLE pk_fk_dataset.pk_drop_test(
  id INT64,
  value INT64,
  PRIMARY KEY(id, value) NOT ENFORCED
);

pk_drop_test テーブルを見ると、PK が idvalue に変更されていることを確認できました。

4. まとめ

本記事では、実際に試して Primary key の削除・変更方法を確認しました。設定・追加・削除・変更方法をまとめると次のようになります。

Discussion