【问题标题】:SQL Server - GROUP BY with HAVING on more than 10 million rows hitting performanceSQL Server - GROUP BY 超过 1000 万行达到性能
【发布时间】:2019-08-11 12:09:39
【问题描述】:

SQL Server - 如何在超过 1000 万行上使用 GROUP BY 和 HAVING 子句的 30 + OR 条件来提高查询性能

【问题讨论】:

  • 索引是提高性能的最佳方式,另请参阅 SQL Server Management Studio 的执行计划,了解哪些地方需要花费大量时间。
  • 深呼吸,想想是什么让你陷入了这样的境地:)
  • 考虑使用索引视图。

标签: sql sql-server query-performance


【解决方案1】:

如果您向我们展示您的查询(如果需要,您可以对其进行混淆),我们会更有帮助,但通常您可以创建计算的、持久的、位列来为您预先计算 OR 语句:

https://blog.sqlauthority.com/2016/04/27/sql-server-computed-column-conditions-case-statement/

代替:

HAVING [A] > 100000 OR [B] < 1000

用途:

ALTER TABLE [FOO]
ADD IsFiltered AS CASE WHEN [A] > 100000 OR [B] < 1000 THEN 1 ELSE 0 END PERSISTED

然后将 [IsFiltered] 添加到索引以提高速度。您还可以创建函数来为您执行计算:

formula for computed column based on different table's column

或者,是时候硬着头皮在 SSAS 多维数据集中创建这些计算了。这可能是一个巨大的飞跃,但多维数据集可以为您的数据提供很多洞察力。

【讨论】:

  • 考虑到这个问题有多糟糕,这是一个很好的答案。干得好!
  • 我不明白。计算列不能计算聚合——至少是有效的。如果having 在按键组中,则该过滤应移至where 子句。
  • @GordonLinoff -- 我认为关键是,如果在“条件”中使用计算,则可以为每一行预先计算,以在分组期间逐步节省时间。跨度>
  • @Hogan。 . . GROUP BY 之后的计算列不可用。仅引用计算列不会有太大帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-09
  • 2015-03-22
  • 2016-03-16
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多