9. なぜテーブルを
インターリーブするか
user_id
SELECT user_name, item_id FROM users INNER JOIN items ON users.user_id = items.user_id WHERE user_id = 1234;
user_id user_name
1111 john
1122 paul
1234 bob
user_id item_id
1111 001
1111 002
1234 001
user_name
user_id
item_id
1111 john
1122 paul
1234 bob
1111 001
1111 002
1234 001
Spanserver A Spanserver B
1111 john
1111 001
1111 002
1122 paul
1234 bob
1234 001
Spanserver A
Logical View Physical View
No interleave
Physical View
With interleave
インタリーブをすると、 JOIN クエリ
が2つのサーバにアクセスすることも
なく、1サーバで済む
10. インデックスとインターリーブについて
テーブルがインターリーブされている場合、不要なインデックスを作っているかもしれません。
See the example below:
Table DDL index
user
CREATE TABLE test_user (
user_id INT64 NOT NULL,
create_date TIMESTAMP NOT NULL
) PRIMARY KEY (user_id)
CREATE INDEX idx_user_id
ON user (
user_id
)
item
CREATE TABLE test_item (
user_id INT64 NOT NULL,
item_id INT64 NOT NULL
) PRIMARY KEY (user_id, item_id),
INTERLEAVE IN PARENT user ON DELETE CASCADE
CREATE INDEX idx_user_id_in_item
ON item (
user_id
)
この例ではセカンダリイン
デックスは不要です
PK は自動的に イ
ンデックスされる
user_id は既に親テーブルで
インデックスされている
11. Channels と sessions
● Channels
○ Cloud Spanner へ接続する gRPC コネクション数
○ Default = 4, max = 256.
○ コードの中で定義する必要がある
■ SpannerOptions options = SpannerOptions.newBuilder().setNumChannels(8).build();
● Sessions
○ Session はトランザクションを実行できるコンテキストです。並列で行われるトランザクションは各自 session
を利用する必要がある。例えば、あるアプリが並列に100トランザクションを行うとしたら、Session pool を最
低100に設定する必要があります。
○ Default value = Default number of channels * 100 = 400
○ Recommendations: Number of sessions = number of expected threads
○ データベースごとにセッション数の上限が:10000 per node.
○ 詳細はこちら:https://cloud.google.com/spanner/docs/sessions?hl=ja
18. 容量に関する上限(2GB and 2TB)
Cloud Spanner には 2TB size limit per node という容量上限があります。
インターリーブテーブルを使うと、裏上限がもう1つあります: 2GB per parent record and related child records
Max 2GB