我有一个 SQL Server 2012 表,其中包含这样的列:
ID int NOT NULL,
EventDate datetime NOT NULL,
... 32 other columns...
Run Code Online (Sandbox Code Playgroud)
其中该表在大约 10000 个不同的 ID 值范围内有大约 50 亿行。
该表有一个唯一的聚集索引,如下所示:
CREATE UNIQUE CLUSTERED INDEX [MyIndex] ON [dbo].[MyTable] (
[ID] ASC,
[EventDate] ASC
)
Run Code Online (Sandbox Code Playgroud)
我需要找到最早的每个 ID 的 EventDate,我可以使用以下查询获得它:
SELECT ID, min(EventDate) FROM [dbo].[MyTable] GROUP BY ID
Run Code Online (Sandbox Code Playgroud)
但是,此查询只需不到 2 分钟即可完成。
由于 NDA 限制,我无法分享我正在查看的问题的细节(查询计划等),但我可以建议我看到的是聚集索引扫描,因此它正在检查表中的所有行。鉴于数据是按 EventDate 序列组织的,我希望检索速度会快得多,但我不太确定如何。任何其他特定于 ID 的范围查询都会在几毫秒内响应,并且该表最近已重建并重新编制索引,因此我认为没有任何统计更新会有所帮助。
任何人都可以建议一种更好的方法来确定避免扫描整个聚集索引的最小 per-ID EventDate 值吗?
我确实有一个包含(10,000)个不同id
值的表格。
performance sql-server sql-server-2012 greatest-n-per-group query-performance