【发布时间】:2010-12-12 23:51:46
【问题描述】:
以下简单查询需要很长时间(几分钟)才能执行。
我有一个索引:
create index IX on [fctWMAUA] (SourceSystemKey, AsAtDateKey)
SELECT MAX([t0].[AsAtDateKey]) AS [Date], [t0].[SourceSystemKey] AS [SourceSystem]
FROM [fctWMAUA] (NOLOCK) AS [t0]
WHERE SourceSystemKey in (1,2,3,4,5,6,7,8,9)
GROUP BY [t0].[SourceSystemKey]
统计如下:
- 逻辑读取 1827978
- 物理读取 1113
- 提前阅读 1806459
采用完全相同的查询并将其重新格式化,如下所示:
- 逻辑读取 36
- 物理读取 0
- 预读 0
执行需要 31 毫秒。
SELECT MAX([t0].[AsAtDateKey]) AS [Date], [t0].[SourceSystemKey] AS [SourceSystem]
FROM [fctWMAUA] (NOLOCK) AS [t0]
WHERE SourceSystemKey = 1
GROUP BY [t0].[SourceSystemKey]
UNION
SELECT MAX([t0].[AsAtDateKey]) AS [Date], [t0].[SourceSystemKey] AS [SourceSystem]
FROM [fctWMAUA] (NOLOCK) AS [t0]
WHERE SourceSystemKey = 2
GROUP BY [t0].[SourceSystemKey]
UNION
SELECT MAX([t0].[AsAtDateKey]) AS [Date], [t0].[SourceSystemKey] AS [SourceSystem]
FROM [fctWMAUA] (NOLOCK) AS [t0]
WHERE SourceSystemKey = 3
GROUP BY [t0].[SourceSystemKey]
/* AND SO ON TO 9 */
如何创建一个快速分组的索引?
【问题讨论】:
-
你有 SourceSystemKey 的索引吗?如果没有,我认为您可能会引发全表扫描。
-
showplan 显示什么? SourceSystemKey 可以取什么值?
标签: sql sql-server indexing group-by