深入理解SQL Server查询优化器–构造执行计划(PART I)
下面是一个简单的查询(使用AdventureWorks示例数据库),显示了在数据仓库中每个产品的总数目:
SELECT
P.ProductNumber,
P.ProductID,
total_qty = SUM(I.Quantity)
FROM Production.Product P
INNER JOIN Production.ProductInventory AS I ON
I.ProductID = P.ProductID
WHERE
P.ProductNumber LIKE N'T%'
GROUP BY
P.ProductID,
P.ProductNumber;在SQL Server命中查询优化器前,SQL Server已经为解析和绑定查询做了一大堆工作。但当开始解析和绑定查询时,完成了一棵由逻辑关系操作符组成的树,如下:
优化器需要把这棵树转化为可以被查询处理器(Query Processor)执行的计划。如果查询优化器除了转化逻辑关系运算符为它找到的第一个有效形式外,而没做其他事情,我们会得到这样的计划:
这个可执行计划有两个全表扫描(full table scan),一个笛卡尔积(Cartesian),一个在两个谓词上的过滤器(Filter),以及一个聚合(aggregate)。要产生最优的查询计划,有一个很长的路要走,但它毕竟产生正确的结果了。 (这边的Compute Scalar,是确保SUM汇总在没有行被处理时返回NULL而不是零)。
匹配和应用规则
优化器通过更换逻辑运算为它所知道的对应的物理操作来生成整个执行计划。这种类型的转换是由优化器内部通过实施一系列规则来完成的。例如,逻辑运算的“INNER JOIN”,对应的物理操作则是嵌套循环(Nested Loops)(还存在merge和hash join的规则
)。
上面所展示的从逻辑树到执行计划的图中,优化器共匹配和执行了5个规则:
1,GET 转化为扫描(scan)
2,Join 转化为嵌套循环(nested loop)
3,SELECT转化为过滤器(Filter)
4,Group by Aggregate 转化为 stream aggregate
5,Group by Aggregate 转化为 Hash aggregate
第一条规则取代的逻辑表扫描得到的。第二条规则实现的逻辑连接使用如前面提到的嵌套循环。第三把所有的谓词(包括联接谓词)转化为一个过滤器操作。第四和第五条规则代表了两种可供选择的策略来让物理操作层面执行聚集。在这种情况下,优化器根据成本选择了一个流聚合在一个哈希聚合。
好了,如果它产生的那种计划定期,没有人会购买SQL Server。幸运的是,还有很多其他优化器可以使用的规则,事实上有近四百种规则。不过,查询优化器产生这样一个令人沮丧的计划,是因为十多个单独的规则被关闭,我们是特意这样做的。
随着更多的规则被实施,我们会发现有许多勘探(exploration)和替代(substitution)规则。这些会基于数学等价或启发式
将逻辑请求变换成等价的形式。例如,“join Commute”是条勘探规则。这条规则的事实表明了A JOIN B等同于B JOIN A(内部联接)。
优化器同样也有简化的规则和强制的规则。通过应用所有这些规则,会产生相关替代策略,其中最好的将被纳入最后的计划。
改进计划
上面的可执行计划的一个明显的不足之处是,它在的两个源表过滤器上执行了笛卡尔乘积。此时,评估联接谓词的同时进行物理连接,其实会更有效。执行此任务的规则被称为SELonJN(SELECT JOIN)。需要强调的是,这不是T-SQL SELECT语句,它是SELECT关系操作:应用于行的过滤器。使SELonJN优化规则,我们可以得到一个更好的计划:
笛卡尔乘积已经换成了一个更为正常的Nested Loops运算符,这是一个将过滤器移入联接谓词的结果(去掉了filter)。事实上,过滤器运算符完全消失 – 谓词“ProductNumber LIKE’T%”没被解析吗?其实它也被往后推了 – 所有Product表扫描的由来。
这仍然不是一个好的计划:我们每一次从Product表中的找到每一行相匹配的ProductNumber谓词时,就要扫描整个Inventory表。我们需要知道非聚集索引的规则 — 简单的将一个GET转化为表扫描所依赖的基本规则。应用一些更多的规则后,我们产生如下执行计划:
这一个是好一点了,我们现在使用了正确的非聚集索引,但这个谓词被应用为扫描了 – 而不是我们希望的索引查找(index seek)。再应用一些另外的规则后,我们将会得到了一个非常有效的执行计划。
敬请期待。
除非注明,本站文章均为原创或编译,转载请注明: 文章来自sqlpub.net
相关推荐
系统软件需求清单与技术参数.doc
系统软件需求清单与技术参数.doc
2025 居民消费结构数据集(21列,15000条记录)XLSX
详情介绍:该数据集为 2025 年 12 个月、1250 户家庭的平衡面板消费数据,15000 行 ×21 列零缺失,覆盖 31 省、城乡均衡,含八大类消费支出和恩格尔系数(均值 0.293,属富裕区间),家庭月收入均值 8473 元、月支出 6487 元,附完整字段说明 sheet,数据干净规整,非常适合做消费结构分析、面板回归、城乡 / 区域差异对比和收入等级分类预测,但为合成数据、仅 1 年时间跨度,不适合做真实政策研究或长期趋势分析。
配合上述本地模型资源文件
配合上述本地模型资源文件
三电平维也纳VIENNA双闭环控制整流器仿真(Simulink仿真实现)
内容概要:本文档系统性地介绍了以“三电平维也纳VIENNA双闭环控制整流器”为核心的电力电子系统Simulink仿真资源,聚焦于电压电流双闭环控制、中点电位平衡、空间矢量脉宽调制(SVPWM)等关键技术的建模与实现。资源包不仅提供完整的仿真模型,还配套Mathcad计算书、设计报告及参考文献,帮助用户从理论推导到参数设计再到仿真验证实现全流程贯通。同时,文档整合了大量相关拓扑(如DAB、LLC、PFC、CLLC等)与先进控制策略(如EPS调制、软开关、最小应力优化、模型预测控制等)的仿真案例,覆盖从基础整流器到复杂双向变换系统的多个典型应用场景,构成一个面向科研、教学与工程实践的综合性学习体系。; 适合人群:具备电力电子、自动控制或电气工程等相关专业背景,熟悉MATLAB/Simulink仿真环境,正在从事新能源变换、电能质量治理、电机驱动或电力系统方向研究的研究生、高校教师及企业研发工程师。; 使用场景及目标:①开展三电平VIENNA整流器、双有源桥DAB、LLC谐振变换器等先进拓扑的科研建模与论文复现;②完成课程设计、毕业设计或实际工程项目中的控制器开发与系统性能验证;③深入掌握双闭环控制架构、中点电位平衡机制、SVPWM调制策略及系统稳定性分析等核心知识点; 阅读建议:建议结合Mathcad计算书进行系统参数设计,理解控制算法的数学基础,并在Simulink中逐步搭建与调试模型,注重理论计算与仿真结果的对比分析,推荐按照资源目录顺序循序渐进学习,以建立完整的知识框架和技术实现能力。
三相充电桩维也纳PFC+三电平LLC谐振变换器三电平PSIM仿真设计(Simulink仿真实现)
内容概要:本文档聚焦于电力电子与电力系统领域的仿真设计,重点围绕三相充电桩中维也纳PFC(Vienna Power Factor Correction)整流器与三电平LLC谐振变换器的联合系统展开,提供基于PSIM和Simulink平台的完整仿真设计方案。内容涵盖9kW三相三开关维也纳PFC整流器的Mathcad计算书、双闭环控制策略、中点电压均衡控制、SVPWM调制技术及电流过零畸变消除方法等关键技术环节,并配套详细的仿真模型与设计报告。此外,文档整合了丰富的电力电子拓扑资源,包括图腾柱PFC、交错并联PFC、双有源桥DAB、CLLC谐振变换器、双向Buck-Boost等典型电路结构,覆盖Matlab/Simulink、Plecs、PSIM等多种仿真环境,形成从理论计算、建模、控制算法设计到性能优化的一体化技术体系。; 适合人群:面向具备电力电子、电气工程、自动化等相关专业背景,熟悉Matlab/Simulink/PSIM等仿真工具,从事新能源汽车充电技术、高效率AC-DC/DC-DC变换器设计、电力系统能量管理等方向的研究生、科研人员及工程技术人员。; 使用场景及目标:①支持三相高功率因数校正与高效DC-DC变换系统的科研仿真与教学实践;②用于PI控制、前馈控制、SVPWM、软开关技术、中点电位平衡、双闭环动态响应等核心控制算法的研究与验证;③服务于毕业设计、科研课题、学术论文复现及实际工程项目开发,提升系统级建模与优化能力。; 阅读建议:建议结合Mathcad计算书与仿真模型同步学习,优先掌握维也纳PFC与LLC的基本工作原理与参数设计流程,再深入理解双闭环控制系统架构与关键控制策略,推荐先运行Simulink模型观察动态波形响应,并参考附带文献深化理论认知与工程实现能力。


