执行计划那些事儿
T-SQL执行的过程:
数据存储
执行计划?
提交的sql语句,数据库查询优化器,经过分析生成多个数据库可以识别的高效执行查询方式。然后优化 器会在**众多执行计划中找出一个资源使用最少,而不是最快的执行方案**,给你展示出来,可以是xml格 式,文本格式,也可以是图形化的执行方案。 可以通过执行计划,找出sql语句中的各种问题;----方便我们进一步的优化我们的Sql语句; 能够缓存执行计划的Sql语句---是参数化的; 建议大家写**SQL语句,尽量参数化-**--有缓存---可以提高性能
清除执行计划
dbcc freeprocache dbcc flushprocindb(db_id)
预估执行计划:分析SQl语句的时候,数据库引擎,预估的一种计划;找出一个资源使用最少,而不是最
快的执行方案;在执行之前的;
实际的执行计划:可能会有出入,需要把SQl语句执行完毕才能看道,大部分实际的计划和预估计划是一
致的执行计划信息
1、连线;越粗表示扫描影响的行数愈多。---性能越差 2、Actual Number of Rows 扫描中实际影响的的行数。 3、Estimated Number of Rows 预估扫描影响的行数。 4、Estimated row size 操作符生成的行的估计大小(字节)。 5、Estimated Data Size 预估影响的数据的大小。
常见场景:
1、Table Scan(表扫描)
当表中没有聚集索引,又没有合适索引的情况下,会出现这个操作。这个操作是很耗性能的,他的出现
也意味着优化器要遍历整张表去查找你所需要的数据。
2、Clustered Index Scan(聚集索引扫描)、Index Scan(非聚集索引扫描)
一个聚集索引扫描,一个是非聚集索引扫描。
聚集索引扫描:聚集索引的数据体积实际是就是表本身,也就是说表有多少行多少列,聚集索引就有多
少行多少列,那么聚集索引扫描就跟表扫描差不多,也要进行全表扫描,遍历所有表数据,查找出你想
要的数据。
非聚集索引扫描:非聚集索引的体积是根据你的索引创建情况而定的,可以只包含你要查询的列。那么
进行非聚集索引扫描,便是你非聚集中包含的列的所有行进行遍历,查找出你想要的数据。
SELECT * FROM [CustomerDB].[dbo].[Company]
建议大家在Sql语句查询的时候,尽量不要使用* 查询;
3、Key Lookup(键值查找)
查找与扫描在性能上完全不是一个级别的,扫描需要遍历整张表,而查找只需要通过键值直接提取数
据,返回结果,性能要好。当你查找的列没有完全被非聚集索引包含,就需要使用键值查找在聚集索引
上查找非聚集索引不包含的列。
4、RID Lookoup(RID查找)
跟键值查找类似,只不过RID查找,是需要查找的列没有完全被非聚集索引包含,而剩余的列所在的表
又不存在聚集索引,不能键值查找,只能根据行表示Rid来查询数据。
5、Clustered Index Seek(聚集索引查找)、Index Seek(非聚集索引查找)
聚集索引查找和非聚集索引查找都是使用该图标。
聚集索引查找:聚集索引包含整个表的数据,也就是在聚集索引的数据上根据键值取数据。
非聚集索引查找:非聚集索引包含创建索引时所包含列的数据,在这些非聚集索引的数据上根据键值取
数据。
6、Hash Match
一种是表关联,一种是数据聚合运算时。
再分别说这两中运算的前面,我先说说Hashing(编码技术)和Hash Table(数据结构)。
Hashing:在数据库中根据每一行的数据内容,转换成唯一符号格式,存放到临时哈希表中,当需要原
始数据时,可以给还原回来。类似加密解密技术,但是他能更有效的支持数据查询。
Hash Table:通过hashing处理,把数据以key/value的形式存储在表格中,在数据库中他被放在
tempdb中。
把关联的字段---加上索引----还建议给出查询条件,在sql语句之后,where 上条件
SELECT * FROM [CustomerDB].[dbo].[Product_10] SELECT * FROM [CustomerDB].[dbo].[Product_1] where ProductNum=437703 SELECT * FROM [CustomerDB].[dbo].[Product_2] where ProductNum='686440' SELECT * FROM [CustomerDB].[dbo].[Product_10] where id=19 SELECT ProductNum FROM [CustomerDB].[dbo].[Product_4] where ProductNum<129 select * from Company c left join SysUser u on c.id=u.CompanyId
7、Nested Loops
把两个不同列的数据集汇总到一张表中。提示信息中的Output List中有两个数据集,下面的数据集
(inner set)会一一扫描与上面的数据集(out set),扫描完为止,这个操作才算是完成。
8、Merge Join
这种关联算法是对两个已经排过序的集合进行合并。如果两个聚合是无序的则将先给集合排序再进行一
一合并,由于是排过序的集合,左右两个集合自上而下合并效率是相当快的。
9、Sort(排序)
对数据集合进行排序,需要注意的是,有些数据集合在索引扫描后是自带排序的。
10、Filter(筛选)
根据出现在having之后的操作运算符,进行筛选
11、Computer Scalar
在需要查询的列中需要自定义列,比如count(*) as cnt ,select name+''+age 等会出现此符号。
刷个1 暂时残缺 select * from Product_1 c inner merge join Product_2 d on c.Id=d.Id select * from Product_1 order by ProductName desc SELECT COUNT(Id) idCount FROM [CustomerDB].[dbo].[Company] group by CreateTime having COUNT(Id)=1 SELECT COUNT(Id) idCount FROM [CustomerDB].[dbo].[Company]
本文来自博客园,作者:Raymon撸码记,转载请注明原文链接:https://www.cnblogs.com/RaymonGoGo/p/16504027.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库