inside sql server 2008 - logical query processing


2008年からinside sql server 2005を読み始め、inside sql server 2008まで、断片的に読んでいたようで、少しも整理したことがなく、自分が本当に知っているものがどれだけあるか分からない.だからこれから1編読んだらメモを取ります.
これはLogical query processing,論理クエリ処理プロセスについてです.
select distinct | top (n) Filed1, Field2, Field3, ….Fieldn from dbo.table1 tb1 with(Nolock) inner join dbo.table2 tb2 with(no lock) on tbl.Field1 = tb2.Field1 where tbl1.Field2 = 'xxx' group by tb1.Field3 having sum(tb1.Field4) > 20 order by tb2.Field2

自分の理解について:1)2枚の表のデカルト積を先に処理することは,1つのfull outer joinに相当する2)join typeによると,ここではinner joinであるため,それぞれ一部を切り捨てて別の表に対応する値が見つからない記録3)where条件に合わない記録を切り捨てる4)groupbyを作りhaving条件に合わない記録を切り捨てる5)distinctを行い,top(n)6)はtb 2.Field 2ソート
さらに詳しく説明すると、Fromの後ろには4つのtable演算があります:1)Join;2) Apply ; 3) Pivot; 4) Unpivot
1)Joinの処理フロー:-まずデカルト積を計算する;-on条件に合致しない記録を破棄します.-left,right outer joinに基づいてouter部分の記録を補う
2)Applyの処理フロー:-右のテーブルデータを左のテーブルに適用してから-outer applyまたはcross applyに基づいて対応するレコードを補完または破棄する
さらに4つのset集合演算:union[all],except,intersect
1query 1 
   (2)   <set__operation>
   (1) query 2
   (3)   [ Order by <order_by_list> ]

この場所は非常に重要であり,query 1,query 2は同時に計算されるため,集合操作はinよりも速くなる.
select a.*, b.* from dbo.table1 tbl1 with(no lock) inner join dbo.table2 tbl2 with(no lock) on tbl1.field1 = tbl2.field1 where tbl1.field2 in('xxx','yyy') or tbl2.field2 in('xxx','yyy') select a.*,b.* from dbo.table1 tbl1 with(no lock) inner join dbo.table2 tbl2 with(no lock) on tbl1.field1 = tbl2.field1 where tbl1.field2 in('xxx','yyy') union all select a.*,b.* from dbo.table1 tbl1 with(no lock) inner join dbo.table2 tbl2 with(no lock) on tbl1.field1 = tbl2.field1 where tbl2.field2 in('xxx','yyy')