T-SQL 查询优化之联接顺序
来源:互联网 发布:mcabook软件关不掉 编辑:程序博客网 时间:2024/05/17 06:09
联接顺序,是查询优化的最复杂问题之一,从七十年代以来,一直是广泛探索的主题。随着联接表的增加,搜索空间的扩大,必然导致计划数量的增大。
联接一次只能包括两个表,因此,N个表联接有 N-1次联接。当然,下一个联接不需要等到上一个联接完成。
两个属性:
1,交换
A JOIN B = B JOIN A
它确定那个表作为第一个表,例如,在 NESTED LOOP JOIN 中,第一个表是作为外部表,第二个是内部表;在 HASH JOIN 中,第一个表作为 BUILD,第二个是 PROBE。
2,相关
(A JOIN B) JOIN C = A JOIN (B JOIN C)
它确定表联接的顺序,例如,等号左边,首先 A JOIN B,然后中间结果再联接 C,而右边是,先 B JOIN C,后结果再联接A。
毫无疑问,联接的交换和相关属性,产生了表联接的不同排列,而每个排列的开销是不同的,当然,最终的决定在于查询优化器。
好吧,看个例子:
USE AdventureWorksGOSELECT FirstName, LastNameFROM Person.Contact AS C JOIN Sales.Individual AS I ON C.ContactID = I.ContactID JOIN Sales.Customer AS Cu ON I.CustomerID = Cu.CustomerIDWHERE Cu.CustomerType = 'I'
从上面执行计划可以看到,表联接并没有按照T-SQL的输入顺序进行,而是,先CUSTOMER AND INDIVIUDAL,后再联接 CONTACT。
执行如下语句:
SELECT FirstName, LastNameFROM Person.Contact AS C JOIN Sales.Individual AS I ON C.ContactID = I.ContactID JOIN Sales.Customer AS Cu ON I.CustomerID = Cu.CustomerIDWHERE Cu.CustomerType = 'I'OPTION (FORCE ORDER)
这里,我们强制按照T-SQL联接,但是,开销增大了,第一个占总开销的38%,强制的是62%。
最后,应当知道,
1,如果是 左深联接,结果是 N!;
2,如果是 树丛联接,结果是 (2N-2)!/(N-1)!。
- T-SQL 查询优化之联接顺序
- 【T-SQL基础】02.联接查询
- T-SQL 查询优化之扫描搜寻
- T-SQL 查询优化之聚合
- T-SQL查询优化
- sql的联接查询
- SQL联接查询
- T-SQL查询优化乱弹
- T-SQL查询优化乱弹
- T-SQL查询优化乱弹
- T-SQL 查询优化之链接和平行
- T-SQL查询执行顺序(二)
- T-SQL查询处理执行顺序
- T-SQL查询处理执行顺序
- T-sql语句查询执行顺序
- T-sql语句查询执行顺序
- T-sql语句查询执行顺序
- SQL Server 中的联接查询
- htmlcomplet.vim 插件bug修复方法 line 304, E121: Undefined
- 2012-12-23-晚上IO练习,读取拷贝文件和视频
- java 中用rmi实现helloWorld
- 用命令查找端口占用程序
- 读入一个整数,判断该整数是否回文数(回文数是指从左往右读以及从右往左读的结果相同的数)。
- T-SQL 查询优化之联接顺序
- C++基础:继承与派生(构造 析构函数 显式访问)
- C++基础:多态 虚函数
- android SharePrefereces的使用入门2
- iphone bu解决方法之一
- 验证歌德巴赫猜想:任何一个充分大的偶数都可以表示为两个素数之和。请输入一个偶数,将其表示成两个素数之和。
- 将算法写成程序的方法
- How To Mod: BOOT & RECOVERY
- 输入一个十进制数,将其转换为N进制数。(0<N<=16,先输入十进制数,再输入N)