回答

收藏

如何在Sql Server中为group by构造索引

技术问答 技术问答 255 人阅读 | 0 人回复 | 2023-09-14

下面的简单查询需要很长时间(几分钟)来执行。
& C4 l) e, f/ A% O$ [6 h我有一个索引:$ l5 c& Z9 {4 ^% K; u: _
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 GROUP BY [t0].[SourceSystemKey]统计信息如下:
4 ~6 Z* W# f$ E6 I逻辑读取1827978
$ S0 l# ~. x3 g5 C% `物理读取1113
: w$ Q( ]) ?! K. p( P' O提前阅读1806459
采用完全相同的查询,并将其重新格式化为以下格式,可获得以下统计信息:0 K, Q" t' P3 r+ B, d
逻辑读取36/ F0 a3 q% R  m6 l8 u
物理读取0( D- v6 g& ?# L
提前阅读0
执行需要31毫秒。1 q6 f$ y3 S( P/ [. ?2 n7 ]
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 */如何快速建立索引进行分组?# }- K: u7 n: d: D! }
                                                               
9 |* X; {3 r4 R/ [+ D4 M" k- K    解决方案:                                                               
) D2 v& d4 V% ~. z- G: D! O                                                                尝试告诉SQL Server使用索引:) Z4 X. h" Z' G( k: e
...FROM [fctWMAUA] (NOLOCK,INDEX(IX)) AS [t0]...确保该表的统计信息是最新的:# Z( A  Z  z0 `0 S' z) I2 [
UPDATE STATISTICS [fctWMAUA]请同时打开两个查询显示计划,以获得更好的答案:% o& m$ X/ p6 S
SET SHOWPLAN_TEXT ON并将结果添加到您的问题中。
0 `4 Q. V' L- v- o你也可以没有GROUP BY编写查询。例如,您可以使用排他性LEFT JOIN排除日期较早的行:3 {2 }4 l0 \% |0 X5 n1 o" `
select cur.SourceSystemKey,cur.datefrom fctWMAUA curleft join fctWMAUA next    on next.SourceSystemKey = next.SourceSystemKey    and next.date > cur.datewhere next.SourceSystemKey is nulland cur.SourceSystemKey in 这可能出乎意料的快,但我认为它不能被击败UNION。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则