mssql サーバー 2008r2 を使用しています。私は、19 店舗の売上高データを日ごとにアイテムごとに含む巨大なテーブルを持っています。約1億行あります。しかし、分割ビューを使用すると、クエリを簡単に実行できます。
テーブルの構造は次のようになります。
- 店舗名
- アイテムID
- 日にち
- ひっくり返す
- 販売数量
出力レポートは次のようになります: アイテム ID、日付、store_1.turnover、store_1.quantity、store_2.turnover、store_2.quantity....
この種のレポートを作成するには、次のクエリを使用します。
WITH cte_sell AS(
SELECT *
FROM view_turnover
WHERE date BETWEEN '130413' and '130418' )
SELECT a.item_id,a.date,
store_1.turnover,store_1.quantity,
store_2.turnover,store_2.quantity,
store_3.turnover,store_3.quantity
FROM (SELECT DISTINCT item_id,date FROM cte_sell) as a
LEFT JOIN (SELECT * FROM cte_sell WHERE store='Store 1') as Store_1 ON a.item_id=store_1.item_id and a.date=store_1.date
LEFT JOIN (SELECT * FROM cte_sell WHERE store='Store 2') as Store_2 ON a.item_id=store_2.item_id and a.date=store_2.date
LEFT JOIN (SELECT * FROM cte_sell WHERE store='Store 3') as Store_3 ON a.item_id=store_3.item_id and a.date=store_3.date
クエリを理解していただければ幸いです。
クエリは、14 ~ 15 のストア (14 15 LEFT JOIN) に対して 10 秒未満で実行されます。これは適切です。しかし、問題は、19 のストア (19 の LEFT JOIN) をすべて選択すると、クエリが劇的に遅くなることです。完了するまでに 2 ~ 3 分かかる場合があります。
実行計画の作成も非常に長くなります。
- 12店舗限定2秒
- 19店舗22秒
テーブルの結合に制限はありますか? 巨大なクエリを制御するサーバーパラメーターがいくつかあると思います。クエリまたはサーバーを最適化する方法を知っている人はいますか?
最悪の場合、サーバーがフリーズすることがあります。クエリが 9 時と 12 時に実行されている間に、トレース ファイルを作成しました。9 時に、クエリの実行に 2 分かかりました。12 時に、構成マネージャーから SQL サービスを再起動できないため、10 分後にコンピューターを再起動する必要がありました。
スクリーンショットを添付できません。
アクティビティ モニターでは、プロセスは一時停止状態にあります。待機タイプ: CXPACKET 待機リソース: exchange.... 申し訳ありませんが、ロックについてはよくわかりません。
管理スタジオから接続しようとしたところ、次のメッセージが表示されました。サーバーとの接続は正常に確立されましたが、ログイン プロセス中にエラーが発生しました。(プロバイダー: TCP プロバイダー、エラー:0 (ハンガリー語からの翻訳): 既存の接続がリモート マシンによって強制的に閉じられました。