您的位置:首页 > 博客中心 > 数据库 >

SQL开发中容易忽视的一些小地方(二)

时间:2022-03-14 04:35

原文:

      

                           网络观点一结论:从图上可以非常清楚的看出,三者在执行计划上完成一样.为此本人并不同意网络观点一.表在前与后并不影响最终的执行效率.大家有什么不同的意见望指教.
                           说明:
                                 1:WHERE子句中使用的连接语句,在数据库语言中,被称为隐性连接。INNER JOIN称为显性连接。WHERE 和INNER JOIN产生的连接关系,没有本质区别,结果也一样。但是!隐性连接随着数据库语言的规范和发展,已经逐渐被淘汰,比较新的数据库语言基本上已经抛弃了隐性连接,全部采用显性连接了。
                                 2:join的分类:
                                                  1> inner join:理解为“有效连接”,
                                                  2>left join:理解为“有左显示”,
                                                  3> right join:理解为“有右显示”
                                                  4> full join:理解为“全连接”

                                 3 .join可以分主次表 左联是以左边的表为主,右边的为辅,右联则相反



                           

                                                     结论:通过查询执行计划可以非常清楚的看出,采用了嵌套查询,因为两表的数据量都不大,而且数据大小相当.此时的查询开销为n*n

                                              第二种算法:HASH JOIN :

                                                      定义: 散列连接是做大数据集连接时的常用方式,优化器使用两个表中较小的表(或数据源)利用连接键在内存中建立散列表,然后扫描较大的表并探测散列表,找出与散列表匹配的行。这种方式适用于较小的表完全可以放于内存中的情况,这样总成本就是访问两个表的成本之和。但是在表很大的情况下并不能完全放入内存,这时优化器会将它分割成若干不同的分区,不能放入内存的部分就把该分区写入磁盘的临时段,此时要有较大的临时段从而尽量提高I/O 的性能。

                                                      结论:从图一中可能看出SQL在联接班级表和学生表是采用了hash join方式,因为班级表数据量大,班级表数据量小.这种方式的查询时间复杂度为2n.

                                                      注意点:hash join可能非常容易的变成nested loop,下面的查询为hash join

   select top 10000 a.ID,a.sUserName,b.sClassName from classInfo b
  inner join student a on

   a.classID=b.classID

 

                                                      转换(hash join变nesteed loop):如果在后面组加上排序呢?此是会变成嵌套查询
select top 10000 a.ID,a.sUserName,b.sClassName from classInfo b
  inner join student a on
   a.classID=b.classID
   order by a.ID
                                            
                                                       转换(nesteed loophash join):上面的嵌套查询又可以改选成hash join

select * from(
select top 10000 a.ID,a.sUserName,b.sClassName from classInfo b
  inner join student a on
   a.classID=b.classID) as tbl
  order by ID

                                                第三种算法:排序合并连接

                                                         定义:通常情况下散列连接的效果都比排序合并连接要好,然而如果行源已经被排过序,在执行排序合并连接时不需要再排序了,这时排序合并连接的性能会优于散列连接。

                                  网络观点二结论:inner join和where 在查询效率上没有区别,只是体现形式不同而已.

           总结:我们可以通过查看SQL的执行计划来分析SQL的性能,一句话正确与否不在于说话的人,而在于实践验证结果.本人就表联接谈了自己的理解,如果有不对的地方还望各们指教.

注:

    本文引用:

                http://blog.chinaunix.net/u1/46451/showart.php?id=415529


热门排行

今日推荐

热门手游