5kk行に近いテーブルがあります。それぞれに1つのテキスト列があり、ここにXMLログを保存します
いくつかのログがあるかどうかを調べようとしています
<node>value</node>
私はで試しました
SELECT top 1 id_log FROM Table_Log WHERE log_text LIKE '%<node>value</node>%'
しかし、それは決して終わらない。
この検索を改善する方法はありますか?
PS:ログをドロップできません
5kk行に近いテーブルがあります。それぞれに1つのテキスト列があり、ここにXMLログを保存します
いくつかのログがあるかどうかを調べようとしています
<node>value</node>
私はで試しました
SELECT top 1 id_log FROM Table_Log WHERE log_text LIKE '%<node>value</node>%'
しかし、それは決して終わらない。
この検索を改善する方法はありますか?
PS:ログをドロップできません
のようなワイルドカードを使用したクエリ'%<node>value</node>%'
は、フィールド内のどこで一致するかを判断できないため、完全なテーブル スキャン (インデックスを無視) になります。このクエリを現状のまま改善するために私が知っている唯一の実際の方法は (テーブルが常にログに記録されている場合に考慮すべきテーブルのパーティション分割などを行わずに)、フルテキスト カタログとインデックスをテーブルに追加することです。そのフィールドに対するより効率的な検索を提供します。
ここでは、それを順を追って説明する適切なリファレンスを示します。これが完了すると、このタイプの検索用に最適化された CONTAINS や FREETEXT 演算子などを使用できます。
残念ながら、それを最適化する唯一の方法は、その列に全文検索を実装することですが、それでも特定の要素内の特定の値のみを返す場所を構築するのは難しいでしょう.
現在、列の 1 つに XML を格納する作業を行っています。しかし、そのデータに対して必要なクエリには長い時間がかかると想定していますが、これは私たちのニーズには問題ありません。
もう 1 つのオプションは、データをバイナリ列に格納することです。SQL Server には、そのフィールドに格納するドキュメントの種類を指定するオプションがあります。これにより、たとえば、そのフィールドでより意味のある全文検索を実装できます。しかし、これがあなたが求めていることを効率的に行うとは想像しがたいです。
その列に全文検索を実装してテーブルにインデックスを付ける以外に、別のパラメーター (日付など) で結果を絞り込むことができます。また、行を挿入するときに入力できる「タグ」と呼ばれるテーブル フィールド (varchar タイプ) を追加することもできます。このフィールドは、このログの「キーワード、タグ」を登録します。このようにして、このフィールドを条件としてクエリを変更できます。
likeクエリを使用しています。インデックスが含まれていない = 良くない 残念ながら、これを高速化するために現在持っているものでできることは何もありません。
役に立たないと思いますが、次のようにFAST x クエリ ヒントを使用してみてください。
SELECT id_log
FROM Table_Log
WHERE log_text LIKE '%<node>value</node>%'
OPTION(FAST 1)
これにより、最初の行を返すようにクエリが最適化されます。