SQL Server-分组方式,超过1000万行,达到性能要求
SQL Server-如何通过GROUP BY和HAVING子句30+或1000多万行上的条件来提高查询性能如果您向我们展示您的查询(如果需要,您可以对其进行模糊处理),我们会更有帮助,但一般来说,您可以创建计算的、持久的、位列,为您预先计算OR语句: 而不是:SQL Server-分组方式,超过1000万行,达到性能要求,sql,sql-server,query-performance,Sql,Sql Server,Query Performance,SQL Server-如何通过GROUP BY和HAVING子句30+或1000多万行上的条件来提高查询性能如果您向我们展示您的查询(如果需要,您可以对其进行模糊处理),我们会更有帮助,但一般来说,您可以创建计算的、持久的、位列,为您预先计算OR语句: 而不是: HAVING [A] > 100000 OR [B] < 1000 具有[A]>100000或[B]100000或[B]
HAVING [A] > 100000 OR [B] < 1000
具有[A]>100000或[B]<1000
使用:
altertable[FOO]
如果[A]>100000或[B]<1000,则添加IsFiltered,然后保留1,否则0结束
然后将[IsFiltered]添加到索引中以获得额外的速度。您还可以创建函数来执行计算:
或者,是时候咬紧牙关,在SSAS多维数据集中创建这些计算了。这可能是一个巨大的飞跃,但多维数据集可以提供对数据的许多洞察。索引是提高性能的最佳方法,另请参阅SQL server Management studio中的执行计划,以了解在哪些方面花费了大量时间。深吸一口气,想想是什么让您处于这样的境地:)考虑使用索引视图。考虑到问题的严重性,这是一个很好的答案。干得好我不明白。计算列无法计算聚合,至少不能有效地计算聚合。如果group by keys上有
having
,那么过滤应该移到where
子句中。@GordonLinoff--我想问题是,如果在“条件”中要使用计算,可以对每一行进行预计算,以节省逐步分组的时间。@Hogan。在分组依据
之后,计算列不可用。只引用计算列不会有多大帮助。
ALTER TABLE [FOO]
ADD IsFiltered AS CASE WHEN [A] > 100000 OR [B] < 1000 THEN 1 ELSE 0 END PERSISTED