0

我有一个性能糟糕的查询:

select COUNT(distinct accession_id) count,MONTH(received_date) month,YEAR(received_date) year
into #tmpCounts
from F_ACCESSION_DAILY
where CLIENT_ID not in (select clientid from SalesDWH..TestPractices)
group by MONTH(received_date),YEAR(received_date)

我不想等待这个查询,而是想创建一个变量或一个视图或任何其他我可以存储在服务器上的东西,并让服务器每 24 小时自动计算一次。

我想然后能够做一个select * from #tmpCounts

我怎样才能做到这一点?

4

3 回答 3

1

除了您的性能问题和尝试每天一次预构建的替代方法...您要处理多少条记录以处理此查询。

此外,我会更改查询,因为 IN ( SUBSELECT ) 总是很糟糕。我将更改为客户端表的 LEFT-JOIN 并测试是否为 NULL

select 
      YEAR(FAD.received_date) year,
      MONTH(FAD.received_date) month,
      COUNT(distinct FAD.accession_id) count
   from 
      F_ACCESSION_DAILY FAD
         LEFT JOIN SalesDWH..TestPractices TP
            on FAD.Client_ID = TP.ClientID
   where 
      TP.CLIENT_ID IS NULL
   group by 
      YEAR(FAD.received_date),
      MONTH(FAD.received_date)

我还将确保在收到日期的 ACCESSION 表上有一个索引,在其 ClientID 上有你的 TestPractices 表

于 2012-11-26T21:32:19.190 回答
1

我不知道这是否满足您的需要,但我会创建一个表来存储它,使用 SQL Server 代理创建一个仅截断表的作业,运行您上面提到的查询并插入行。从那时起,您可以通过这种方式查询表以获取这些结果。

顺便说一句,截断和加载表的最简单方法可能是运行一个非常简单的 SSIS 包。

于 2012-11-26T21:23:17.157 回答
1

考虑创建索引视图,而不是创建缓存表。有一些限制,但您可能无需太多额外的处理或代码就可以显着提高性能。

以下是一些基本信息:

http://beyondrelational.com/quiz/sqlserver/tsql/2011/questions/advantage-and-disadvantage-of-using-indexed-view-in-sql-server.aspx

于 2012-11-27T14:38:49.960 回答