首页 > 数据库 >sqlserver 逻辑执行步骤分析

sqlserver 逻辑执行步骤分析

时间:2023-01-10 21:34:35浏览次数:62  
标签:逻辑 JOIN NAME INT 步骤 sqlserver SALES ID 节点


--分析语句
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,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,1),
S_CID INT,
S_PID INT,
S_QUANTITY INT,
S_AMOUNT NUMERIC(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 CUSTOMERS
SELECT * FROM PRODUCTS
SELECT * FROM SALES


结果表:

sqlserver 逻辑执行步骤分析_父节点


(图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>



逻辑查询处理阶段简介

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

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

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

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

--  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



sqlserver 逻辑执行步骤分析_父节点_02


(图 2)

sqlserver 逻辑执行步骤分析_筛选器_03

(图 3)

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

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

Executea:此步骤执行次数

Parent:父节点识别码

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

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

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

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

其他如下图,可以参考上面(图2)

sqlserver 逻辑执行步骤分析_筛选器_04

(图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行】最终结果


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






标签:逻辑,JOIN,NAME,INT,步骤,sqlserver,SALES,ID,节点
From: https://blog.51cto.com/hzc2012/6000711

相关文章

  • SQLServer 2008 FileStream简单实例
    1.打开服务,内置账户为localsystem。(其它不行)2.选择选项FileStream,勾选以下。然后重启服务3.打开managementstudio,右键服务—属性。点击高级,会看到‘文件流’中‘文件流......
  • 13种Shell逻辑与算术,能写出5种算你赢!
    相较于最初的Bourneshell,现代bash版本的最大改进之一体现在算术方面。早期的shell版本没有内建的算术功能,哪怕是给变量加1,也得调用单独的程序来完成。1、算术方法一:......
  • IIS配置URL_Rewrite详细步骤
    1.URL_Rewrite下载地址https://www.iis.net/downloads/microsoft/url-rewrite 2.WebConfig配置需要配置在 <system.webServer> 这个节点中  <rewrite>  ......
  • sqlserver数据库死锁
    死锁(Deadlock)所谓死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了......
  • CentOS下添加新磁盘,新建逻辑组,新建逻辑卷
    重启电脑后再使用lsblk命令查询下面进行如下操作fdisk/dev/sdd   对sdd盘进行分区然后输入W进行保存,然后再输入fdisk -l 磁盘/dev/sdd:128.8GB,1288......
  • 13种Shell逻辑与算术,能写出5种算你赢!
    相较于最初的Bourneshell,现代bash版本的最大改进之一体现在算术方面。早期的shell版本没有内建的算术功能,哪怕是给变量加1,也得调用单独的程序来完成。1、算术方法一......
  • SQLServer与excel和txt的导入导出
    execsp_configure'showadvancedoptions',1--启用高级配置选项设置reconfigure;--reconfigurewithoverride;--reconfigure不行则都用这个execsp_configure'AdHoc......
  • SqlServer 凭据
    凭据是包含连接到SQLServer外部资源所需的身份验证信息(凭据)的记录。此信息由SQLServer在内部使用。大多凭据都包含一个Windows用户名和密码。利用凭据中存储的......
  • SqlServer 多服务器管理(MSSQL分布式作业管理)
    范围的多个实例的自动化管理SQLServer称为多服务器管理。使用多服务器管理可以执行下列操作:管理两台或多台服务器。在企业服务器之间安排数据仓库的信息流。若要利用......
  • oracle ,mysql,sqlserver 挑选特定行号的纪录
    oracle:SELECT*FROMtableWHEREROWNUM<101;minusSELECT*FROMtableWHEREROWNUM<91;mysql:select*fromtablelimit5,5第一个5是开始的行号,第二个5是选择纪录......