1

指定された文字列キーで終わるvarchar列として保存されたシリアル番号を含む数百万のレコードを検索するための最適な方法を探しています。

EndsWithを使用していましたが、複数のクエリが送信されるとパフォーマンスがかなり低下します。

それを行うためのより良い方法はありますか?

編集:

検索キーの長さが可変であるため、シリアル番号のカットオフ値を保持する列を作成できません。ただし、SubstringとEquals vs EndsWithを使用していくつかのテストを実行し、実行速度をEndsWithの40%に下げました。

私はまだより良い解決策を探しています:)

4

1 に答える 1

4

残念ながら、特定のパターンで終わる文字列の検索は、ほとんどのデータベースでは困難です+。これは、文字列のサフィックスの検索ではインデックスを使用できないためです。これにより、全表スキャンが発生し、数百万行のテーブルでは低速になる可能性があります。

データベースが逆インデックスをサポートしている場合は、文字列キー列に逆インデックスを追加します。それ以外の場合は、リバースインデックスをシミュレートすることでパフォーマンスを向上させることができます。

  • 文字列キーを逆に保存するための列を追加します
  • RDBMSが計算列をサポートしている場合は、逆キー用に1つ追加します
  • それ以外の場合は、キー列から反転列にデータを入力するトリガーを定義します
  • 反転した列にインデックスを作成します
  • 探している逆の接尾辞を渡して、検索に逆の列を使用します。

たとえば、このようなデータがある場合

key
-----------
01-02-3-xyz
07-12-8-abc

次に、拡張テーブルは

key           rev_key
-----------   -----------
01-02-3-xyz   zyx-3-20-10
07-12-8-abc   cba-8-21-70

を検索すると、ENDS_WITH(key, '3-xyz')が要求されSTARTS_WITH(rev_key, 'zyx-3')ます。文字列インデックスはプレフィックスによるルックアップを高速化するため、「startswith」ルックアップははるかに高速になります。


+ 1つの注目すべき例外はOracleです。これは、このような状況に特化した逆キーインデックスを提供します。

于 2013-03-25T10:07:38.060 に答える