当前位置: 首页 > 面试题库 >

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

苏昂雄
2023-03-14
问题内容

下面的简单查询需要很长时间(几分钟)来执行。

我有一个索引:

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 */

我如何快速建立索引以进行分组?


问题答案:

尝试告诉SQL Server使用索引:

...
FROM [fctWMAUA] (NOLOCK, INDEX(IX)) AS [t0]
...

确保该表的统计信息是最新的:

UPDATE STATISTICS [fctWMAUA]

为了获得更好的答案,请同时打开两个查询的显示计划:

SET SHOWPLAN_TEXT ON

并将结果添加到您的问题中。

您也可以在没有GROUP BY的情况下编写查询。例如,您可以使用排他的LEFT JOIN排除具有较早日期的行:

select cur.SourceSystemKey, cur.date
from fctWMAUA cur
left join fctWMAUA next
    on next.SourceSystemKey = next.SourceSystemKey
    and next.date > cur.date
where next.SourceSystemKey is null
and cur.SourceSystemKey in (1,2,3,4,5,6,7,8,9)

这可能出乎意料的快,但是我认为它不能击败UNION。



 类似资料:
  • 我对kotlin中的收藏感到困惑。 结构有点复杂。 现在我想得到一张地图,<code>地图 我被困在这里

  • 本文向大家介绍SQLSERVER中忽略索引提示,包括了SQLSERVER中忽略索引提示的使用技巧和注意事项,需要的朋友参考一下 当我们想让某条查询语句利用某个索引的时候,我们一般会在查询语句里加索引提示,就像这样 当在生产环境里面,由于这个索引提示的原因,优化器一般不会再去考虑其他的索引,那有时候这个索引提示可能会导致查询变慢 经过你的测试,发现确实是因为这个索引提示的关系导致查询变慢,但是SQL

  • 问题内容: 我试图将数据插入到具有表列 (名称,值) 与 并得到以下异常: 另外,我也不能使用本机查询插入记录: 抛出另一个异常: 问题是: 查询字符串有什么问题? 非常感谢。 问题答案: 我解决了这个问题。 根据此, JPA中没有INSERT语句。 但是我可以用本机查询解决这个问题:我错误地放置了一个多余的;在查询末尾,因此可以通过将其删除来解决问题。

  • 问题内容: 我在python中有一个文件名,我想从所有文件名中构造一个。 这似乎不起作用。怎么办 问题答案: 如果您具有可散列对象的列表(文件名可能是字符串,那么它们应该算在内): 您可以直接构造集合: 实际上,将这种方式与 任何可迭代对象一起使用! (鸭子打字不好吗?) 如果要迭代进行: 但是很少需要这样做。我只提到它是因为该方法非常有用。

  • 问题内容: 1> 套装2排 2> 套装2排 3> 一组1行 为什么查询方式1>和2>会得到相同的结果?count(*)和count(somefiled)之间没有什么区别? 另外,查询2>和3>导致的结果不同,为什么 groupby 如此神奇?它是如何工作的? 更新:我正在使用MySQL5.1。:) 问题答案: 选择会给您一个结果集。如果按字段分组选择,则结果集的行将按该字段分组,并且结果集的每一行

  • 问题内容: 我想创建一个KeyValue类,但以通用方式,这就是我写的内容: 错误显示:“令牌“>上的语法错误”,此令牌后应有标识符” 那我该如何在Java中创建一个通用构造函数呢? 问题答案: 您需要从构造函数的签名中删除:它已经隐式存在。