WEB开发网
开发学院数据库MSSQL Server 通往性能优化的天堂-地狱 JOIN方法说明 阅读

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

 2007-06-27 09:45:04 来源:WEB开发网   
核心提示: 另外关于执行计划的一些补充说明:1. 执行计划中显示的信息,都是一个“评估”的结果,通往性能优化的天堂-地狱 JOIN方法说明(2),不是100%准确的信息,例如记录数量是取自统计信息,穿插在里面讲解执行计划的一些初级使用,1. nested loop join1.

另外关于执行计划的一些补充说明: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 ;
  }

上一页  1 2 3 4 5 6 7  下一页

Tags:通往 性能 优化

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接