メインコンテンツへスキップ
見出し画像

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

    あなたへのおすすめ