Как получить план выполнения запросов?

в Microsoft SQL Server, как можно получить план выполнения запросов для Запрос / сохраненная процедура?

331
задан Alexander Abakumov 8 March 2018 в 05:46
поделиться

3 ответа

Можно также сделать это через powershell использование СТАТИСТИКИ НАБОРА XML НА получить фактический план. Я записал это так, чтобы это объединило составные планы в один план;

    ########## BEGIN : SCRIPT VARIABLES #####################
    [string]$server = '.\MySQLServer'
    [string]$database = 'MyDatabase'
    [string]$sqlCommand = 'EXEC sp_ExampleSproc'
    [string]$XMLOutputFileName = 'sp_ExampleSproc'
    [string]$XMLOutputPath = 'C:\SQLDumps\ActualPlans\'
    ########## END   : SCRIPT VARIABLES #####################

    #Set up connection
    $connectionString = "Persist Security Info=False;Integrated Security=true;Connection Timeout=0;Initial Catalog=$database;Server=$server"
    $connection = new-object system.data.SqlClient.SQLConnection($connectionString)

    #Set up commands
    $command = new-object system.data.sqlclient.sqlcommand($sqlCommand,$connection)
    $command.CommandTimeout = 0
    $commandXMLActPlanOn = new-object system.data.sqlclient.sqlcommand("SET STATISTICS XML ON",$connection)
    $commandXMLActPlanOff = new-object system.data.sqlclient.sqlcommand("SET STATISTICS XML OFF",$connection)

    $connection.Open()

    #Enable session XML plan
    $result = $commandXMLActPlanOn.ExecuteNonQuery()

    #Execute SP and return resultsets into a dataset
    $adapter = New-Object System.Data.sqlclient.sqlDataAdapter $command
    $dataset = New-Object System.Data.DataSet
    $adapter.Fill($dataSet) | Out-Null

    #Set up output file name and path
    [string]$fileNameDateStamp = get-date -f yyyyMMdd_HHmmss
    [string]$XMLOutputFilePath = "$XMLOutputPath$XMLOutputFileName`_$fileNameDateStamp.sqlplan"

    #Pull XML plans out of dataset and merge into one multi-statement plan
    [int]$cntr = 1
    ForEach($table in $dataset.Tables)
    {
            if($table.Columns[0].ColumnName -eq "Microsoft SQL Server 2005 XML Showplan")
            {

                [string]$fullXMLPlan = $Table.rows[0]."Microsoft SQL Server 2005 XML Showplan"

                if($cntr -eq 1)
                    {

                    [regex]$rx = "\<ShowPlanXML xmlns\=.{1,}\<Statements\>"
                    [string]$startXMLPlan = $rx.Match($fullXMLPlan).Value
                    [regex]$rx = "\<\/Statements\>.{1,}\<\/ShowPlanXML\>"
                    [string]$endXMLPlan = $rx.Match($fullXMLPlan).Value

                    $startXMLPlan | out-file -Append -FilePath $XMLOutputFilePath

                    }

                [regex]$rx = "\<StmtSimple.{1,}\<\/StmtSimple\>"
                [string]$bodyXMLPlan = $rx.Match($fullXMLPlan).Value

                $bodyXMLPlan | out-file -Append -FilePath $XMLOutputFilePath

                $cntr += 1
            } 
    }

    $endXMLPlan | out-file -Append -FilePath $XMLOutputFilePath

    #Disable session XML plan
    $result = $commandXMLActPlanOff.ExecuteNonQuery()

    $connection.Close()
1
ответ дан 23 November 2019 в 00:45
поделиться

, Поскольку я объяснил в [1 112] эта статья , существует два типа плана выполнения, которые можно получить при использовании SQL Server.

Предполагаемый план выполнения

предполагаемый план выполнения сгенерирован Оптимизатором, не выполняя SQL-запрос.

для получения предполагаемого плана выполнения, необходимо включить SHOWPLAN_ALL установка до выполнения запроса.

УСТАНАВЛИВАЕТ SHOWPLAN_ALL НА [1 127]

Теперь, при выполнении следующего SQL-запроса:

SELECT p.id
FROM post p
WHERE EXISTS (
  SELECT 1
  FROM post_comment pc
  WHERE
    pc.post_id = p.id AND
    pc.review = 'Bingo'
)
ORDER BY p.title
OFFSET 20 ROWS
FETCH NEXT 10 ROWS ONLY

SQL Server генерирует следующий предполагаемый план выполнения:

| NodeId | Parent | LogicalOp            | EstimateRows | EstimateIO  | EstimateCPU | AvgRowSize | TotalSubtreeCost | EstimateExecutions |
|--------|--------|----------------------|--------------|-------------|-------------|------------|------------------|--------------------|
| 1      | 0      | NULL                 | 10           | NULL        | NULL        | NULL       | 0.03374284       | NULL               |
| 2      | 1      | Top                  | 10           | 0           | 3.00E-06    | 15         | 0.03374284       | 1                  |
| 4      | 2      | Distinct Sort        | 30           | 0.01126126  | 0.000504114 | 146        | 0.03373984       | 1                  |
| 5      | 4      | Inner Join           | 46.698       | 0           | 0.00017974  | 146        | 0.02197446       | 1                  |
| 6      | 5      | Clustered Index Scan | 43           | 0.004606482 | 0.0007543   | 31         | 0.005360782      | 1                  |
| 7      | 5      | Clustered Index Seek | 1            | 0.003125    | 0.0001581   | 146        | 0.0161733        | 43                 |

После выполнения запроса мы интересуемся получением предполагаемого плана выполнения, необходимо отключить SHOWPLAN_ALL как, иначе, текущая сессия базы данных только генерирует оцененный план выполнения вместо того, чтобы выполнить обеспеченные SQL-запросы.

SET SHOWPLAN_ALL OFF

Studio управления SQL Server оценил план

В приложении Studio управления SQL Server, можно легко получить предполагаемый план выполнения относительно любого SQL-запроса путем удара CTRL+L ключевой ярлык.

enter image description here

Фактический план выполнения

фактический план выполнения SQL сгенерирован Оптимизатором при выполнении SQL-запроса. Если статистические данные таблицы базы данных точны, фактический план не должен значительно отличаться от предполагаемого.

Для получения фактического плана выполнения по SQL Server необходимо включить эти STATISTICS IO, TIME, PROFILE настройки, как проиллюстрировано следующей командой SQL:

SET STATISTICS IO, TIME, PROFILE ON

Теперь, при выполнении предыдущего запроса, SQL Server собирается генерировать следующий план выполнения:

| Rows | Executes | NodeId | Parent | LogicalOp            | EstimateRows | EstimateIO  | EstimateCPU | AvgRowSize | TotalSubtreeCost |
|------|----------|--------|--------|----------------------|--------------|-------------|-------------|------------|------------------|
| 10   | 1        | 1      | 0      | NULL                 | 10           | NULL        | NULL        | NULL       | 0.03338978       |
| 10   | 1        | 2      | 1      | Top                  | 1.00E+01     | 0           | 3.00E-06    | 15         | 0.03338978       |
| 30   | 1        | 4      | 2      | Distinct Sort        | 30           | 0.01126126  | 0.000478783 | 146        | 0.03338679       |
| 41   | 1        | 5      | 4      | Inner Join           | 44.362       | 0           | 0.00017138  | 146        | 0.02164674       |
| 41   | 1        | 6      | 5      | Clustered Index Scan | 41           | 0.004606482 | 0.0007521   | 31         | 0.005358581      |
| 41   | 41       | 7      | 5      | Clustered Index Seek | 1            | 0.003125    | 0.0001581   | 146        | 0.0158571        |

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

(10 row(s) affected)
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'post'. Scan count 0, logical reads 116, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'post_comment'. 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.

(6 row(s) affected)

SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 1 ms.

После выполнения запроса мы интересуемся получением фактического плана выполнения, необходимо отключить эти STATISTICS IO, TIME, PROFILE ON настройки как это:

SET STATISTICS IO, TIME, PROFILE OFF

Studio управления SQL Server фактический план

В приложении Studio управления SQL Server, можно легко получить предполагаемый план выполнения относительно любого SQL-запроса путем удара CTRL+M ключевой ярлык.

enter image description here

для получения дополнительной информации о получении плана выполнения при использовании SQL Server, проверьте эта статья .

0
ответ дан 23 November 2019 в 00:45
поделиться

Объяснение плана выполнения может быть очень подробным и занимать довольно много времени на чтение, но в целом, если вы используете «объяснение» перед запросом, оно должно дать вам много информации, в том числе о том, какие части были выполнены первыми и так далее. Если вы хотите прочитать немного больше информации об этом, я собрал небольшой блог об этом, который также указывает на правильных ссылок. https://medium.com/swlh/jetbrains-datagrip-explain-plan-ac406772c470

0
ответ дан 23 November 2019 в 00:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: