2016-08-23 6 views
0

私の質問は:節に実行順がありますか?INNER JOININNERで複数の「オン」条件で注文するJoin

私のテーブルはそれぞれのテーブルに約100万エントリ入っていますので、私はそれらを簡単に結びつける必要があり、私は自分のクエリを最適化したいと思います。ここで

は私の例です:

高価な検証がされている
SELECT * 

FROM TableA 
INNER JOIN TableB ON 

(
    [costly validations] 
) 
AND 

TableB.Date1 > '2016-01-01' AND 
TableA.Date2 > '2016-01-01' AND 
TableB.Date1 = TableA.Date2 AND 
TableA.Field1 = TableB.Field1 AND 
TableA.Field2 = TableB.Field2 AND 
TableA.Field3 = TableB.Field3 AND 
TableA.Field4 = TableB.Field18 

​​

検証アイデア:私たちはいくつかの文字列から、私たちは非常に古いアプリケーションでのドル記号($)を除去し、文字列をお金に変換する前に第三者のアプリケーションによって受信されます。サードパーティのアプリケーションが$記号を削除したので、今度は番号から数字を削除しています(oops)。アプリケーションは修正されていますが、データが破損しています。

質問です:ON句の順序は、クエリのパフォーマンスや最適化に影響しますか?たとえば、私が高価な検証をON節の最後に置いた場合、変更はありますか(私は私の側には何も見ませんでした)。

T-SQLは私よりスマートなので、私の前提はNoです。

ので、この:この対

ON 
(
    [costly validations] 
) 
AND 

TableB.Date1 > '2016-01-01' AND 
TableA.Date2 > '2016-01-01' AND 
TableB.Date1 = TableA.Date2 AND 
TableA.Field1 = TableB.Field1 AND 
TableA.Field2 = TableB.Field2 AND 
TableA.Field3 = TableB.Field3 AND 
TableA.Field4 = TableB.Field18 

ON 
TableB.Date1 > '2016-01-01' AND 
TableA.Date2 > '2016-01-01' AND 
TableB.Date1 = TableA.Date2 AND 
TableA.Field1 = TableB.Field1 AND 
TableA.Field2 = TableB.Field2 AND 
TableA.Field3 = TableB.Field3 AND 
TableA.Field4 = TableB.Field18 AND 
(
    [costly validations] 
) 

答えて

3

評価の順序に保証はありません。両方とも単一のON句の中にあり、複数のON句とWHERE句にまたがっています。

再注文評価は、それらが論理的な順序と一致する結果をもたらす提供するデータベースシステム無料ですべてのことは、標準によって必要とされる特定のは、特定の論理順に評価されていること。 SQLはそれをさらに越えているが、場合によっては、保証されたガードを持つコードを書くことが非常に難しい(例えば、a/bを実行したい場合、ゼロエラーによる除算を避けたい場合、フープを飛ばしなければならない)あなたはそのエラーが表示されません。あなただけのb!=0 and a/b = <something>を書き込むことはできません


を確保するためには、これは彼らのブールANDOR演算子は短いを実行するように定義されている他の言語の多くとは異なります - 回路を使用し、左辺の式が不十分で全体を決定できない場合は、右辺の式のみを評価します結果。

関連する問題