0

非常に複雑なマルチ結合TSQLSELECTクエリがあり、約8秒間実行され、約300Kレコードを返します。これは現在受け入れられます。しかし、後でそのクエリの結果を数回再利用する必要があるため、クエリの結果を一時テーブルに挿入しています。SELECTクエリの出力に一致する列を使用して、テーブルが事前に作成されます。しかし、INSERT INTO ... SELECTを実行するとすぐに、実行時間は2倍以上になり20秒以上になります。実行プランでは、クエリコストの46%が「テーブル挿入」に、38%がテーブルスプール(熱心なスプール)に費やされることが示されています。

なぜこれが起こっているのか、そしてそれをどのようにスピードアップするのか、何か考えはありますか?

ありがとう!

4

3 に答える 3

1

言うのが難しい「理由」は、もっと多くの情報が必要になるでしょう。(私のSWAGは、ロギングに関係しているということですが...)

ただし、解決策は、10回のうち9回は、SELECTINTOを使用して一時テーブルを作成することです。

于 2012-04-05T19:00:33.833 に答える
1

まず、標準的なチューニングのテーマを見ていきます。ディスクは機能していますか?十分なリソース(IO、RAM、CPUなど)がありますか?RDBMSにボトルネックはありますか?問題のように聞こえますが、ロックで何が起こっていますか?他のコードでも同様の結果が得られますか?他のコードは実行可能ですか?

于 2012-04-05T19:44:37.320 に答える
1

あなたが提供した情報に基づいて私が提案できるいくつかのこと。ダーティリードを気にしない場合は、いつでもトランザクション分離レベルを変更できます(MS T-SQLを使用している場合)

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
select ...

これにより、クエリ元のデータに対してロックを実行する必要がなくなるため、最初のクエリの処理が高速化される可能性があります。SQL Serverを使用していない場合は、使用しているテクノロジで同じことを行う方法をGoogleで検索してください。

挿入部分については、一時テーブルに挿入すると言いました。データベースは、一時テーブルへの主キーまたはインデックスの追加をサポートしていますか?含まれている場合は、インデックス付きの列であるダミー列をそこに配置します。また、これで通常のデータベーステーブルを使用しようとしましたか?設定によっては、それを使用すると挿入時間が短縮される可能性があります。

于 2012-04-05T20:14:26.380 に答える