【发布时间】:2017-03-06 00:14:41
【问题描述】:
我的表结构如下
CREATE TABLE [dbo].[AIRQUALITYTS2]
(
[FeatureID] [nvarchar](20) NOT NULL,
[ParameterID] [nvarchar](20) NOT NULL,
[MeasurementDateTime] [datetime2](7) NOT NULL,
[ParameterValue] [numeric](38, 8) NULL,
[Remarks] [nvarchar](150) NULL,
CONSTRAINT [PK_AIRQUALITYTS2]
PRIMARY KEY CLUSTERED ([FeatureID] ASC, [ParameterID] ASC, [MeasurementDateTime] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
当我执行这个查询时:
set statistics io on
SELECT
COUNT(featureid), featureid
FROM
AIRQUALITYTS2
WHERE
FeatureID LIKE 'AS%'
AND ParameterID = 'AP2'
AND YEAR(MeasurementDateTime) = 2015
GROUP BY
FeatureID
ORDER BY
FeatureID
我看到逻辑记录101871,查询执行计划是
但是当我在这个表上添加非聚集索引时
CREATE NONCLUSTERED INDEX non_fidpidmdate
ON [dbo].[AIRQUALITYTS2] ([ParameterID], [FeatureID])
INCLUDE ([MeasurementDateTime])
当我执行相同的查询时,我看到逻辑记录只读取 4636 并且速度非常快,查询执行计划是
问题1:当第二个查询中的逻辑记录较少时。
问题 2:为什么第一个查询使用 聚集索引扫描,如第一张图像中所示,尽管它在 featureid、ParameterID 和 MeasurementDateTime 上有聚集索引,而在添加非聚集索引后它使用 Index寻找(非集群)图片中显示的第二张图片
注意:我已将 where 子句更改为
MeasurementDateTime >= '2004-01-01 00:00:00'
and MeasurementDateTime <= '2004-12-31 00:00:00'
使其可搜索,但结果仍然相同。
【问题讨论】:
标签: sql-server sql-execution-plan non-clustered-index