5

なぜ、次のようなクエリを開くとき:

WHERE (statement1) AND ((statement2) OR (statement3))

SSMS クエリ デザイナーは、次の構文にリファクタリングしますか。

WHERE (statement1) AND (statement2) OR (statement1) AND (statement3)

ors の前に ands を実行して、SQL サーバーがクエリを解析する方法と関係があると思いますか?

最終的な最適化のためのステートメントの最適な順序の一般的なルールはありますか?

私自身のテストを実行したところ、2 番目のクエリで処理時間が 0.5 ミリ秒短縮されました。小さいことはわかっていますが、クエリの複雑さとともに増加し(それでもほとんど違いはありません)、SQLサーバーの仕組みに一般的な関心があります。

4

3 に答える 3

7

実際の SQL 実行とは関係ありません。あなたが知っているほとんどの言語とは異なり、T-SQLにはブール演算子の短絡1がなく、「or の前に and を実行する」などの概念は意味がありません。評価の順序は完全にクエリ オプティマイザーの決定によって決定され、最終的には完全に異なるものになる可能性があります。あなたが書くもの、またはあなたが期待するものから。

表示される式の書き換えは、完全に SSMS クエリ設計の内部パーサーのアーティファクトのようです。

1 または、ブール式の短絡は、式の書き方によって命令的に決定することはできません。実際のランタイム オペレーターの短絡発生しますが、発生するかどうかいつ発生するかはわかりません。

于 2012-10-10T14:34:35.727 に答える
2

一般に、SQL Server が Where 句を評価する方法について保証はありません。オプティマイザーは常に、クエリを実行する最も効率的な方法を見つけようとします。

実行順序を決定するには、クエリの実行プランを取得する必要があります (SSMS 経由で取得できます)。ただし、この計画は、オプティマイザーが現在のさまざまな統計とリソースを考慮して最適なクエリであると判断する内容に応じて変更される可能性があることに注意してください。

于 2012-10-10T14:31:13.500 に答える
1

ほとんどの場合、パフォーマンスを向上させるために SQL がクエリを最適化する方法を理解する必要はありません。SQLは、あなたが知らないあなたのデータについて知っています:-)

通常、最善の方法は、最適な方法で情報を取得するために必要なインデックスを SQL に与えることです。次に、最適な方法で実行されるようにクエリが最適化されます。

これを、コードを最適化するために多くの変更を行う通常のコンパイラと比較してください。通常できる最善のことは、保守可能なコードを作成することであり、残りはコンパイラーが処理します。SQL もまったく同じです。取得したいものを理解すると、SQL が最適な方法で取得します。

于 2012-10-10T14:35:42.837 に答える