SQL SERVER中from数据源解析过程

来源:互联网 发布:用java做音乐网站 编辑:程序博客网 时间:2024/06/05 17:28

对于from字段后面的表,大家对于多张表的排序有思考过么?

1、推荐书写方式

select * from Users

join
Points
on 
Users.UserID=Points.UserID
join
Courses
on
Points.CousreID=Courses.CourseID

2、
SELECT * from Users,Points,Courses
WHERE Users.UserID=Points.UserID
AND Points.CousreID=Courses.CourseID
3、
SELECT * from Points,Courses,Users
WHERE Users.UserID=Points.UserID
AND Points.CousreID=Courses.CourseID
4、
SELECT * from Courses,Points,Users

WHERE Users.UserID=Points.UserID

AND Points.CousreID=Courses.CourseID



对于出来的结果集也是一目了然。

我不知道微软是怎么处理这个数据源集合的,不过由以上分析可知:SQL SERVER 的解析器是从左往有解析数据源,依次做笛卡尔积

所以这也为我们做数据优化给了一些建议。

每次做完依次笛卡尔积,SQL SERVER上网解析器就会从where条件筛选器中把不符合的数据剔除,所以我们把结果集小的放在前面就可以避免出现大的笛卡尔积存在。



但是我很不解的是,SQL SERVER 2008R2的联机丛书里面提到了SQL查询优化器,这个东西是怎么运行的我就不得而知了。

不过从文档来看,微软是自己对这个部分有着优化过程的,而oracle的数据库没有做。

ORACLE数据库SQL解析器是从右至左解析,从上面结果来看SQL SERVER是从左至右的。

作为一名DBA来说,这一些细节都可能决定着数据库的性能。


所以我们也疑惑了,这一些数据库的SQL 解析器可能都有着自己的特色,要是我们知道并且用得好肯定是皆大欢喜,但是要是我们不知道或者是错误的理解了,那岂不是

自己挖一个坑给自己。

所以我们应该怎么办呐?

对于上面我所列举的这个例子,我想大家还是按我的推荐方式来写SQL查询语句,这样由我们指定合并的路径就绝对不会出错了。


小弟愚见,请大家指教。


0 0
原创粉丝点击