時系列インデックスの選択
時系列ワークロードに適したインデックスを選びます。複合インデックス(device_id, ts DESC)は一般的なパターンをカバーします。
「時系列インデックスの選択」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。
一般的な時系列クエリ
「1つのエンティティの最新データ」:
SELECT * FROM metrics
WHERE device_id = 42
AND ts >= NOW() - INTERVAL '24 hours'
ORDER BY ts DESC LIMIT 1000;複合インデックス(device_id, ts DESC)
時系列データの標準的なインデックス:
CREATE INDEX metrics_device_ts_idx
ON metrics (device_id, ts DESC);
-- Equality on device_id, range + sort on ts: index handles both.順序が重要な理由
- (device_id, ts) — 「このデバイスの最新データ」に最適
- (ts, device_id) — 「この時刻のすべてのデバイス」に最適
クエリの構成に応じて選択してください。
追記専用テーブル向けのBRIN
BRINは非常に小さく、10億行のテーブルでも数MBです。インデックス対象の列によってデータが物理的にソートされている場合にのみ効果を発揮します(時系列データは通常この条件を満たします)。:
CREATE INDEX metrics_ts_brin ON metrics USING BRIN (ts);
-- Excellent for "give me last 24 hours" on append-only tables.B-treeとBRIN
- B-tree — idによる完全一致の検索をミリ秒単位で実行、最新時刻による検索にも対応
- BRIN — 単調に増加するデータの範囲スキャンが高速で、維持コストが低い
組み合わせて使用することもできます。 (device_id) にはB-tree、(ts) にはBRINを作成します。
Hypertableのインデックス
TimescaleDBはすべてのチャンクにインデックスを作成します。使用していないインデックスは削除してください。すべてのチャンクでコストが発生します。
頻繁にアクセスするサブセット向けの部分インデックス
クエリの99%が最新データを対象とする場合:
CREATE INDEX metrics_recent_idx
ON metrics (device_id, ts DESC)
WHERE ts >= NOW() - INTERVAL '7 days';
-- Issue: predicate must use literal date or be re-created periodically.インデックス列への関数適用を避ける
インデックス列に関数を適用しないでください。インデックスが使用されなくなります:
-- BAD:
WHERE date_trunc('hour', ts) = $1
-- GOOD:
WHERE ts >= $1 AND ts < $1 + INTERVAL '1 hour'最新行クエリ向けのインデックス
「デバイスごとの最新の測定値」を取得する場合、適切なインデックスによってクエリをインデックス範囲スキャンに変換できます:
CREATE INDEX metrics_device_ts_idx ON metrics (device_id, ts DESC);
SELECT DISTINCT ON (device_id) device_id, ts, value
FROM metrics
ORDER BY device_id, ts DESC;
-- Uses the index to take the first row per device.頻繁にアクセスする順序でクラスタ化する
CLUSTERは、インデックスに従ってテーブルを物理的に並べ替えます。これは一度だけ実行する操作であり、新しいデータは引き続き到着順に追加されます:
CLUSTER metrics USING metrics_device_ts_idx;
-- Cluster is heavy. TimescaleDB chunks help by keeping recent chunks small.カーディナリティの高い等価検索向けのHashインデックス
時系列データで使われることはまれですが、利用できます。通常はdevice_idにB-treeを作成すれば十分です。
インデックスを作りすぎない
時系列テーブルは書き込みが多くなります。インデックスを1つ追加するごとに書き込み増幅が発生します。クエリで使用するものだけを追加してください。
まとめ
時系列データのインデックス設計は、少数のパターンで構成されます。
- エンティティとtsの複合インデックス(entity, ts DESC) — エンティティ単位のクエリ向け
- 追記専用の範囲クエリにはtsのBRIN
- Hypertableではインデックスがチャンクに伝播する
- 列に関数を適用する述語を避ける
確認問題
最も頻繁に実行される時系列クエリがdevice_idで絞り込み、過去24時間のデータを読み取る場合、最適なインデックスはどれでしょうか。
AI チューターと学ぶ SQL — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 46
- レッスン
- 183
よくある質問
「時系列インデックスの選択」レッスンは無料ですか?
はい。「時系列インデックスの選択」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。
「時系列インデックスの選択」で何を学びますか?
時系列ワークロードに適したインデックスを選びます。複合インデックス(device_id, ts DESC)は一般的なパターンをカバーします。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
SQL Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「時系列インデックスの選択」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSQL Academyレッスンでコードを書いて実行できますか?
はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- TimescaleDBハイパーテーブル
- 継続的集約
- 圧縮と保持ポリシー
- 時系列インデックスの選択