深入理解SQL Server查询优化器–构造执行计划(PART I)

kinzent 2012-12-18 09:06:57
加精
SQL Server的优化器对大部分人来说是非常神秘的,现在我们就来看看优化器是如何建立一个可执行的计划,以及其使用的规则。为了说明优化器执行的过程,我们将会通过逐步施加必要的规则的设置,来产生更好的执行计划。

下面是一个简单的查询(使用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
...全文
3242 72 打赏 收藏 转发到动态 举报
写回复
用AI写文章
72 条回复
切换为时间正序
请发表友善的回复…
发表回复
u010009545 2013-04-02
  • 打赏
  • 举报
回复
谢谢分享
hyde100 2013-03-31
  • 打赏
  • 举报
回复
关注下,慢慢看。。。
gotopause 2013-03-30
  • 打赏
  • 举报
回复
谢谢楼主赐教
极品老土豆 2013-03-28
  • 打赏
  • 举报
回复
麦兜NC粉 2013-03-28
  • 打赏
  • 举报
回复
好文 好好看看
山城忙碌人 2012-12-30
  • 打赏
  • 举报
回复
我也在学执行计划,但这扁文章我看不懂,但还是收藏了!
shuzhongxunyu 2012-12-30
  • 打赏
  • 举报
回复
写得很好啊。。。
zhaofeng365 2012-12-29
  • 打赏
  • 举报
回复
同感:写的太好了,支持LZ解释底层运行的文章,不顶过意不去
lyzddd 2012-12-28
  • 打赏
  • 举报
回复
收藏学习
qcj0_0_0 2012-12-27
  • 打赏
  • 举报
回复
fenghuarong1990 fenghuarong1990等级: 结帖率:0% #58 得分:0 回复于: 2012-12-27 11:25:10 收益了
fenghuarong1990 2012-12-27
  • 打赏
  • 举报
回复
收益了,很牛叉的东西
zhaolitian568 2012-12-27
  • 打赏
  • 举报
回复
学习啦。这个值得学习 没办法积分
hpgc99 2012-12-26
  • 打赏
  • 举报
回复
摸石头不过河 2012-12-26
  • 打赏
  • 举报
回复
值得学习,收藏
chan91 2012-12-26
  • 打赏
  • 举报
回复
收藏,留之后用
零度弥合 2012-12-26
  • 打赏
  • 举报
回复
我菜鸟 请问什么是AdventureWorks示例数据库??? 在哪里能找到???
KLL 2012-12-25
  • 打赏
  • 举报
回复
jfzr!!!
leochan90 2012-12-25
  • 打赏
  • 举报
回复
好牛逼的样子,各种看不懂,菜鸟。
vul38cj8 2012-12-24
  • 打赏
  • 举报
回复
顶起!好文章啊!好好学习啊
joyica 2012-12-24
  • 打赏
  • 举报
回复
加载更多回复(40)
内容概要:本文针对复杂威胁环境下多无人机的协同路径规划问题,提出一种基于多段杜宾斯(Dubins)路径的优化方法,旨在实现高动态、高风险场景中无人机群的安全、高效与协同飞行。研究充分考虑无人机的实际飞行约束,如最小转弯半径与连续曲率要求,采用杜宾斯曲线构建平滑且符合动力学特性的路径段,并结合优化算法对多机路径进行协同规划,有效规避静态威胁区域与动态障碍物,避免飞行器间发生碰撞。方案在Matlab平台上完成仿真验证,结果表明该方法能够在城市、军事等复杂环境中实现多无人机系统的路径最短化、能耗最低化、安全性最大化与实时性兼顾的多目标优化,具有较强的工程应用潜力。; 适合人群:具备无人机控制、路径规划或智能优化算法基础的科研人员与工程技术人员,特别适用于自动化、航空航天、机器人及相关领域的研究生、高校教师及工业界研发人员。; 使用场景及目标:①应用于复杂城市、战场等高威胁环境下的多无人机协同任务,如侦察监视、应急救援、集群打击与编队巡航;②为解决多无人机系统中的动态避障、冲突消解、路径平滑与资源协同分配等关键技术问题提供理论依据与算法实现参考;③帮助研究人员深入理解Dubins路径在多智能体协同运动规划中的建模方式与优化机制,推动其在无人系统自主导航中的实际落地。; 阅读建议:建议读者结合提供的Matlab代码深入研读算法实现流程,重点分析威胁建模策略、多机冲突协调机制以及多目标代价函数的设计思路,可通过调整环境参数与优化权重在仿真中观察路径生成效果,从而加深对协同决策、运动学约束与全局优化之间耦合关系的理解。
内容概要:本文围绕“基于飞机配电优化负荷管理系统研究”展开,利用Matlab代码实现相关建模仿真与优化分析,旨在提升飞机配电系统的效率与可靠性。研究重点针对飞机电力系统中的动态负荷分配问题,构建了综合考虑电源容量限制、负载优先级划分、供电安全性、能量消耗最小化及系统冗余能力的多约束优化模型。通过引入先进智能优化算法对模型进行高效求解,实现了对机载关键与非关键设备的科学化、智能化供电管理。文中详细展示了算法迭代过程、收敛性分析及不同工况下的仿真结果,验证了该方法在降低整体能耗、均衡电力负载、增强系统稳定性以及应对突发用电需求等方面的优越性能,为现代民用与军用航空器电力系统的自主决策与健康管理提供了坚实的理论支撑与可行的技术路径。; 适合人群:具备电力系统、自动化或航空航天工程背景,熟练掌握Matlab编程语言,从事飞机电气系统设计、航空器能源管理、智能优化算法应用或相关领域研究的科研人员、工程师及研究生。; 使用场景及目标:①应用于新型飞机电气系统的设计与仿真验证,优化机载设备的供电策略与能量管理逻辑;②为复杂封闭电力系统(如舰船、空间站)中的负荷调度与应急电源管理提供可借鉴的解决方案,以提升系统整体能效、安全等级与运行韧性。; 阅读建议:建议结合提供的Matlab代码深入理解优化模型的数学建模过程、约束条件的程序化表达及智能算法的具体实现细节,重点关注目标函数的设计思路、权重系数的选取对优化结果的影响,并可尝试将模型拓展至多目标优化、实时滚动优化或考虑设备故障预测的主动负荷管理等更复杂的应用场景。

34,876

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧