2

私の MS Sql Server Database には 4 つのビューがあり、それらはすべて非常に高速 (2 秒未満) で、すべて 50 行未満を返します。

しかし、これら 4 つのビュー (左外部結合) を結合するクエリを作成すると、完了するまでにほぼ 1 分かかるクエリが取得されます。

ここでクエリオプティマイザーが悪い仕事をしていると思います。これを高速化する方法はありますか。4 つのビューのそれぞれをテーブルにコピーして、それらを結合したくなるのですが、これは回避策が多すぎるように思えます。

(補足:ビューは別のデータベースからのものであり、そこでは何も変更できないため、テーブルにインデックスを設定することはできません。したがって、これはオプションではありません)

EDIT:申し訳ありませんが、SQLクエリを投稿しても役に立たないと思います。それらは非常に複雑で、約 50 の異なるテーブルを使用します。一部のデータベースで実行計画を生成するための十分なアクセス権がないため、実行計画を投稿することもできません。

現時点での最善の解決策は、各クエリの結果を格納する一時テーブルを生成することだと思います。

4

3 に答える 3

5

インデックスに触れられない場合は、高速化するために、4 つのクエリの結果を 4 つの一時テーブルに入れて結合することができます。

これは、ストアド プロシージャで行うことができます。

于 2012-07-30T15:18:12.757 に答える
3

結合中にビューのテーブルを派生させることができます。

例: このクエリの代わりに

     SELECT V1.* FROM dbo.View1 AS V1 INNER JOIN dbo.View2 as V2
     ON V1.Column1=V2.Column1;

以下のクエリを使用できます

     SELECT V1.* FROM (SELECT * FROM dbo.View1) AS V1 INNER JOIN (SELECT * FROM dbo.View2) AS V2
     ON V1.Column1=V2.Column1;

これによりパフォーマンスが向上することを願っています。

于 2012-11-02T07:06:01.343 に答える
1

多数の列がある場合は、必要な列のみを含めます。特に、列に多くの数学演算がある場合、データベースは結果を返すときにすべての数値を変換する必要があります。

もう 1 つのポイントは、巨大な結合を作成して 1 つのクエリを実行するよりも、3 つのクエリを実行する方が良い場合があるということです。

ただし、具体的な情報がなければ、一般論を超えた適切なアドバイスを提供することは困難です。

于 2012-07-30T15:19:50.257 に答える