SQL Server 2008を使用しており、計算列をカバーするインデックスのシークを実行することを拒否しています。SQL Serverが計算列を使用してインデックスシークを実行しない理由
私のテーブルには、次のようになります。
CREATE TABLE Person
{
Id uniqueidentifier NOT NULL,
InsertDate datetime NOT NULL,
PhoneNumber NULL,
PhoneNumberComparable AS (MakePhoneNumberComparable(PhoneNumber)) PERSISTED,
... etc...
}
もクラスタ化された主キーのID列のインデックス、およびInsertDate列に索引があります。このようなPhoneNumberComparable計算列に索引がある
:
CREATE NONCLUSTERED INDEX IX_Person_PhoneNumberComparable ON Person
(
PhoneNumberComparable ASC
)
インデックスは、すべての日付の統計情報まで持っています。
私のクエリは次のようになります。デフォルトでは
SELECT TOP 20 * FROM Person
WHERE PhoneNumberComparable = @PhoneNumber
ORDER BY InsertDate DESC
、SQL Serverは非常にパフォーマンスの低下を引き起こし、InsertDate上のインデックスの代わりに、PhoneNumberComparableのインデックスを使用することを決定しました。
WITH(INDEX = IX_Person_PhoneNumberComparable)をクエリに追加することにより、電話番号インデックスを強制的に使用しようとすると、SQLはシークではなくスキャンを実行しようとします。
私はFORCESEEKクエリヒントを使用しようとすると、SQL Serverは私に次のエラー与える:SQL Serverが私のインデックスを求めて拒否しているいくつかの理由のために、したがって、基本的
Query processor could not produce a query plan because of the hints defined in this query. Resubmit the query without specifying any hints and without using SET FORCEPLAN.
を!どうして?コメントで提案を1として
EDIT
、(主キーのスキャンが実行代わりの電話番号のインデックスに求めている)私は、クエリを簡素化しましたが、問題がまだ存在します。
SELECT TOP 20 PhoneNumberComparable FROM Person
WHERE PhoneNumberComparable = @PhoneNumber
クエリから「ORDER BY InsertDate DESC」を削除するとどうなりますか? – iruvar
@ 1_CR ORDER BY InsertDate DESCをドロップすると、主キー索引の使用が試行されます。同じ問題! – cbp
このスレッドではこれと似た問題について話しています。これはSQL Server 2008のバグであることを暗示しています。http://www.sqlservercentral.com/Forums/Topic1085414-392-1.aspx – cbp