2009-07-07 5 views
2

私はテキスト索引付けをしていないと仮定します。SQL WHERE条件を選択して、バックグラウンドではどうなりますか?

SELECT * FROM myTable WHERE myTable.columnA LIKE 'bobo' 

は、SQLエンジンは、すべての行を通過してのみ、一致条件を返すか、賢くSQLであり、いくつかの隠されたネイティブインデックス作成を行いんだろう:私が持っているとしましょうか?

私はMSSQL 2000,2005,2008にありますが、他のバージョンのSQLにはさまざまなアプローチがありますが、私はすべて耳にします。

どのように操作が行われるかについては、オンラインの文書や書籍がありますか?

答えて

11

SQL Server Management Studioクエリにそのクエリを配置し、実行する前に「実際の実行計画を含める」オプションを有効にします。これは、クエリを実行するために実行されるすべてのステップと、使用されているすべてのインデックスおよび方法の詳細な図を示します。

+0

「iio統計情報を設定」を追加すると、i \ oと表の作業を表示できます。このクエリは多分(mytableがビューでない限り)必要はないでしょうが、 –

2

あなたは、このクエリの実行無地に見える場合:

SELECT * 
FROM mytable 
WHERE columnA LIKE 'bobo%' 

あなたはそれが書き換えられることがわかりますように:もしあれば、columnAにインデックスの上にINDEX SEEKを使用して

SELECT * 
FROM mytable 
WHERE columnA >= 'bobo' 
     AND columnA < 'bobP' 
、 。

1

第3節this bookの「クエリ実行」では、実行計画を表示するときに表示される主な要素について説明しています。

1

私はMSSQLについて正確にはわかりませんが、他のデータベースでLIKE節がどのように機能するかを教えていただけます。

あなたはあなたの選択のいずれかのワイルドカードを有効にクエリがなるように持っていない:

SELECT * FROM myTable WHERE myTable.columnA = 'bobo' 

あなたは

SELECT * FROM myTable WHERE myTable.columnA LIKE 'bobo%' 

することができ、その後myTable.columnA上の伝統的な非フルテキストインデックスを使用している場合しかし

SELECT * FROM myTable WHERE myTable.columnA LIKE '%bobo' 

、インデックスを使用10
SELECT * FROM myTable WHERE myTable.columnA LIKE '%bobo%' 

インデックスを使用できないため、サーバーがテーブルのすべての行を調べるフルテーブルスキャンが発生します。違いはワイルドカードが前面にあることです: '%bobo'。 DBはLIKE 'bobo% 'をインデックス上の範囲スキャンに変換できますが、ツリースタイルインデックスの性質のためにLIKE '%bobo'とすることはできません。

本当にLIKE '%bobo'データが必要な場合は、内容reverse(myTable.columnA)を持つ派生カラムmyTable.columnBを作成し、その上にLIKE 'obob%'を作成することを検討してください。

本当にLIKE '%bobo%'を実行する必要がある場合は、検索エンジンのようなデータベースを使用しており、全文索引付けを使用するか、外部の全文検索エンジンを使用する必要があります。

関連する問題