sqlserver 逻辑执行步骤分析
来源:互联网 发布:德州金蝶软件 编辑:程序博客网 时间:2024/05/24 23:15
--分析语句SET SHOWPLAN_ALL ON--只输出分析结果SET STATISTICS PROFILE ON--输出语句结果和分析结果
先创建分析表:
/*DROP TABLE CUSTOMERSDROP TABLE PRODUCTSDROP TABLE SALES*/CREATE TABLE CUSTOMERS(C_IDINT IDENTITY(1,1),C_NAMEVARCHAR(50),CONSTRAINT C_KEY PRIMARY KEY(C_ID))CREATE TABLE PRODUCTS(P_IDINT IDENTITY(1,1),P_NAMEVARCHAR(50),P_PRICE NUMERIC(12,2),P_TOTAL INT,CONSTRAINT P_KEY PRIMARY KEY(P_ID))CREATE TABLE SALES(S_IDINT IDENTITY(1,1),S_CIDINT,S_PIDINT,S_QUANTITYINT,S_AMOUNTNUMERIC(12,2),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,4200),(1,3,3,6300),(1,4,2,4860),(2,3,1,2100),(4,2,2,6460),(4,4,1,2430),(4,4,1,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中Sql语句的逻辑执行顺序
- SqlServer中Sql语句的逻辑执行顺序
- Pig源码分析: 逻辑执行计划模块
- Pig源码分析: 逻辑执行计划优化
- 咖啡兔流程执行逻辑分析
- CockroachDB 逻辑执行计划简单分析
- sqlserver 2000中执行分布式事务的步骤
- sqlserver 2000中执行分布式事务的步骤
- 安卓(java)连接sqlserver 执行存储过程步骤
- filter 过滤器的执行步骤分析
- 什么是逻辑分析仪?逻辑分析仪的参数、使用步骤和优势
- sql server性能分析--执行sql次数和逻辑次数
- sql server性能分析--执行sql次数和逻辑次数
- sql server性能分析--执行sql次数和逻辑次数
- sql server性能分析--执行sql次数和逻辑次数
- 数据库中的SELECT语句逻辑执行顺序分析
- jsp
- 教你如何HTML显示一张图片的一部分
- JSP代码小实例
- 语法:MySQL中INSERT INTO SELECT的使用
- Android使用笔记--艰难的减肥过程
- sqlserver 逻辑执行步骤分析
- 图论
- java的输入语句小结
- 阿里巴巴笔试的一道综合题(关于计算机网络)
- 【破解小札记】--call、retn 和 retf
- phpdocumentor2 简介安装使用详解
- 一个简单的php批量上传程序
- Hibernate4新特性
- #pragma pack() effect