不管是博客园还是CSDN,看到很多朋友对数据库的理解、认识还是没有突破一个瓶颈
04、05年做项目的时候,用SQL Server 2000,核心表(大部分使用频繁的关键功能每
我只对SQL Server 2000比较了解,但这并不阻碍我在Oracle、MySql进行SQL调优、产品
关于执行计划的说明
在SQL Server查询分析器的Query菜单中选择Show Execution Plan,运行SQL查询语句,
关于统计信息、I/O成本和CPU成本的评估、SQL语句的编译和执行过程,这里不再深入。另
JOIN方法说明
数据库中,象ta***eA inner join ta***eB、ta***eA left out join ta***eB这样的SQL语句是如何
SQL Server 2000有三种方式:nested loop、merge、 hash。Oracle也是使用这三种方式,
以SQL Server 2000为例对这三种方式进行说明,穿插在里面讲解执行计划的一些初级使用。
1. nested loop join
1.1 示例SQL
select ... from ta***eA inner join ta***eB on ta***eA.col1=ta***eB.col1 where ta***eA.col2=?
ta***eA中没有建立任何索引,ta***eB中在col1上有建立一个主键(聚集索引)。
1.2 算法伪代码描述
foreach rowA in ta***eA where ta***eA.col2=?
{
search rowsB from ta***eB where ta***eB.col1=rowA.col1 and ta***eB.col2=? ;
if(rowsB.Count<=0)
discard rowA ;
else
output rowA and rowsB ;
}
join操作有两个输入,上面例子中ta***eA是outer input,用于外层循环;ta***eB是inner
1.3 查看执行计划方法 移到文章最前面。
1.4 执行步骤
下面是示例SQL的执行计划图。nested loop操作的右边,位于上面的是outer input,位
) 对t
b) 执行上面伪代码描述的nested loop操作。对a)中的每个输出记录,执行步骤c)。
c) 对ta***eB执行Clustered Index Seek操作。这个操作是在nested loop循环里面执行的,
d) 构造返回结果集。从nested loop的输出中,整理出select中指定的字段,构造最终输出
上面例子对inner input使用的是聚集索引,下面看一下非聚集索引的情况,加强对执行计划
把ta***eB col1上的主键修改为非聚集方式,示例的SQL语句执行计划如下:
前面三个执行步骤a)、b)、c)跟1.4中一样,有一点需要注意的是,步骤c)是执行Index Seek操
d) 执行Bookmark Lookup操作。nested loop操作的输出是一个内存数据结构,在从这个内
e) Filter过滤操作。回顾前面几个操作,在执行nested loop时只是使用非聚集索引的索 引字段(ta***eB.col1)跟outer input的关联字段进行匹配,到目前为止还没有使用ta***eB.col2=?这个条
看的仔细的人到这里后可能会有几个疑问,1. ta***eA.col2=?怎么没有一个Filter操作?2.
f) 构造返回结果集。跟1.4步骤d)一样。
1.6 nested loop使用条件
任何一个join操作,如果满足nested loop使用条件,查询优化过程中SQL Server就会对
关于使用条件另外的说明:outer input的记录数,并不是指outer input表中实际记录数,例如示
使用loop关键字实现,例如ta***eA inner loop join ta***eB,将强制SQL Server使用nested loop方式执
接下来就不再象上面这样详细的讲述了。
merge join第一个步骤是确保两个关联表都是按照关联的字段进行排序。如果关联字段有可用的索引,并且排序一致,则可以直接进行merge join操作;否则,SQL Server需要先对关联的表按照关联字段进
两个表都按照关 联字段排序好之后,merge join操作从每个表取一条记录开始匹配,如果符合关联
在多对多的关联表上执行merge join时,通常需要使用临时表进行操作。例如A join B使用merge join
merge join操作本身是非常快的,但是merge join前进行的排序可能会相当耗时 (SQL Server最消耗
一般情况下,如果无法满足nested loop条件,会考虑对merge join方法的评估。merge join的选 择,
使用inner merge join或者option(merge join)强制使用merge join方法。
3. hash join
hash join有两个输入:build input(也叫做outer input)和probe input(也叫做inner input),不仅
Build阶段
这个阶段主要构造hash ta***e。在inner/left/right join等操作中,表的关联字段作为hash key;在group
Build操作从build input输入中取出每一行记录,将该行记录关联字段的值使用hash函数生成hash值,
Probe阶段
在这个阶段,SQL Server从probe input输入中取出每一行记录,同样将该行记录关联字段的值,使用
关于hash算法的细节,可以查看数据结构的一些资料。hash算法主要是用于大数据量的搜索,为了避
SQL Server将数据量较小的表作为build input,尽量使根据build input构造的hash ta***e能够完全放在
如果build input记录数非常大,构建的hash ta***e无法在内存中容纳时,SQL Server分别将build
input和probe input切分成多个分区部分(partition),每个partition都包括一个独立的、成对匹配的build
input和probe input,这样就将一个大的hash join切分成多个独立、互相不影响的hash join,每一个分区的hash
join都能够在内存中完成。SQL Server将切分后的partition文件保存在磁盘上,每次装载一个分区的build
input和probe input到内存中,进行一次hash join。这种hash join叫做Grace Hash
Join,使用的Grace Hash Join算法。
伴随着大数据的hash join运算,还会有standard
external merge sorts、multiple merge levels、multiple partitioning
steps、multiple partitioning levels,SQL Server还可能会使用Recursive Hash Join
hash join一般都用于大数据量的操作,例如join中某个表的数据达到一定程度或者无法一次加载到内
建议
三种join方法,都是拥有两个输入。优化的基本原则:1. 避免大数据的hash join,尽量将其转化为高
关于业务设计方面的优化,参考以前写的一篇post:系统分析设计 一个JOIN问题解决方案的感想 重
补充(2007.06.27):关于SQL Server 2005
大致看了下SQL Server 2005,执行计划的显示确实有一些不一样,但主要部分或者说原理上是差不
另外一点是,将鼠标移动到执行计划的图标上面后,弹出的提示信息的一些改变,例如2005里面会显
最后,2005里面可以将图形显示的执行计划保存下来,以后可以打开再以图形方式进行查看分析,这
数据库join方式分析的更多相关文章
-
数据库常见的三种join方式
数据库常见的join方式有三种:inner join, left outter join, right outter join(还有一种full join,因不常用,本文不讨论).这三种连接方式都是将 ...
-
PostgreSQL EXPLAIN执行计划学习--多表连接几种Join方式比较
转了一部分.稍后再修改. 三种多表Join的算法: 一. NESTED LOOP: 对于被连接的数据子集较小的情况,嵌套循环连接是个较好的选择.在嵌套循环中,内表被外表驱动,外表返回的每一行都要在内表 ...
-
SQL Server-聚焦IN VS EXISTS VS JOIN性能分析(十九)
前言 本节我们开始讲讲这一系列性能比较的终极篇IN VS EXISTS VS JOIN的性能分析,前面系列有人一直在说场景不够,这里我们结合查询索引列.非索引列.查询小表.查询大表来综合分析,简短的内 ...
-
ORACLE的SQL JOIN方式小结
在ORACLE数据库中,表与表之间的SQL JOIN方式有多种(不仅表与表,还可以表与视图.物化视图等联结),官方的解释如下所示 A join is a query that combines row ...
-
4.总结近5周以来的github上的工作情况,以图表方式分析你小组的工作情况、存在的问题及解决的方案。(尤心心)
4.总结近5周以来的github上的工作情况,以图表方式分析你小组的工作情况.存在的问题及解决的方案. (1)利用github本身的graphs可以清晰的看出小组成员在github上面的交互,可以直接 ...
-
Spark 中的join方式(pySpark)
spark基础知识请参考spark官网:http://spark.apache.org/docs/1.2.1/quick-start.html 无论是mapreduce还是spark ,分布式框架的性 ...
-
MapReduce三种join实例分析
本文引自吴超博客 实现原理 1.在Reudce端进行连接. 在Reudce端进行连接是MapReduce框架进行表之间join操作最为常见的模式,其具体的实现原理如下: Map端的主要工作:为来自不同 ...
-
sql优化 表连接join方式
sql优化核心 是数据库中 解析器+优化器的工作,我觉得主要有以下几个大方面:1>扫表的方法(索引非索引.主键非主键.书签查.索引下推)2>关联表的方法(三种),关键是内存如何利用 ...
-
SQL join中级篇--hive中 mapreduce join方法分析
1. 概述. 本文主要介绍了mapreduce框架上如何实现两表JOIN. 2. 常见的join方法介绍 假设要进行join的数据分别来自File1和File2. 2.1 reduce side jo ...
随机推荐
-
MMDrawerController第三方库的使用(根据导航item+滚动条progressView实现的手势滑动切换视图的)
https://github.com/mutualmobile/MMDrawerController MMDrawerControlleris边抽屉导航容器视图控制器用来支持越来越多的应用程序利用抽屉 ...
-
ArcGIS10中matplotlib画图时的中文设置
利用GIS的数据批量生成XY的图形图像文件,可以直接使用Python.一般大家都是用matplotlib,中文设置的问题参看了许多内容,结论是对错不一,让我折腾了三天,现总结如下: 1.软件的版本.安 ...
-
ThinkPHP中PATHINFO模式优化
ThinkPHP 3.1.2官方手册 第16.2章节 <隐藏index.php>中提到在Ngnix中隐藏index.php实现SEO友好的方法,其中使用了如下的代码 location / ...
-
使用 Oracle GoldenGate 在 Microsoft SQL Server 和 Oracle Database 之间复制事务
使用 Oracle GoldenGate 在 Microsoft SQL Server 和 Oracle Database 之间复制事务 作者:Nikolay Manchev 分步构建一个跨这些平台的 ...
-
JAXB - Hello World with Namespace
如果元素带有命名空间,那么处理方式与 JAXB - Hello World 会略有不同. 1. XML Schema: <xsd:schema xmlns:xsd="http://ww ...
-
函数fsp_alloc_free_page
从fsp中分配32个碎片页 /**********************************************************************//** Allocates ...
-
1、Cocos2dx 3.0游戏开发三找一小块前言
尊重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27094663 前言 Cocos2d-x 是一个通用 ...
-
15套java架构师大型分布式综合项目实战、千万高并发-视频教程
* { font-family: "Microsoft YaHei" !important } h1 { color: #FF0 } 15套java架构师.集群.高可用.高可扩 展 ...
-
一起聊聊什么是P问题、NP问题、NPC问题
概念 P问题:如果一个问题可以找到一个能在多项式的时间里解决它的算法,那么这个问题就属于P问题.通常NOI和NOIP不属于P类问题,我们常见到的一些信息奥赛的题目都是P问题. NP问题:可以在多项式的 ...
-
java获取当前网站的IP地址
package ip; import java.net.InetAddress; import java.net.UnknownHostException; /** * * @author * */ ...