【劔"Tsurugi" Tips集】データの検索はテーブルフルスキャンを避けるようにする【プログラミングTips】
*****
こちらの記事は、
Tsurugi Advent Calendar 2024(https://adventar.org/calendars/10853)
に参加しています。
劔"Tsurugi"関連のエンジニアが12月25日までの期間、さまざまな記事を掲載していきます。
是非、こちらもご覧ください!
*****
現在のTsurugiはインデックスを経由しない、テーブルをフルスキャンしてデータを読み取る処理が苦⼿です。
レコード件数が⾮常に多いテーブルの場合にはこの傾向が顕著になるため、データの検索処理は次の点に注意して設計してください。
・SQLの実⾏計画を出⼒して、インデックスを使った検索が⾏われていることを確認する
・主キーと異なる列に対して検索を⾏う場合は当該列に対してCREATE INDEX ⽂を使ってセカンダリインデックスを作成する
・やむを得ずテーブルフルスキャンを⾏う場合は、SQLにLIMIT句を指定して出⼒件数を絞る
実⾏計画を確認するには、Tsurugi SQLコンソール (tgsql) にて、対象のSQL⽂の先頭に EXPLAIN 句を付けて実⾏します。
例を⽰します。
tgsql> explain select * from point_data where data_time >= 10000 and data_time <
20000;
1. scan (scan) {source: index, table: point_data, index: point_data_IX1, access:
range-scan}
2. emit (emit)
この例では point_data テーブルの列 data_time に対して CREATE INDEX ⽂を⽤いてインデックスを作成しています。
出⼒された実⾏計画を確認すると、インデックス point_data_IX1 に対して range-scan を⾏うと出ており、インデックスを使った検索になっていることが分かります。
インデックスを作成していない列を対象にしたSQL⽂の実⾏計画を出⼒すると次のようになります。
tgsql> explain select * from point_data1 where x > 0;
1. scan (scan) {source: table, table: point_data1, access: full-scan}
2. emit (emit)
テーブルに対して full-scan を⾏うという実⾏計画が出ていることが分かります。
次世代高速RDB劔"Tsurugi"は、オープンソースで公開中です。
ぜひダウンロードしてみて、触ってみてください。
ダウンロードはコチラから
https://www.tsurugidb.com/