SQL语句分析:ON与WHERE的比较_简单嵌套查询与非嵌套查询的比较
2010-01-07 00:00:00 来源:WEB开发网接着,在上面两个执行计划的图中又发现一个小问题,为什么明明是select t1 inner join t2 inner join t3,执行计划却把t1和t3先inner join(t1.id = t3.id)再跟t2 inner join(t2.id = t3.id)起来?
经过三个表,四个表,五个表进行连接测试,发现这些顺序都是不确定的。很可能这些顺序是根据SQL优化器内的算法所决定的,由于没有源代码,所以无从考究。
(感谢Keep Walking的补充:
“可以指定顺序,force order选项,和keep plan选项数量级,索引,统计的不同都可以导致顺序变化”。
我Google了一下option force order和option keep plan,发现SQL优化器做了很多事情,在这文章就不列出来了,大家有兴趣可以Goo一下。)
PS1:经测试,在inner join on后面t1.id = t2.id与t2.id = t1.id等价
PS2:经过songmc指出,发现了一些问题。补充对left join的测试。
二 :left join
附上songmc的代码:
DECLARE @a TABLE(id INT IDENTITY,NAME VARCHAR(20))
INSERT INTO @a SELECT 'aa'
UNION ALL SELECT 'bb'
UNION ALL SELECT 'cc'
UNION ALL SELECT 'dd'
DECLARE @b TABLE(id INT IDENTITY,NAME VARCHAR(20))
INSERT INTO @b SELECT 'ee'
UNION ALL SELECT 'ff'
UNION ALL SELECT 'gg'
UNION ALL SELECT 'hh'
DECLARE @c TABLE (id INT IDENTITY,NAME VARCHAR(20))
INSERT INTO @c SELECT 'ii'
UNION ALL SELECT 'jj'
UNION ALL SELECT 'kk'
UNION ALL SELECT 'll'
--a.
SELECT
*
FROM @a a
LEFT JOIN @b b ON a.id = b.id
LEFT JOIN @c c ON b.id = c.id
WHERE a.NAME != 'aa'
--b.
SELECT
*
FROM @a a
LEFT JOIN @b b ON a.id = b.id
LEFT JOIN @c c ON b.id = c.id AND
a.NAME != 'aa'
- ››sql server自动生成批量执行SQL脚本的批处理
- ››sql server 2008亿万数据性能优化
- ››SQL Server 2008清空数据库日志方法
- ››sqlserver安装和简单的使用
- ››SQL Sever 2008 R2 数据库管理
- ››SQL SERVER无法安装成功,sqlstp.log文件提示[未发...
- ››Sql Server中通过父记录查找出所有关联的子记录
- ››SqlServer触发器、存储过程和函数
- ››SQL Server 中的事务(含义,属性,管理)
- ››Sqlite数据库插入和读取图片数据
- ››Sql server 2005拒绝了对对象 'xx表' (数...
- ››Sql server 2005拒绝了对对象 'xx表' (数...
更多精彩
赞助商链接