通往性能优化的天堂-地狱 JOIN方法说明

豆豆网   技术应用频道   2007年06月27日  【字号: 收藏本文

内容摘要:想当年,也是一提SQL Server,就觉得它的性能没法跟Oracle相比,一提到大数据处理就想到Oracle。自己一路走来,在本地blog上记录了很多优化方面的post,对的错的都有,没有时间系列的整理出来,这篇文章将join方法的概念稍微整理在一起,给大家个参考。通过查资料了解里面提到的各种概念,在实际中不断验证总结,完全可以对数据库一步步深入理解下去的。

  另外关于执行计划的一些补充说明:1. 执行计划中显示的信息,都是一个“评估”的结果,不是100%准确的信息,例如记录数量是取自统计信息,I/O成本、CPU成本来自执行计划生成过程中基于统计信息等得出的评估结果。2. 执行计划不一定准确,一方面受SQL Server维护的统计信息准确性的影响,另一方面SQL语句编译时刻与执行时刻的环境(内存使用状况、CPU状况等)可能会不一样。

  关于统计信息、I/O成本和CPU成本的评估、SQL语句的编译和执行过程,这里不再深入。另外尽管执行计划不一定准确,但它仍是SQL语句分析最重要的依据,因为你可以理解为,绝大部分情况下,SQL Server是以这种方式来执行的。

  JOIN方法说明

  数据库中,象tableA inner join tableB、tableA left out join tableB这样的SQL语句是如何执行join操作的?就是说SQL Server使用什么算法实现两个表数据的join操作?

  SQL Server 2000有三种方式:nested loop、merge、hash。Oracle也是使用这三种方式,不过Oracle选择使用nested loop的条件跟SQL Server有点差别,内存管理机制跟SQL Server不一样,因此查看执行计划,Oracle中nested loop运用非常多,而merge和hash方式相对较少,SQL Server中,merge跟hash方式则是非常普遍。

  以SQL Server 2000为例对这三种方式进行说明,穿插在里面讲解执行计划的一些初级使用。

  1. nested loop join

  1.1 示例SQL

  select ... from tableA inner join tableB on tableA.col1=tableB.col1 where tableA.col2=? and tableB.col2=?

  tableA中没有建立任何索引,tableB中在col1上有建立一个主键(聚集索引)。

  1.2 算法伪代码描述

  foreach rowA in tableA where tableA.col2=?
  {
  search rowsB from tableB where tableB.col1=rowA.col1 and tableB.col2=? ;
  if(rowsB.Count<=0)
    discard rowA ;
  else
    output rowA and rowsB ;
  }

责编:豆豆技术应用

正在加载评论...