日付ベースのテーブル分割とパーティショニングへの移行
BigQueryのシャーディング(Table Sharding)は、日付や時間ごとに個別のテーブルを作成してデータを分散保存する古い手法です。 例えば、日次でテーブルを分割する場合:
events_20241120 - 2024年11月20日のデータevents_20241121 - 2024年11月21日のデータevents_20241122 - 2024年11月22日のデータ
シャーディングはレガシーな手法として扱われており、Googleはパーティションテーブル(Partitioned Tables)への移行を強く推奨しています。
新規プロジェクトでは絶対にシャーディングを使用せず、既存のシャーディングテーブルは早急にパーティショニングに移行すべきです。
| 問題 | 詳細 | 影響 |
|---|---|---|
| テーブル数の爆発 | 1日1テーブルで年間365個、複数年で数千個のテーブル | 管理コスト増大、可視性低下 |
| クエリの複雑化 | 複数日のデータを取得するにはUNION ALLが必須 | クエリ作成が面倒、エラーリスク増加 |
| メタデータオーバーヘッド | 各テーブルが独立したメタデータを持つ | メタデータ取得が遅い、API制限に到達 |
| スキーマ変更の困難さ | 全テーブルに対して個別にALTER TABLEが必要 | 大量のDDL実行、時間とコストがかかる |
| パフォーマンス | ワイルドカードテーブルのスキャンが非効率 | パーティションプルーニングより遅い |
| 運用の煩雑さ | テーブルの作成・削除を手動または自動化が必要 | 運用負荷増大、ミスのリスク |
| コスト管理 | 古いテーブルの削除を忘れるとストレージコスト増加 | 予期しないコスト発生 |
シャーディングされた複数のテーブルを1つのクエリでまとめて検索する機能。
_TABLE_SUFFIX擬似カラムで日付フィルタリングが可能。
events_*events_202411*_TABLE_SUFFIX BETWEEN 'X' AND 'Y'events_2024*, logs_2024*| 項目 | 推奨事項 |
|---|---|
| 移行タイミング | できるだけ早く実施。新規プロジェクトでは絶対にシャーディングを使わない |
| データ検証 | 移行前後で行数、ユニーク値、集計結果を必ず比較 |
| 段階的移行 | 最初は過去1年分のみ移行し、問題なければ全データを移行 |
| 並行運用期間 | 30日程度は両方のテーブルを維持し、問題ないことを確認 |
| バックアップ | 削除前にCloud Storageへエクスポートまたはスナップショット取得 |
| クエリ最適化 | パーティション列でのフィルタを必須にし、プルーニングを活用 |
| モニタリング | 移行後のコスト、パフォーマンス、エラー率を監視 |
| 項目 | シャーディング | パーティショニング | 改善 |
|---|---|---|---|
| テーブル管理 | 365個/年 | 1個 | 99.7%削減 |
| クエリの複雑さ | UNION ALL必須 | 通常のSELECT | シンプル |
| スキャン効率 | テーブルメタデータ読込 | パーティションプルーニング | 10-100倍高速 |
| スキーマ変更 | 全テーブルにALTER | 1回のALTER | 99%削減 |
| データ保持期間 | 手動削除 | 自動削除可能 | 自動化 |
| コスト最適化 | 難しい | クラスタリング併用 | さらに削減 |
| APIコール数 | テーブル数に比例 | 1回 | 99%削減 |