SQL Server执行计划可帮助数据库专业人员排除查询性能故障并编写高效查询。 当查询非正常的需要长时间才能运行时,SQLServer执行计划可以帮助分析并且确定问题来源。
您可以使用以下任何方法来生成执行计划:
SQL ServerManagement Studio
Azure DataStudio
SQL Serverprofiler
Extendedevents
Dynamic managementviews
Third-partydatabase monitoring software
SQL Server 提供预估的和实际的执行计划,类似于您需要修理汽车时遇到的情况。 机械师检查您的车辆,然后根据您的要求、车辆状况以及机械师认为维修所需的大致时间和材料,您会收到一份预估计算。 当然,实际成本和时间可能会有所不同。
预估执行计划
在不执行查询的情况下,可以获得基于SQL Server统计信息的估计(逻辑)SQLServer执行计划。 在SQLServer Management Studio (SSMS)中执行以下步骤:
选定查询语句。
点击Display Estimated Execution Plan按钮(键盘快捷键Ctrl+L)
有时SQL Server无法生成预估执行计划; 例如,如果使用了一个参数而没有在查询中指定它的值,或者没有声明一个临时表。
实际执行计划
将查询提交到SQL Server后,您可以获得一个实际的执行计划,该计划表示SQL Server执行查询所采取的步骤。
要获取实际的执行计划,请在运行查询之前按照SSMS中的以下步骤进行操作。
选定查询语句。
点击Display Actual Execution Plan按钮(键盘快捷键Ctrl + M)。
SQL Server执行计划格式
默认情况下,上述SSMS过程会生成图形格式的SQL Server执行计划。 但是您可以选择以三种不同的格式查看执行计划:
图形化格式Graphical
XML格式
文本格式 TEXT
1.图形化执行计划
图形计划描述了所有组件,包括数据流,如下所示。
运算符
运算符显示为图标。 每个操作员都被指定执行特定任务。 例如,SQL Server中的查询优化器可能会执行表扫描tablescan、索引扫描index scan和查找seek。
百分比成本
图形计划还显示了与操作符相关的百分比成本(此处为聚集索引查找的99%)。 该成本与执行查询时使用的其他运算符有关。
数据流箭头
箭头连接运算符,它们的宽度反映了从一个运算符移动到下一个运算符的数据行数。
例如,假设您的查询仅生成单行输出,但需要很长时间才能完成。 将鼠标移动到执行计划中的数据流向箭头处,您会发现读取的行数以百万计。 这代表了资源利用的巨大不平衡,显示需要优化。
工具提示
当将鼠标悬停在某个运算符上时,会出现工具提示,其中包含有关数据流的更多统计信息。
属性窗口
“属性”窗口显示有关运算符及其组件的详细信息。
2. XML格式
XML执行计划采用特定的结构化格式。 尽管XML格式在视觉上不太直观,但它包含XML中的所有细节,并且不需要额外的步骤来查看属性和工具提示。 您可以轻松地将XML格式转换为图形格式,反之亦然。
要将图形执行计划转换为XML格式,请右键单击它并选择Show Execution Plan XML,如下所示。
以下命令还生成XML格式的执行计划:
对于估计计划:SET SHOWPLAN_XML ON
对于实际计划:SET STATISTICS_XML ON
3.文本格式
可以通过多种方式生成执行计划:
SET SHOWPLAN_TEXT ON
该命令生成预估执行计划,没有查询执行的详细信息。 它适用于sqlcmd实用程序等应用程序。
SET SHOWPLAN_ALL ON
此命令生成预估的执行计划,并以表格格式包含有关所有运算符和操作的详细信息。
SET STATISTICS PROFILE
此命令在查询执行后以表格格式生成实际执行计划。
为什么预估的和实际的SQL Server执行计划不同?
预估的和实际的执行计划通常相似,尽管某些情况可能会导致它们不同。
过时的统计数据
预估执行计划与实际执行计划之间存在差异的主要原因是统计数据过时。
查询优化器使用统计信息来构建经济高效且优化的查询执行计划。如果您的统计信息没有更新,或者您的数据采样不合适,查询优化器将执行全面优化并根据旧信息构建执行计划。您还可以获得可能导致查询性能问题的低效执行计划。
当数据频繁更改并且未根据索引维护更新统计信息时,有时会出现过时的统计信息。
串行或并行SQL Server执行计划
在编译时,查询优化器构建一个执行计划,并根据查询成本和并行成本阈值生成一个串行或并行计划。虽然串行和并行模式的执行计划可能相同,但SQL Server根据服务器资源和活动在它们之间做出决定。
估算值无效
如前所述,Algebrizer在执行SQL查询之前绑定对象的名称。假设您指定将在运行时创建名为test的表,然后尝试生成估计的执行计划。由于该表不存在,您将收到一条错误消息,如下所示。