47

これは非常に基本的な質問であることはわかっています。答えはわかっていると思いますが、確認したいと思います。

これらのクエリは本当に同等ですか?

SELECT * FROM FOO WHERE BAR LIKE 'X'
SELECT * FROM FOO WHERE BAR ='X'

ワイルドカードなしで like を使用すると、パフォーマンスのオーバーヘッドが発生する可能性がありますか?

オプションで LIKE とワイルドカードを使用するアプリがあります。SPは現在、同様の処理を行い、ワイルドカードを追加しています.likeを使用するようにクエリを更新することを考えていますが、必要に応じてアプリにワイルドカードを追加させます。

4

3 に答える 3

32

@ocdecio が言うように、オプティマイザーが十分にスマートであれば違いはないはずですが、舞台裏で何が起こっているかを確認したい場合は、2 つのクエリの実行計画を比較する必要があります。

于 2008-12-31T23:07:18.093 に答える
17

ここからのMatt Whitfieldによる元の回答

と の間には違い=がありLIKEます。を使用して文字列比較を実行するとLIKE、パターン文字列内のすべての文字が有効になります。これには、先​​頭または末尾のスペースが含まれます。

したがって、 or であり、 or ではない列がある場合、char末尾ncharのスペースが原因で結果が異なります。nvarcharvarchar

この動作を再現する小さな例:

CREATE TABLE #temp (nam [varchar](MAX))
INSERT INTO [#temp] ([nam])
VALUES ('hello')
INSERT INTO [#temp] ([nam])
VALUES ('hello  ')

SELECT * FROM #temp WHERE [nam] = 'hello  '

SELECT * FROM #temp WHERE [nam] LIKE 'hello  '
于 2016-06-13T11:18:51.863 に答える
7

適切なオプティマイザーは、最初の式を 2 番目の式に減らします。

于 2008-12-31T23:04:08.647 に答える