对于from字段后面的表,大家对于多张表的排序有思考过么?
1、推荐书写方式
select * from Users
joinPoints
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查询语句,这样由我们指定合并的路径就绝对不会出错了。
小弟愚见,请大家指教。