2016-11-30 3 views
2

可能であれば、WHERE節でワイルドカードと関数の両方を避けなければならないことを知っています。私の質問は、パフォーマンスの面でどちらが良いかを選択する必要があるとします。具体的には、次の2つのクエリがあり、どのタイプのクエリが一般的に望ましいのかを知りたいのです。WHERE句には「ワイルドカード」または「文字列関数」のどれが優先されますか?

select FirstName from person.person where FirstName like 'S%' 

select FirstName from person.person where LEFT(FirstName,1) = 'S' 

PS私は両方のクエリの実行時間をチェックしており、この特定のケースで顕著な違いはありませんでした。ここでは実行計画は、次のとおりです。

enter image description here

enter image description here

enter image description here

これはインデックス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; 

は、いくつかのリンクあり私は彼らは完全に私の質問に答えていないものの、この問題は、:

AvoidFunctionsInWereClause_1

AvoidFunctionsInWereClause_2

AvoidLikeClause

+1

インデックスの作成方法を教えてください。 –

+1

ワイルドカードは通常、文字列を使用して文字列を開始するか(またはその前の文字シーケンスが比較フィールドの値の大部分を開始する場合)、問題になります。ほとんどの関数の使用は、RDBMSがこれらの関数に対して特別な最適化を行わない限り、テーブルスキャンで終了します。 – Uueerdo

+1

いくつの行がありますか? 'LIKE 'S%''はインデックスを使います( 'LIKE '%s')はそうしません)。私は、エンジンが同様にLEFTを扱うのに十分なほどスマートだと思うでしょう... – Shnugo

答えて

1

をものはOKですので、どちらのクエリはインデックススキャンを行っています。しかし、インデックスやテーブルサイズの設定方法はわかりません。

%が最後であるため、最初のバージョンではfirstNameの基本インデックスを使用できます。

FirstName like 'S%' 

FirstName Like '%S%' -- cant use index 

セカンドバージョンカントはfirstNameの上のインデックスを使用しますが、あなたは私達にあなたのインデックスを示すべき理由ですLEFT(FirstName,1)のための計算されたインデックスを作成することができます。

これは、インデックスを作成するためのヒントを持っている記事です。 MySQLインデックスTIPS

関連する問題