sqlserver 逻辑执行步骤分析
--分析语句 SET SHOWPLAN_ALL ON --只输出分析结果 SET STATISTICS PROFILE ON --输出语句结果和分析结果 先创建分析表: /* DROP TABLE CUSTOMERS DROP TABLE PRODUCTS DROP 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 CUSTOMERS SELECT * FROM PRODUCTS SELECT * 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> 逻辑查询处理阶段简介
------------------------------------------------------------------------------------------------------------ 按照上面的格式,设置代码如下: -- SET SHOWPLAN_ALL ON --只输出分析结果 SET STATISTICS PROFILE ON --输出语句结果和分析结果 SELECT TOP 1 C_NAME,SUM(S_AMOUNT) AS AMOUNT FROM CUSTOMERS LEFT JOIN SALES ON C_ID=S_CID LEFT JOIN PRODUCTS ON P_ID=S_PID WHERE P_NAME='IPAD' GROUP BY C_NAME WITH CUBE HAVING SUM(S_AMOUNT)>0 ORDER 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行】最终结果 就这样吧,无聊操作一下。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |