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

パフォーマンスの問題と、1日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)

また、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 に答える