私はこれらの2つが同じ実行計画とパフォーマンスを持つことを期待しています。 LIKE
には先頭にワイルドカードがあるので、インデックススキャンが必要です。これを実行して計画を見ると、最初のSELECT
は期待通りに(スキャンで)動作します。しかし、第2のSELECT
プランはインデックス検索を示し、20倍高速に実行されます。どのように '%...'を検索してインデックスを検索できますか?
コード:
-- Uses index scan, as expected:
SELECT 1
FROM AccountAction
WHERE AccountNumber LIKE '%441025586401'
-- Uses index seek somehow, and runs much faster:
declare @empty VARCHAR(30) = ''
SELECT 1
FROM AccountAction
WHERE AccountNumber LIKE '%441025586401' + @empty
が質問:パターンはワイルドカードで始まる場合
どのようにSQL Serverが求めるインデックスを使用していますか?
ボーナス質問:
空の文字列の変更を連結しないのはなぜ/実行計画を改善しますか?
詳細:Accounts.AccountNumber
- 他の指標がありますが、両方の追求とスキャンがこの指標です。
Accounts.AccountNumber
列がNULL可能varchar(30)
- サーバーは、SQL Server 2012の
表と索引の定義されている。
CREATE TABLE [updatable].[AccountAction](
[ID] [int] IDENTITY(1,1) NOT NULL,
[AccountNumber] [varchar](30) NULL,
[Utility] [varchar](9) NOT NULL,
[SomeData1] [varchar](10) NOT NULL,
[SomeData2] [varchar](200) NULL,
[SomeData3] [money] NULL,
--...
[Created] [datetime] NULL,
CONSTRAINT [PK_Account] PRIMARY KEY NONCLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
CREATE NONCLUSTERED INDEX [IX_updatable_AccountAction_AccountNumber_UtilityCode_ActionTypeCd] ON [updatable].[AccountAction]
(
[AccountNumber] ASC,
[Utility] ASC
)
INCLUDE ([SomeData1], [SomeData2], [SomeData3]) 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]
CREATE CLUSTERED INDEX [CIX_Account] ON [updatable].[AccountAction]
(
[Created] 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]
注: ここのため実際実行計画があります2つのクエリ。質問を簡単にするために、オブジェクトの名前は上のコードと少し異なります。
は、実際の実行中にのみ推定計画に差がありますか? –
@GordonLinoff SQL Server 2012のバージョン番号は11、2008 R2:10.5、2008:10など – swasheck
重要なことはわかりませんが、実際に実行したクエリは「LIKE '%441025586401% 、ワイルドカードで始まり、終わりに – Lamak