sqlserver 逻辑执行步骤分析

sqlserver 逻辑执行步骤分析,第1张

概述--分析语句SET SHOWPLAN_ALL ON --只输出分析结果SET STATISTICS PROFILE ON --输出语句结果和分析结果 先创建分析表: /*DROP TABLE CUSTOMERSDROP TABLE PRODUCTSDROP TABLE SALES*/CREATE TABLE CUSTOMERS( C_ID INT IDENTITY(1,1

--分析语句SET SHOWPLAN_ALL ON			--只输出分析结果SET STATISTICS PROfile ON	--输出语句结果和分析结果

先创建分析表:

/*DROP table CUSTOMERSDROP table PRODUCTSDROP table SALES*/CREATE table CUSTOMERS(	C_ID		INT IDENTITY(1,1),C_name		VARCHAR(50),CONSTRAINT C_KEY PRIMARY KEY(C_ID))CREATE table PRODUCTS(	P_ID		INT IDENTITY(1,P_name		VARCHAR(50),P_PRICE 	NUMERIC(12,2),P_TOTAL 	INT,CONSTRAINT P_KEY PRIMARY KEY(P_ID))CREATE table SALES(	S_ID		INT IDENTITY(1,S_CID		INT,S_PID		INT,S_QUANTITY	INT,S_AMOUNT	NUMERIC(12,CONSTRAINT S_KEY PRIMARY KEY(S_ID))INSERT INTO CUSTOMERS(C_name)VALUES('客户A'),('客户B'),('客户C'),('客户D'),('客户E')INSERT INTO PRODUCTS(P_name,P_TOTAL,P_PRICE)VALUES('笔记本',3,4200),('相机',10,3230),('手机',20,2100),('IPAD',13,2430)INSERT INTO SALES(S_CID,S_PID,S_QUANTITY,S_AMOUNT)VALUES(1,1,(1,6300),4,2,4860),(2,(4,6460),2430),2430)SELECT * FROM CUSTOMERSSELECT * FROM PRODUCTSSELECT * FROM SALES
结果表:


(图1)

一下这块是网上说的执行步骤

(8)SELECT (9)disTINCT  (11)<top Num> <select List>(1)FROM [left_table](3)<join_type> JOIN <right_table>(2)        ON <join_condition>(4)WHERE <where_condition>(5)GROUP BY <group_by_List>(6)WITH <CUBE | RollUP>(7)HAVING <having_condition>(10)ORDER BY <order_by_List>

逻辑查询处理阶段简介

FROM:对FROM子句中的前两个表执行笛卡尔积(Cartesian product)(交叉联接),生成虚拟表VT1 ON:对VT1应用ON筛选器。只有那些使<join_condition>为真的行才被插入VT2。 OUTER(JOIN):如 果指定了OUTER JOIN(相对于CROSS JOIN 或(INNER JOIN),保留表(preserved table:左外部联接把左表标记为保留表,右外部联接把右表标记为保留表,完全外部联接把两个表都标记为保留表)中未找到匹配的行将作为外部行添加到 VT2,生成VT3.如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3,直到处理完所有的表为止。 WHERE:对VT3应用WHERE筛选器。只有使<where_condition>为true的行才被插入VT4. GROUP BY:按GROUP BY子句中的列列表对VT4中的行分组,生成VT5. CUBE|RolLUP:把超组(Suppergroups)插入VT5,生成VT6. HAVING:对VT6应用HAVING筛选器。只有使<having_condition>为true的组才会被插入VT7. SELECT:处理SELECT列表,产生VT8. disTINCT:将重复的行从VT8中移除,产生VT9. ORDER BY:将VT9中的行按ORDER BY 子句中的列列表排序,生成游标(VC10). top:从VC10的开始处选择指定数量或比例的行,生成表VT11,并返回调用者。 ------------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------

按照上面的格式,设置代码如下:

--	SET SHOWPLAN_ALL ON		--只输出分析结果SET STATISTICS PROfile ON	--输出语句结果和分析结果SELECT top 1 C_name,SUM(S_AMOUNT) AS AMOUNTFROM CUSTOMERS left JOIN SALES ON C_ID=S_CIDleft JOIN PRODUCTS ON P_ID=S_PIDWHERE P_name='IPAD'GROUP BY C_nameWITH CUBEHAVING SUM(S_AMOUNT)>0ORDER BY C_name DESC


(图 2)

(图 3)

只截取部分图,现在说说执行的步骤:

Rows:此步骤返回执行结果行数

Executea:此步骤执行次数

Parent:父节点识别码

Nodeld:子节点识别码,每个节点对应一个步骤

StmtText:每个节点对应的 *** 作内容

说明:执行的时候都是从叶节点开始的,所以父节点最大先执行,然后子节点最大的先执行。

其他字段说明,详细参考  SET SHOWPLAN_ALL (Transact-SQL)

其他如下图,可以参考上面(图2) —— “执行计划”  图,这就不用多说了:


(图4)


就说说(图 3)(图 3)可以看到


【第8行】 子节点为9,有两个节点,继续往下看。

【第9行】父节点为9时,子节点为10和13同级别,继续往下看,只有10下面有节点。


【第11行】 先按主键P_ID查找PRODUCTS表,关联 SALES 表,所以按 S_PID 查找SALES 表,查找7次,加上过滤条件 P_name='IPAD',返回3行。

【第10行】直接按索引浏览SALES 表,1次执行返回7行数据。

【第9行】PRODUCTS表 与 SALES 表 嵌套循环,

【第8行】CUSTOMERS表 与(PRODUCTS表 与 SALES 表合并)表 嵌套循环,

【第7行】分组求和前先排序,按C_NAME升序

【第6行】进行分组求和 GROUP BY C_name

【第5行】聚合函数WITH CUBE

【第4行】过滤HAVING SUM(S_AMOUNT)>0

【第3行】确保在没有行被处理时SUM聚合 *** 作返回NulL而不是0

【第2行】排序,ORDER BY C_name DESC,选择前一行top 1 

【第1行】最终结果


就这样吧,无聊 *** 作一下。

总结

以上是内存溢出为你收集整理的sqlserver 逻辑执行步骤分析全部内容,希望文章能够帮你解决sqlserver 逻辑执行步骤分析所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1173959.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存