見出し画像

【劔"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/

いいなと思ったら応援しよう!