1、数据查询部分html
一、 看到执行计划有两种方式,对sql语句按Ctrl+L,或按Ctrl+M打开显示执行计划窗口每次执行sql都会显示出相应的执行计划算法
二、 执行计划的图表是从右向左看的sql
三、 SQL Server有几种方式查找数据记录数据库
[Table Scan] 表扫描(最慢),对表记录逐行进行检查缓存
[Clustered Index Scan] 汇集索引扫描(较慢),按汇集索引对记录逐行进行检查数据结构
[Index Scan] 索引扫描(普通),根据索引滤出部分数据在进行逐行检查工具
[Index Seek] 索引查找(较快),根据索引定位记录所在位置再取出记录oop
[Clustered Index Seek] 汇集索引查找(最快),直接根据汇集索引获取记录性能
(若是有些sql执行很慢能够看一下执行计划是否包含太多“扫描”操做,若是有能够考虑为这些字段创建索引,创建索引切记不要再常常有更新操做的字段上创建,每次更新都会致使重建索引的操做,也会影响性能,0或1这种标识状态的字段由于大部分数据都是同样的创建索引也没有什么做用)优化
(索引就两种,1是汇集索引,2个非汇集索引,汇集索引每张表只能有一个,非汇集索引每张表能够有多个,主键Id就是典型的汇集索引,汇集索引是顺序排列的相似于字典查找拼音a、b、c……和字典文字内容顺序是相同的,非汇集索引与内容是非顺序排列的,相似字典偏旁查找时,同一个偏旁‘马’的汉字可能一个在第10页一个在第100页)
四、
⑴没有主键的表查询[表扫描]
⑵有主键的表查询[汇集索引扫描]
⑶创建非汇集索引的表查询[索引扫描+书签查找]
书签查找:经过非汇集索引找到所求的行,但这个索引并不包含显示的列,所以还要额外去基本表中找到这些列,因此要进行键查找,若是基本表在堆中则Key Lookup会变成RID查找,这两个查找统称为书签查找。
⑷创建非汇集索引并把其余显示列加入索引中[索引查找]
⑸创建非汇集索引并把其余显示列加入索引中并把汇集索引列看成条件[汇集索引查找]
本篇主要目的有二:
一、看懂t-sql的执行计划,明白执行计划中的一些常识。
二、可以分析执行计划,找到优化sql性能的思路或方案。
若是你对sql查询优化的理解或常识不是很深刻,那么推荐几骗博文给你:SqlServer性能检测和优化工具使用详细 ,sql语句的优化分析,T-sql语句查询执行顺序。
一、什么是执行计划?
大哥提交的sql语句,数据库查询优化器,通过分析生成多个数据库能够识别的高效执行查询方式。而后优化器会在众多执行计划中找出一个资源使用最少,而不是最快的执行方案,给你展现出来,能够是xml格式,文本格式,也能够是图形化的执行方案。
二、预估执行计划,实际执行计划
选择语句,点击上面其中一个执行计划,预估执行计划能够当即显示,而实际执行计划则须要执行sql语句后出现。预估执行计划不等于实际执行计划,可是绝大多数状况下实际的执行计划跟预估执行计划都是一致的。统计信息变动或者执行计划重编译等状况下,会形成不一样。
SET STATISTICS PROFILE 和 SET STATISTICS XML 彼此互为对等物。 前者生成文本输出;后者生成 XML 输出。 在 SQL Server 的将来版本中,新的查询执行计划信息将只经过 SET STATISTICS XML 语句显示,而不经过 SET STATISTICS PROFILE 语句显示。
三、为何要读懂执行计划
首先执行计划让你知道你复杂的sql究竟是怎么执行的,有没有按照你想的方案执行,有没有按照最高效的方式执行,使用啦众多索引的哪个,怎么排序,怎么合并数据的,有没有形成没必要要资源浪费等等。官方数据显示,执行t-sql存在问题,80%均可以在执行计划中找到答案。
四、针对图形化执行计划分析
执行计划,能够以文本,xml,图形化展现出来。本骗主要以图形化执行计划主导进行分析,然而执行计划中包含78个可用的操做符,本篇也只能对经常使用的进行分析,经常使用的几乎就包含你平常全部的了。Msdn上有图片介绍:https://msdn.microsoft.com/zh-cn/library/ms175913(v=sql.90).aspx
五、怎么看执行计划
图形化执行计划是从上到下从又到左看的。
六、清除缓存的执行计划
dbcc freeprocache
dbcc flushprocindb(db_id)
一、连线
一、越粗表示扫描影响的行数愈多。
二、Actual Number of Rows 扫描中实际影响的的行数。
三、Estimated Number of Rows 预估扫描影响的行数。
四、Estimated row size 操做符生成的行的估计大小(字节)。
五、Estimated Data Size 预估影响的数据的大小。
二、Tooltips,当前步骤执行信息
Note:这个tips的信息告诉咱们执行的对象是什么,采用的操做操做是什么,查找的数据是什么,使用的索引是什么,排序与否,预估cpu、I/O、影响行数,实际行数等信息。具体参数清单参见msdn:https://msdn.microsoft.com/zh-cn/library/ms178071(v=sql.90).aspx
三、Table Scan(表扫描)
当表中没有汇集索引,又没有合适索引的状况下,会出现这个操做。这个操做是很耗性能的,他的出现也意味着优化器要遍历整张表去查找你所须要的数据。
四、Clustered Index Scan(汇集索引扫描)、Index Scan(非汇集索引扫描)
这个图标两个操做均可以使用,一个汇集索引扫描,一个是非汇集索引扫描。
汇集索引扫描:汇集索引的数据体积实际是就是表自己,也就是说表有多少行多少列,汇集全部就有多少行多少列,那么汇集索引扫描就跟表扫描差很少,也要进行全表扫描,遍历全部表数据,查找出你想要的数据。
非汇集索引扫描:非汇集索引的体积是根据你的索引建立状况而定的,能够只包含你要查询的列。那么进行非汇集索引扫描,即是你非汇集中包含的列的全部行进行遍历,查找出你想要的数据。
五、Key Lookup(键值查找)
首先须要说的是查找,查找与扫描在性能上彻底不是一个级别的,扫描须要遍历整张表,而查找只须要经过键值直接提取数据,返回结果,性能要好。
当你查找的列没有彻底被非汇集索引包含,就须要使用键值查找在汇集索引上查找非汇集索引不包含的列。
六、RID Lookoup(RID查找)
跟键值查找相似,只不过RID查找,是须要查找的列没有彻底被非汇集索引包含,而剩余的列所在的表又不存在汇集索引,不能键值查找,只能根据行表示Rid来查询数据。
七、Clustered Index Seek(汇集索引查找)、Index Seek(非汇集索引查找)
汇集索引查找和非汇集索引查找都是使用该图标。
汇集索引查找:汇集索引包含整个表的数据,也就是在汇集索引的数据上根据键值取数据。
非汇集索引查找:非汇集索引包含建立索引时所包含列的数据,在这些非汇集索引的数据上根据键值取数据。
八、Hash Match
这个图标有两种地方用到,一种是表关联,一种是数据聚合运算时。
再分别说这两中运算的前面,我先说说Hashing(编码技术)和Hash Table(数据结构)。
Hashing:在数据库中根据每一行的数据内容,转换成惟一符号格式,存放到临时哈希表中,当须要原始数据时,能够给还原回来。相似加密解密技术,可是他能更有效的支持数据查询。
Hash Table:经过hashing处理,把数据以key/value的形式存储在表格中,在数据库中他被放在tempdb中。
接下来,来讲说Hash Math的表关联跟行数据聚合是怎么操做运算的。
表关联:
如上图,关联两个数据集时,Hash Match会把其中较小的数据集,经过Hashing运算放入HashTable中,而后一行一行的遍历较大的数据集与HashTable进行相应的匹配拉取数据。
数据聚合:当查询中须要进行Count/Sum/Avg/Max/Min时,数据可能会采用把数据先放在内存中的HashTable中而后进行运算。
九、Nested Loops
这个操做符号,把两个不一样列的数据集汇总到一张表中。提示信息中的Output List中有两个数据集,下面的数据集(inner set)会一一扫描与上面的数据集(out set),知道扫描完为止,这个操做才算是完成。
十、Merge Join
这种关联算法是对两个已经排过序的集合进行合并。若是两个聚合是无序的则将先给集合排序再进行一一合并,因为是排过序的集合,左右两个集合自上而下合并效率是至关快的。
十一、Sort(排序)
对数据集合进行排序,须要注意的是,有些数据集合在索引扫描后是自带排序的。
十二、Filter(筛选)
根据出如今having以后的操做运算符,进行筛选
1三、Computer Scalar
在须要查询的列中须要自定义列,好比count(*) as cnt ,select name+''+age 等会出现此符号。
这里会有不少建议给出,我不一一举例了,给出几个示例,想作到优化行家,多的还须要你们去悟去理解。
一、若是select * 一般状况下汇集索引会比非汇集索引更优。
二、若是出现Nested Loops,须要查下是否须要汇集索引,非汇集索引是否能够包含全部须要的列。
三、Hash Match链接操做更适合于须要作Hashing算法集合很小的链接。
四、Merge Join时须要检查下原有的集合是否已经有排序,若是没有排序,使用索引可否解决。
五、出现表扫描,汇集索引扫描,非汇集索引扫描时,考虑语句是否能够加where限制,select * 是否能够去除没必要要的列。
六、出现Rid查找时,是否能够加索引优化解决。
七、在计划中看到不是你想要的索引时,看可否在语句中强制使用你想用的索引解决问题,强制使用索引的办法Select CluName1,CluName2 from Table with(index=IndexName)。
八、看到不是你想要的链接算法时,尝试强制使用你想要的算法解决问题。强制使用链接算法的语句:select * from t1 left join t2 on t1.id=t2.id option(Hash/Loop/Merge Join)
九、看到不是你想要的聚合算法是,尝试强制使用你想要的聚合算法。强制使用聚合算法的语句示例:select age ,count(age) as cnt from t1 group by age option(order/hash group)
十、看到不是你想要的解析执行顺序是,或这解析顺序耗时过大时,尝试强制使用你定的执行顺序。option(force order)
十一、看到有多个线程来合并执行你的sql语句而影响到性能时,尝试强制是不并行操做。option(maxdop 1)
十二、在存储过程当中,因为参数不一样致使执行计划不一样,也影响啦性能时尝试指定参数来优化。option(optiomize for(@name='zlh'))
1三、不操做多余的列,多余的行,不作务必要的聚合,排序。