Ran*_*der 10 performance sql-server optimization execution-plan sql-server-2008-r2 query-performance
我有一个 SQL Server 2008 R2 表,其架构结构如下所示:
CREATE TABLE [dbo].[CDSIM_BE]
(
[ID] [bigint] NOT NULL,
[EquipmentID] [varchar](50) NOT NULL,
[SerialNumber] [varchar](50) NULL,
[PyrID] [varchar](50) NULL,
[MeasMode] [varchar](50) NULL,
[ReadTime] [datetime] NOT NULL,
[SubID] [varchar](15) NULL,
[ProbePosition] [float] NULL,
[DataPoint] [int] NULL,
CONSTRAINT [PK_CDSIM_BE]
PRIMARY KEY CLUSTERED ([ID] ASC, [EquipmentID] ASC, [ReadTime] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON) ON [MonthlyArchiveScheme9]([ReadTime])
) ON [MonthlyArchiveScheme9]([ReadTime])
CREATE NONCLUSTERED INDEX [idx_CDSIM_BE__SubID_ProbePosition]
ON [dbo].[CDSIM_BE] ([SubID] ASC, [ProbePosition] ASC)
INCLUDE ([EquipmentID], [ReadTime], [BECorr])
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 [MonthlyArchiveScheme9]([ReadTime])
CREATE NONCLUSTERED INDEX [IX_CDSIM_BE_ProbePosition]
ON [dbo].[CDSIM_BE] ([ProbePosition] ASC)
INCLUDE ([SerialNumber], [SubID])
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 [MonthlyArchiveScheme9]([ReadTime])
CREATE NONCLUSTERED INDEX [IX_CSDIM_Readtime]
ON [dbo].[CDSIM_BE]([ReadTime] ASC)
INCLUDE ([EquipmentID])
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 [MonthlyArchiveScheme9]([ReadTime])
Run Code Online (Sandbox Code Playgroud)
我正在执行这个简单的查询:
Select Max(Id)
From dbo.CDSIM_BE
Run Code Online (Sandbox Code Playgroud)
表中有 ~2.5B 行。
查询计划显示正在对IX_CdSIM_BE_ProbePosition
索引进行索引扫描。我想知道为什么 SQL Server 根本不使用聚集(和主)索引并立即转到表中的最后一行并检索 Id 值,因为它必须是最大值。
聚集索引被分区,ReadTime
所以它不能像你描述的那样使用 PK。它需要Max(Id)
为每个分区找到 ,然后找到它们的最大值。它是可以重写查询,但得到这样的计划。
SELECT MAX(ID) AS ID
FROM sys.partitions AS P
CROSS APPLY (SELECT MAX(ID) AS ID
FROM [dbo].[CDSIM_BE]
WHERE $PARTITION.MonthlyArchiveFunction9(ReadTime)
= P.partition_number) AS A
WHERE P.object_id = OBJECT_ID('dbo.CDSIM_BE')
AND P.index_id <= 1;
Run Code Online (Sandbox Code Playgroud)
依次处理每个分区。
请注意,该计划仍然有一个扫描(使用搜索谓词来选择分区),但这不是对分区的完整扫描。
扫描按索引顺序进行,方向为“BACKWARD”。在TOP
收到后的第一个迭代器可以请求停止从扫描行。
归档时间: |
|
查看次数: |
716 次 |
最近记录: |