我在SQL Server中的表2008數據庫:SQL服務器,爲什麼不使用索引
CREATE TABLE [dbo].[Actions](
[ActionId] [int] IDENTITY(1,1) NOT NULL,
[ActionTypeId] [int] NOT NULL,
[Name] [nvarchar](50) NOT NULL,
[Description] [nvarchar](1000) NOT NULL,
[Comment] [nvarchar](500) NOT NULL,
[Created] [datetime] NOT NULL,
[Executed] [datetime] NULL,
[DisplayText] [nvarchar](1000) NULL,
[ExecutedBy] [int] NULL,
[Result] [int] NULL
)
CONSTRAINT [PK_Actions] PRIMARY KEY CLUSTERED
(
[CaseActionId] ASC
)
) ON [PRIMARY]
GO
CREATE NONCLUSTERED INDEX [IX_Actions_Executed] ON [dbo].[Actions]
(
[Executed] ASC,
[ExecutedBy] ASC
)
有已經執行日期等於「2500年1月1日」和420 000列20行000已執行日期<'2500-01-01'。
當我執行一個查詢
select CaseActionId, Executed, ExecutedBy, DisplayText from CaseActions
where Executed='2500-01-01'
查詢計劃表明,在PK_Actions聚集索引執行掃描和索引IX_Actions_Executed
完全不使用。
我有什麼有趣的缺失索引提示它說
/* The Query Processor estimates that implementing the following index could improve the query cost by 99.9901%.
*/
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[Actions] ([Executed])
不過該指標已經存在。
爲什麼索引不被使用,如果它會選擇5%的數據?
是的,你是正確的顯示文本。你說20000鍵查找比整個聚簇索引的掃描要貴?好的,謝謝你的信息。 – WaldiMen
@WaldiMen:測試它! :-)你可以強制SQL Server通過'WITH(INDEX(IX_Actions_Executed))'來使用索引 - 比較執行計劃,執行時間和I/O統計。另外:嘗試**覆蓋索引**的方法 - 我敢肯定,如果包含「DisplayText」列,它將被使用.... –