1

ユーザーが SQL Server 2008 データベースに対して SQL ステートメントを実行するマスクを持っているアプリケーションがあります。さらに、ユーザーはマスクにパラメーターを設定できます。「飛行機」と「車」の 2 つの選択肢を持つドロップダウンである、1 つのパラメータを持つマスクを考えてみましょう。

ユーザーが「車」を選択して「実行」ボタンを押すと、マスクで以前に構成した次の SQL ステートメントがデータベースにヒットします。

SELECT cars.id, cars.name
FROM cars
WHERE 'Cars' = 'Cars'

UNION ALL

SELECT planes.id, planes.name
FROM planes
WHERE 'Planes' = 'Cars'

(私のアプリケーションのクエリは多くの JOINS などではるかに複雑であるため、これは非常に構成された例です...)

2 番目の部分を SQL Server Management Studio に貼り付け、いくつかのパラメーターを設定して [実行] をクリックしても、クエリが完了するまでに数秒かかり、結果は空になります。

私の質問は次のとおりです。SQL Server が 2 番目の SELECT ステートメントで実際に何もする必要がないことを認識できるように、2 番目の部分を最適化するにはどうすればよいですか?

編集:

2 番目の (「デッド」) クエリがしばらくの間実行される理由は次のとおりです。クエリの内部には、WHERE 句のサブ SELECT と共に JOINS があります。まあ言ってみれば

SELECT planes.id, planes.name
FROM planes
INNER JOIN very_complex_colour_view colours
     ON colours.id = planes.colour.id
WHERE 'Planes' = 'Cars' 

実際、「planes」テーブルでさえ、それ自体が複雑なビューです。

4

2 に答える 2

0

システムで次のクエリを実行すると:

select *
from <really big table that is not in the cache>
where 'planes' = 'cars'

初回は約1秒、2回目以降はすぐに結果が返ってきました。

実際のクエリは、この例よりも複雑であると思われます。そして、簡素化により問題が解消されます。結合で上記を試しても、基本的にパフォーマンスヒットはありません。

私が見ている実行計画に基づいて、SQL Server は定数が常に false であることを認識しています。次のクエリ:

select *
from Published_prev2..table1 sv join
     Published_prev2..table2 sl
     on sv.id= sl.id
where 'planes' = 'cars'

実行計画のコンスタント スキャンを生成します。cars' = ' を使用した同じクエリcarsは、結合などを含むより複雑なプランを生成します。

于 2013-06-06T14:28:52.530 に答える