可能であれば、WHERE節でワイルドカードと関数の両方を避けなければならないことを知っています。私の質問は、パフォーマンスの面でどちらが良いかを選択する必要があるとします。具体的には、次の2つのクエリがあり、どのタイプのクエリが一般的に望ましいのかを知りたいのです。WHERE句には「ワイルドカード」または「文字列関数」のどれが優先されますか?
select FirstName from person.person where FirstName like 'S%'
select FirstName from person.person where LEFT(FirstName,1) = 'S'
PS私は両方のクエリの実行時間をチェックしており、この特定のケースで顕著な違いはありませんでした。ここでは実行計画は、次のとおりです。
これはインデックスIX_Person_LastName_FirstName_MiddleNameためのコードが定義されている。ここで
USE [AdventureWorks2012]
GO
/****** Object: Index [IX_Person_LastName_FirstName_MiddleName] Script Date: 11/30/2016 12:53:05 PM ******/
CREATE NONCLUSTERED INDEX [IX_Person_LastName_FirstName_MiddleName] ON [Person].[Person]
(
[LastName] ASC,
[FirstName] ASC,
[MiddleName] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO;
は、いくつかのリンクあり私は彼らは完全に私の質問に答えていないものの、この問題は、:
インデックスの作成方法を教えてください。 –
ワイルドカードは通常、文字列を使用して文字列を開始するか(またはその前の文字シーケンスが比較フィールドの値の大部分を開始する場合)、問題になります。ほとんどの関数の使用は、RDBMSがこれらの関数に対して特別な最適化を行わない限り、テーブルスキャンで終了します。 – Uueerdo
いくつの行がありますか? 'LIKE 'S%''はインデックスを使います( 'LIKE '%s')はそうしません)。私は、エンジンが同様にLEFTを扱うのに十分なほどスマートだと思うでしょう... – Shnugo