【发布时间】:2017-03-05 09:23:04
【问题描述】:
我有两张桌子
CREATE TABLE [dbo].[T2] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[F1] NVARCHAR (100) NULL,
[F2] NVARCHAR (100) NULL,
[F3] NVARCHAR (MAX) NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
);
GO
CREATE NONCLUSTERED INDEX [IX_T2_F1_F2]
ON [dbo].[T2]([F1] ASC, [F2] ASC);
与
CREATE TABLE [dbo].[T3] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[F1] NVARCHAR (100) NULL,
[F2] NVARCHAR (100) NULL,
[F3] NVARCHAR (MAX) NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
);
GO
CREATE NONCLUSTERED INDEX [IX_T3_F1_F2]
ON [dbo].[T3]([F1] ASC, [F2] ASC)
INCLUDE([F3]);
这些是我的执行计划
问题是为什么查询#2的执行计划不是Index Seek (NonClustered),为什么查询优化器选择在PK上扫描聚集索引,而不是非聚集索引{F1,F2}?
更新 #1:
【问题讨论】:
-
这些表中可能有 0 行,所以没关系。在其中放入一百万行并更新您的统计信息。
-
@ta.speot.is 我在两个表中都有 100k 行
-
你的执行计划中的那些箭头很窄 - SQL Server 估计有多少行?
-
另外,
IX_T2_F1_F2不包括F3,因此任何索引查找都将跟随一些其他操作(键查找、聚集索引查找)以获取F3,SQL Server 可能估计它更快扫描聚集索引而不是 seek + (key lookup/seek) -
@ta.speot.is 是的,我考虑过了,谢谢。
标签: sql sql-server sql-server-2008 sql-server-2016