Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server:如何获取/保存“的结果”;统计资料简介;_Sql_Sql Server_Tsql - Fatal编程技术网

SQL Server:如何获取/保存“的结果”;统计资料简介;

SQL Server:如何获取/保存“的结果”;统计资料简介;,sql,sql-server,tsql,Sql,Sql Server,Tsql,我发现set statistics profile on选项对我非常有用,所以我想将该选项的结果保存到表中。然而,在互联网上做了一些研究之后,我没有发现任何机会在执行后自动保存它。我开始考虑xml计划的解析,并找到以下链接 那里的问题对我来说很合适。。。但如果它看起来完全像在上设置statistics profile的结果,则效果会更好。如果您有一个很好的解析计划查询,或者您知道如何将统计配置文件的结果保存到表中,请告诉我。将统计配置文件结果保存到表中的一种方法是将SSMS网格结果保存到文件中,

我发现
set statistics profile on
选项对我非常有用,所以我想将该选项的结果保存到表中。然而,在互联网上做了一些研究之后,我没有发现任何机会在执行后自动保存它。我开始考虑xml计划的解析,并找到以下链接


那里的问题对我来说很合适。。。但如果它看起来完全像
上设置statistics profile的结果,则效果会更好。如果您有一个很好的解析计划查询,或者您知道如何将统计配置文件的结果保存到表中,请告诉我。

将统计配置文件结果保存到表中的一种方法是将SSMS网格结果保存到文件中,然后使用Powershell脚本导入到表中。下面是SQL Server 2014的示例脚本。确保在工具-->选项-->查询结果-->SQL Server-->结果到网格下指定了“包含列标题…”和“包含列表分隔符的引号字符串…”选项

通过右键单击网格结果,选择“保存结果…”并选择CSV类型,将统计配置文件输出保存到文件中。然后运行Powershell脚本,指定所需的服务器名、文件名和表名。此脚本将在每次执行时重新创建表,但您可以根据需要对其进行自定义

[CmdletBinding()]
param (
    [string]$ConnectionString = "Data Source=.;Initial Catalog=tempdb;Integrated Security=SSPI;Application Name=StatisticsProfileImport",
    [string]$StatProfileFileName = "C:\Temp\statistics_profile.csv",    
    [string]$StatProfileTableName = "dbo.StatisticsProfile"
)

Function Create-Table()
{

    $createTableStatement = @("IF(OBJECT_ID(N'$StatProfileTableName ', 'U')) IS NOT NULL
        DROP TABLE $StatProfileTableName;
    CREATE TABLE $StatProfileTableName(
         Rows   bigint
        ,Executes bigint
        ,StmtText nvarchar(MAX)
        ,StmtId int
        ,NodeId int
        ,Parent int
        ,PhysicalOp nvarchar(100)
        ,LogicalOp nvarchar(100)
        ,Argument nvarchar(MAX)
        ,DefinedValues nvarchar(MAX)
        ,EstimateRows float
        ,EstimateIO float
        ,EstimateCPU float
        ,AvgRowSize float
        ,TotalSubtreeCost float
        ,OutputList nvarchar(MAX)
        ,Warnings nvarchar(MAX)
        ,Type nvarchar(100)
        ,Parallel int
        ,EstimateExecutions bigint
        );");

    $connection = New-Object System.Data.SqlClient.SqlConnection $ConnectionString;
    $command = New-Object System.Data.SqlClient.SqlCommand $createTableStatement;
    $command.Connection = $connection;
    $connection.Open();
    $null = $command.ExecuteNonQuery();
    $connection.Close();

}

Function Get-SqlIntParameterValue($value)
{
    if(( $value -eq "NULL") -or [System.String]::IsNullOrWhiteSpace($value)) {[System.DBNull]::Value} else {[System.Int32]::Parse($value)};
}
Function Get-SqlBigIntParameterValue($value)
{
    if(( $value -eq "NULL") -or [System.String]::IsNullOrWhiteSpace($value)) {[System.DBNull]::Value} else {[System.Int64]::Parse($value)};
}
Function Get-SqlStringParameterValue($value)
{
    if(( $value -eq "NULL") -or [System.String]::IsNullOrWhiteSpace($value)) {[System.DBNull]::Value} else {$value};
}
Function Get-SqlFloatParameterValue($value)
{
    if(( $value -eq "NULL") -or [System.String]::IsNullOrWhiteSpace($value)) {[System.DBNull]::Value} else {[System.Double]::Parse($value)};
}

Function Create-Insert-Command()
{

    $insertStatement = @("INSERT INTO $StatProfileTableName VALUES(
          @Rows
        , @Executes
        , @StmtText
        , @StmtId
        , @NodeId
        , @Parent
        , @PhysicalOp
        , @LogicalOp
        , @Argument
        , @DefinedValues
        , @EstimateRows
        , @EstimateIO
        , @EstimateCPU
        , @AvgRowSize
        , @TotalSubtreeCost
        , @OutputList
        , @Warnings
        , @Type
        , @Parallel
        , @EstimateExecutions
        );");

    $command = New-Object System.Data.SqlClient.SqlCommand $insertStatement;
    $null = $command.Parameters.Add("@Rows", [System.Data.SqlDbType]::BigInt);
    $null = $command.Parameters.Add("@Executes", [System.Data.SqlDbType]::BigInt);
    $null = $command.Parameters.Add("@StmtText", [System.Data.SqlDbType]::NVarChar, -1);
    $null = $command.Parameters.Add("@StmtId", [System.Data.SqlDbType]::Int);
    $null = $command.Parameters.Add("@NodeId", [System.Data.SqlDbType]::Int);
    $null = $command.Parameters.Add("@Parent", [System.Data.SqlDbType]::Int);
    $null = $command.Parameters.Add("@PhysicalOp", [System.Data.SqlDbType]::NVarChar, 100);
    $null = $command.Parameters.Add("@LogicalOp", [System.Data.SqlDbType]::NVarChar, 100);
    $null = $command.Parameters.Add("@Argument", [System.Data.SqlDbType]::NVarChar, -1);
    $null = $command.Parameters.Add("@DefinedValues", [System.Data.SqlDbType]::NVarChar, -1);
    $null = $command.Parameters.Add("@EstimateRows", [System.Data.SqlDbType]::Float);
    $null = $command.Parameters.Add("@EstimateIO", [System.Data.SqlDbType]::Float);
    $null = $command.Parameters.Add("@EstimateCPU", [System.Data.SqlDbType]::Float);
    $null = $command.Parameters.Add("@AvgRowSize", [System.Data.SqlDbType]::Float);
    $null = $command.Parameters.Add("@TotalSubtreeCost", [System.Data.SqlDbType]::Float);
    $null = $command.Parameters.Add("@OutputList", [System.Data.SqlDbType]::NVarChar, -1);
    $null = $command.Parameters.Add("@Warnings", [System.Data.SqlDbType]::NVarChar, -1);
    $null = $command.Parameters.Add("@Type", [System.Data.SqlDbType]::NVarChar, 100);
    $null = $command.Parameters.Add("@Parallel", [System.Data.SqlDbType]::Int);
    $null = $command.Parameters.Add("@EstimateExecutions", [System.Data.SqlDbType]::BigInt);

    return $command;

}

Function Assign-Parameter-Values($insertCommand, $statProfileRecord)
{

    $insertCommand.Parameters["@Rows"].Value = Get-SqlBigIntParameterValue($statProfileRecord.Rows);
    $insertCommand.Parameters["@Executes"].Value = Get-SqlBigIntParameterValue($statProfileRecord.Executes);
    $insertCommand.Parameters["@StmtText"].Value = Get-SqlStringParameterValue($statProfileRecord.StmtText);
    $insertCommand.Parameters["@StmtId"].Value = Get-SqlIntParameterValue($statProfileRecord.StmtId);
    $insertCommand.Parameters["@NodeId"].Value = Get-SqlIntParameterValue($statProfileRecord.NodeId);
    $insertCommand.Parameters["@Parent"].Value = Get-SqlIntParameterValue($statProfileRecord.Parent);
    $insertCommand.Parameters["@PhysicalOp"].Value = Get-SqlStringParameterValue($statProfileRecord.PhysicalOp);
    $insertCommand.Parameters["@LogicalOp"].Value = Get-SqlStringParameterValue($statProfileRecord.LogicalOp);
    $insertCommand.Parameters["@Argument"].Value = Get-SqlStringParameterValue($statProfileRecord.Argument);
    $insertCommand.Parameters["@DefinedValues"].Value = Get-SqlStringParameterValue($statProfileRecord.DefinedValues);
    $insertCommand.Parameters["@EstimateRows"].Value = Get-SqlFloatParameterValue($statProfileRecord.EstimateRows);
    $insertCommand.Parameters["@EstimateIO"].Value = Get-SqlFloatParameterValue($statProfileRecord.EstimateIO);
    $insertCommand.Parameters["@EstimateCPU"].Value = Get-SqlFloatParameterValue($statProfileRecord.EstimateCPU);
    $insertCommand.Parameters["@AvgRowSize"].Value = Get-SqlFloatParameterValue($statProfileRecord.AvgRowSize);
    $insertCommand.Parameters["@TotalSubtreeCost"].Value = Get-SqlFloatParameterValue($statProfileRecord.TotalSubtreeCost);
    $insertCommand.Parameters["@OutputList"].Value = Get-SqlStringParameterValue($statProfileRecord.OutputList);
    $insertCommand.Parameters["@Warnings"].Value = Get-SqlStringParameterValue($statProfileRecord.Warnings);
    $insertCommand.Parameters["@Type"].Value = Get-SqlStringParameterValue($statProfileRecord.Type);
    $insertCommand.Parameters["@Parallel"].Value = Get-SqlIntParameterValue($statProfileRecord.Parallel);
    $insertCommand.Parameters["@EstimateExecutions"].Value = Get-SqlBigIntParameterValue($EstimateExecutions.EstimateExecutions);

}

### main ###

Create-Table;
$insertCommand = Create-Insert-Command;

$statProfile = Import-Csv $StatProfileFileName;
$connection = New-Object System.Data.SqlClient.SqlConnection $ConnectionString;
$insertCommand.Connection = $connection;
$connection.Open();

foreach($statProfileRecord in $statProfile)
{

    Assign-Parameter-Values $insertCommand $statProfileRecord;
    $null = $insertCommand.ExecuteNonQuery();

}

$connection.Close();

这不是我想要的。正如您所指出的,有很多方法可以保存SSM的结果。我给你更多的信息,例如:我有一个应用程序,我有数据库级别的性能问题。是的,我能够检查DMV并从中获取执行计划等等,但我想问的是“如何从执行计划中获取数据,如‘统计配置文件’或显示数据的脚本”。通常,我知道如何使用.NET应用程序获取此信息–只需添加
统计配置文件
以查询和处理第二个结果集。这种方法非常困难,所以我试图找到更“动态”和更简单的方法。