Fajela Tajkiya Asked: 2023-04-29 23:15:37 +0800 CST2023-04-29 23:15:37 +0800 CST 2023-04-29 23:15:37 +0800 CST 是否可以将统计分析结果保存到表格中? 772 在 SQL Server 中,我们可以使用set statistics profile on启用会话分析。然后你可以执行任意一条语句,对应的执行计划会以表格的形式显示出来。是否可以将这个流行的表单计划保存到某个表中,以便我可以对其进行过滤? 此 tablet 表单执行计划的示例如下所示: sql-server 2 个回答 Voted Best Answer Dan Guzman 2023-04-30T04:50:29+08:002023-04-30T04:50:29+08:00 的输出set statistics profile on在正常查询结果(如果有的话)之后作为结果集返回给客户端应用程序。这可以由客户端应用程序(如您问题中的 SSMS)捕获,但不能由 T-SQL 代码捕获。 下面是一个 PowerShell 示例,它执行查询并将STATISTICS PROFILE ON统计分析结果插入到表中以满足临时需求。 $query = @" SET STATISTICS PROFILE ON; SELECT * FROM dbo.YourTable; "@ $connectionString = "Data Source=.;Initial Catalog=YourDatabase;Integrated Security=SSPI" $connection = New-Object System.Data.SqlClient.SqlConnection($connectionString) try { $connection.Open() $command = New-Object System.Data.SqlClient.SqlCommand($query, $connection) $queryResults = New-Object System.Data.DataTable $statisticsProfileResults = New-Object System.Data.DataTable $reader = $command.ExecuteReader() # get query results (first result set) $queryResults.Load($reader) # get stats profile results (second result set) $statisticsProfileResults.Load($reader) $reader.Close() # insert stats profile results into table $bcp = New-Object System.Data.SqlClient.SqlBulkCopy($connection) $bcp.DestinationTableName = "dbo.statistics_profile" $bcp.WriteToServer($statisticsProfileResults) } finally { if ($reader -ne $null) { $reader.Dispose() } if ($command -ne $null) { $command.Dispose() } if ($bcp -ne $null) { $bcp.Dispose() } if ($connection -ne $null) { $connection.Dispose() } } 统计资料表的 DDL: CREATE TABLE dbo.statistics_profile( Rows bigint NOT NULL , Executes bigint NOT NULL , StmtText nvarchar(MAX) NOT NULL , StmtId int NOT NULL , NodeId int NOT NULL , Parent int NOT NULL , PhysicalOp sysname NULL , LogicalOp sysname NULL , Argument nvarchar(MAX) NULL , DefinedValues nvarchar(MAX) NULL , EstimateRows real NULL , EstimateIO real NULL , EstimateCPU real NULL , AvgRowSize int NULL , TotalSubtreeCost real NULL , OutputList nvarchar(MAX) NULL , Warnings nvarchar(MAX) NULL , Type sysname NULL , Parallel bit NULL , EstimateExecutions real NULL ); White Owl 2023-04-30T04:25:49+08:002023-04-30T04:25:49+08:00 您看到的表是来自普通单结果集查询的第二个结果集。 要查看它,您需要一个能够处理多个结果集的客户端。标准工具(例如 SQL Server Management Studio)知道如何识别此类结果集并将它们显示为“执行计划”。 如果您编写自己的客户端,那么该计划将作为一个正常的结果集传给您。从查询中获取所有记录,切换到第二个结果集并获取计划的所有记录。因此,例如,将其转储到文本文件中会很容易。如果需要 - 你可以将它加载到某个表中。 目前,T-SQL 中无法切换到下一个结果集。服务器可以生成它们,所有客户端接口都可以读取它们。但服务器本身不能。
的输出
set statistics profile on
在正常查询结果(如果有的话)之后作为结果集返回给客户端应用程序。这可以由客户端应用程序(如您问题中的 SSMS)捕获,但不能由 T-SQL 代码捕获。下面是一个 PowerShell 示例,它执行查询并将
STATISTICS PROFILE ON
统计分析结果插入到表中以满足临时需求。统计资料表的 DDL:
您看到的表是来自普通单结果集查询的第二个结果集。
要查看它,您需要一个能够处理多个结果集的客户端。标准工具(例如 SQL Server Management Studio)知道如何识别此类结果集并将它们显示为“执行计划”。
如果您编写自己的客户端,那么该计划将作为一个正常的结果集传给您。从查询中获取所有记录,切换到第二个结果集并获取计划的所有记录。因此,例如,将其转储到文本文件中会很容易。如果需要 - 你可以将它加载到某个表中。
目前,T-SQL 中无法切换到下一个结果集。服务器可以生成它们,所有客户端接口都可以读取它们。但服务器本身不能。