0
点赞
收藏
分享

微信扫一扫

sql 性能优化:sql server 性能检测必用方法SET STATISTICS IO ,SET STATISTICS TIME,SET SHOWPLAN_ALL,SET SHOWPLAN_XML

你可以通过print()方法向“消息”选项卡输入信息

print('-------打印消息---------')

结果

-------打印消息---------

 如图

sql 性能优化:sql server 性能检测必用方法SET STATISTICS IO ,SET STATISTICS TIME,SET SHOWPLAN_ALL,SET SHOWPLAN_XML_数据库

 

一、显示执行计划

1.1 显示估计的执行计划

sql 性能优化:sql server 性能检测必用方法SET STATISTICS IO ,SET STATISTICS TIME,SET SHOWPLAN_ALL,SET SHOWPLAN_XML_database_02

 1.2包裹实际的执行计划sql 性能优化:sql server 性能检测必用方法SET STATISTICS IO ,SET STATISTICS TIME,SET SHOWPLAN_ALL,SET SHOWPLAN_XML_数据库_03

1.3 计划结果

sql 性能优化:sql server 性能检测必用方法SET STATISTICS IO ,SET STATISTICS TIME,SET SHOWPLAN_ALL,SET SHOWPLAN_XML_database_04

 

详细翻阅:

​​MSSQLSERVER执行计划详解 - 张龙豪 - 博客园​​

二、SET STATISTICS IO 语句所生成的磁盘活动量的相关信息

SET STATISTICS IO (Transact-SQL)

导致 SQL Server 显示 Transact-SQL 语句所生成的磁盘活动量的相关信息。

官方地址:​​SET STATISTICS IO (Transact-SQL) - SQL Server | Microsoft Docs​​

适用于: 是SQL Server(所有支持的版本) 是Azure SQL 数据库

导致 SQL Server 显示 Transact-SQL 语句所生成的磁盘活动量的相关信息。

语法

SET STATISTICS IO { ON | OFF }

示例

此示例显示 SQL Server 处理语句时,进行了多少次逻辑读和物理读操作。

USE AdventureWorks2012;  
GO
SET STATISTICS IO ON; --开启
GO
SELECT *
FROM Production.ProductCostHistory
WHERE StandardCost < 500.00;
GO
SET STATISTICS IO OFF; --关闭
GO

下面是结果集:

Table 'ProductCostHistory'. Scan count 1, logical reads 5, physical   
reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0,
lob read-ahead reads 0.

中文提示是这样的

(8 行受影响)
'Product'。扫描计数 1,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

三、SET STATISTICS TIME 显示分析、编译和执行各语句所需的毫秒数。

SET STATISTICS TIME (Transact-SQL)

适用于: 是SQL Server(所有支持的版本) 是Azure SQL 数据库

显示分析、编译和执行各语句所需的毫秒数。

官方地址:​​SET STATISTICS TIME (Transact-SQL) - SQL Server | Microsoft Docs​​

语法

SET STATISTICS TIME { ON | OFF }

 示例

下面的示例显示服务器的执行、分析和编译时间。

USE AdventureWorks2012;  
GO
SET STATISTICS TIME ON; --开启
GO
SELECT ProductID, StartDate, EndDate, StandardCost
FROM Production.ProductCostHistory
WHERE StandardCost < 500.00;
GO
SET STATISTICS TIME OFF; --关闭
GO

下面是结果集:

SQL Server parse and compile time:   
CPU time = 0 ms, elapsed time = 1 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 1 ms.

(269 row(s) affected)

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 2 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 1 ms.

中文提示是这样的

SQL Server 分析和编译时间: 
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

(8 行受影响)

SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 7 毫秒。

四、SET SHOWPLAN_ALL  返回有关语句执行情况的详细信息,并估计语句对资源的需求。

SET SHOWPLAN_ALL (Transact-SQL)

适用于: 是SQL Server(所有支持的版本) 是Azure SQL 数据库

使 Microsoft SQL Server 不执行 Transact-SQL 语句。 SQL Server 返回有关语句执行情况的详细信息,并估计语句对资源的需求。

官方地址:​​SET SHOWPLAN_ALL (Transact-SQL) - SQL Server | Microsoft Docs​​

语法

SET SHOWPLAN_ALL { ON | OFF }

示例

下面两个语句使用了 SET SHOWPLAN_ALL 设置,以显示 SQL Server 在查询中分析和优化索引的方法。

第一个查询在 WHERE 子句中使用针对索引列的等于比较运算符 (=)。 从而在 LogicalOp 列内得到 Clustered Index Seek 值,在 Argument 列内生成索引名。

第二个查询在 WHERE 子句中使用 LIKE 运算符。 这将强制 SQL Server 使用聚集索引扫描并查找满足 WHERE 子句条件的数据。 从而在 LogicalOp 列内得到 Clustered Index Scan 值,在 Argument 列内生成索引名;在 LogicalOp 列内得到 Filter 值,在 Argument 列内出现 WHERE 子句条件。

第一个索引查询的 EstimateRows 和 TotalSubtreeCost 列中的值较小,这表示与非索引查询相比,该查询的处理速度快得多且使用的资源更少。

USE AdventureWorks2012;  
GO
SET SHOWPLAN_ALL ON; --开启
GO
-- First query.
SELECT BusinessEntityID
FROM HumanResources.Employee
WHERE NationalIDNumber = '509647174';
GO
-- Second query.
SELECT BusinessEntityID, EmergencyContactID
FROM HumanResources.Employee
WHERE EmergencyContactID LIKE '1%';
GO
SET SHOWPLAN_ALL OFF; --关闭
GO

 结果sql 性能优化:sql server 性能检测必用方法SET STATISTICS IO ,SET STATISTICS TIME,SET SHOWPLAN_ALL,SET SHOWPLAN_XML_数据库_05

 

五、SET SHOWPLAN_XML 返回有关如何以定义好的 XML 文档格式执行上述语句的详细信息。

SET SHOWPLAN_XML (Transact-SQL)

适用于: 是SQL Server(所有支持的版本) 是Azure SQL 数据库 是Azure SQL 托管实例 是Azure Synapse Analytics

使 SQL Server 不执行 Transact-SQL 语句。 而 SQL Server 返回有关如何以定义好的 XML 文档格式执行上述语句的详细信息。

官方地址:​​SET SHOWPLAN_XML (Transact-SQL) - SQL Server | Microsoft Docs​​

语法

SET SHOWPLAN_XML { ON | OFF }

示例

下面两个语句使用了 SET SHOWPLAN_XML 设置,以显示 SQL Server 在查询中分析和优化索引的方法。

第一个查询在 WHERE 子句中使用针对索引列的等于比较运算符 (=)。 第二个查询在 WHERE 子句中使用 LIKE 运算符。 这将强制 SQL Server 使用聚集索引扫描并查找满足 WHERE 子句条件的数据。 第一个索引查询的 EstimateRows 和 EstimatedTotalSubtreeCost 属性中的值较小,这表示与非索引查询相比,该查询的处理速度快得多且使用更少的资源。

USE AdventureWorks2012;
GO
SET SHOWPLAN_XML ON; --开启
GO
-- First query.
SELECT BusinessEntityID
FROM HumanResources.Employee
WHERE NationalIDNumber = '509647174';
GO
-- Second query.
SELECT BusinessEntityID, JobTitle
FROM HumanResources.Employee
WHERE JobTitle LIKE 'Production%';
GO
SET SHOWPLAN_XML OFF; --关闭

如:我的本地库

USE   [DBTase]
GO
SET SHOWPLAN_XML ON;
GO
-- First query.
SELECT *
FROM [dbo].[Product]
GO
-- Second query.
SELECT *
FROM [dbo].[Table_1]
GO
SET SHOWPLAN_XML OFF;

结果

sql 性能优化:sql server 性能检测必用方法SET STATISTICS IO ,SET STATISTICS TIME,SET SHOWPLAN_ALL,SET SHOWPLAN_XML_xml_06

 点开后是这样的

sql 性能优化:sql server 性能检测必用方法SET STATISTICS IO ,SET STATISTICS TIME,SET SHOWPLAN_ALL,SET SHOWPLAN_XML_sql_07

内容

<ShowPlanXML xmlns="http://schemas.microsoft.com/sqlserver/2004/07/showplan" Version="1.2" Build="11.0.2100.60"><BatchSequence><Batch><Statements><StmtSimple StatementText="-- First query.&#xd;&#xa;SELECT *&#xd;&#xa;FROM [dbo].[Product]&#xd;&#xa;" StatementId="1" StatementCompId="1" StatementType="SELECT" RetrievedFromCache="false" StatementSubTreeCost="0.0032908" StatementEstRows="8" StatementOptmLevel="TRIVIAL" QueryHash="0x70EFBFC3E62AD95E" QueryPlanHash="0x865F383BA2A66197"><StatementSetOptions QUOTED_IDENTIFIER="true" ARITHABORT="true" CONCAT_NULL_YIELDS_NULL="true" ANSI_NULLS="true" ANSI_PADDING="true" ANSI_WARNINGS="true" NUMERIC_ROUNDABORT="false"/><QueryPlan CachedPlanSize="16" CompileTime="0" CompileCPU="0" CompileMemory="72"><MemoryGrantInfo SerialRequiredMemory="0" SerialDesiredMemory="0"/><OptimizerHardwareDependentProperties EstimatedAvailableMemoryGrant="206836" EstimatedPagesCached="51709" EstimatedAvailableDegreeOfParallelism="2"/><RelOp NodeId="0" PhysicalOp="Clustered Index Scan" LogicalOp="Clustered Index Scan" EstimateRows="8" EstimateIO="0.003125" EstimateCPU="0.0001658" AvgRowSize="69" EstimatedTotalSubtreeCost="0.0032908" TableCardinality="8" Parallel="0" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row"><OutputList><ColumnReference Database="[DBTase]" Schema="[dbo]" Table="[Product]" Column="ID"/><ColumnReference Database="[DBTase]" Schema="[dbo]" Table="[Product]" Column="TypeID"/><ColumnReference Database="[DBTase]" Schema="[dbo]" Table="[Product]" Column="Name"/></OutputList><IndexScan Ordered="0" ForcedIndex="0" ForceScan="0" NoExpandHint="0"><DefinedValues><DefinedValue><ColumnReference Database="[DBTase]" Schema="[dbo]" Table="[Product]" Column="ID"/></DefinedValue><DefinedValue><ColumnReference Database="[DBTase]" Schema="[dbo]" Table="[Product]" Column="TypeID"/></DefinedValue><DefinedValue><ColumnReference Database="[DBTase]" Schema="[dbo]" Table="[Product]" Column="Name"/></DefinedValue></DefinedValues><Object Database="[DBTase]" Schema="[dbo]" Table="[Product]" Index="[PK_Product]" IndexKind="Clustered"/></IndexScan></RelOp></QueryPlan></StmtSimple></Statements></Batch></BatchSequence></ShowPlanXML>

 

六、SET SHOWPLAN_TEXT 返回有关如何执行语句的详细信息

SET SHOWPLAN_TEXT (Transact-SQL)
适用于: 是SQL Server(所有支持的版本) 是Azure SQL 数据库

使 Microsoft SQL Server 不执行 Transact-SQL 语句。 而是由 SQL Server 返回有关如何执行语句的详细信息。

官方地址:​​SET SHOWPLAN_TEXT (Transact-SQL) - SQL Server | Microsoft Docs​​

语法

SET SHOWPLAN_TEXT { ON | OFF }

示例

此例显示 SQL Server 在处理语句时如何使用索引。

下面是使用索引的查询:

USE AdventureWorks2012;  
GO
SET SHOWPLAN_TEXT ON; --开启
GO
SELECT *
FROM Production.Product
WHERE ProductID = 905;
GO
SET SHOWPLAN_TEXT OFF; --关闭
GO

下面是结果集:

StmtText                                             
---------------------------------------------------
SELECT *
FROM Production.Product
WHERE ProductID = 905;

StmtText
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|--Clustered Index Seek(OBJECT:([AdventureWorks2012].[Production].[Product].[PK_Product_ProductID]), SEEK:([AdventureWorks2012].[Production].[Product].[ProductID]=CONVERT_IMPLICIT(int,[@1],0)) ORDERED FORWARD)

下面是不使用索引的查询:

USE AdventureWorks2012;  
GO
SET SHOWPLAN_TEXT ON; --开启
GO
SELECT *
FROM Production.ProductCostHistory
WHERE StandardCost < 500.00;
GO
SET SHOWPLAN_TEXT OFF; --关闭
GO

下面是结果集:

StmtText                                                                  
------------------------------------------------------------------------
SELECT *
FROM Production.ProductCostHistory
WHERE StandardCost < 500.00;

StmtText
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|--Clustered Index Scan(OBJECT:([AdventureWorks2012].[Production].[ProductCostHistory].[PK_ProductCostHistory_ProductCostID]), WHERE:([AdventureWorks2012].[Production].[ProductCostHistory].[StandardCost]<[@1]))

我的测试

GO  
SET SHOWPLAN_TEXT ON; --开启
GO
SELECT *
FROM [dbo].[Table_1]

GO
SET SHOWPLAN_TEXT OFF; --关闭
GO

sql 性能优化:sql server 性能检测必用方法SET STATISTICS IO ,SET STATISTICS TIME,SET SHOWPLAN_ALL,SET SHOWPLAN_XML_数据库_08

 


举报

相关推荐

0 条评论