Я использую SQL Server 2016/2019. Я хочу извлечь (для заданного @QueryPlanHash BINARY(8) = 0x397CEDB37FA0E1D2) из XML плана выполнения в кеше — какая статистика использовалась для создания этого плана.
Этот раздел в плане XML выглядит следующим образом:
<OptimizerStatsUsage>
<StatisticsInfo Database = "[MyDatabaseName]" Schema = "[dbo]" Table = "[MyTable_1]"
Statistics = "[IX_MyTable_1_Field1]" ModificationCount = "2"
SamplingPercent = "100" LastUpdate = "2024-06-13T13:39:04.41" />
<StatisticsInfo Database = "[MyDatabaseName]" Schema = "[dbo]" Table = "[MyTable_2]"
Statistics = "[_WA_Sys_00000015_4B4D17CD]" ModificationCount = "0"
SamplingPercent = "100" LastUpdate = "2024-06-13T12:06:33.17" />
</OptimizerStatsUsage>
Если возможно, мне нужна информация:
Другими словами, что вы уже пробовали и почему это не удалось? Сайт не является бесплатным сервисом по написанию кода.





Я рекомендую использовать Powershell. Для доступа к базе данных можно использовать командлет Invoke-SQLCMD. После того, как вы получите XML, вы можете использовать его для анализа XML.
using assembly System.Xml.Linq
$input_filename = 'c:\temp\test.xml'
$doc = [System.Xml.Linq.XDocument]::Load($input_filename)
$OptimizerStatsUsage = $doc.Descendants('OptimizerStatsUsage')[0]
$table = [System.Collections.ArrayList]::new()
foreach($statisticsInfo in $OptimizerStatsUsage[0].Elements('StatisticsInfo'))
{
$schema = $statisticsInfo.Attribute('Schema').Value
$xTable = $statisticsInfo.Attribute('Table').Value
$statistics = $statisticsInfo.Attribute('Statistics').Value
$modificationCount = $statisticsInfo.Attribute('ModificationCount').Value
$samplingPercent = $statisticsInfo.Attribute('SamplingPercent').Value
$lastUpdate = $statisticsInfo.Attribute('LastUpdate').Value
$newRow = [pscustomobject]@{
Schema = $schema.Trim(@('[',']'))
Table = $xTable.Trim(@('[',']'))
Statistics = $statistics.Trim(@('[',']'))
ModificationCount = [int]$modificationCount
SamplingPercent = [decimal]$samplingPercent
LastUpdate = [DateTime]::Parse($lastUpdate)
}
$table.Add($newRow) | out-null
}
$table
Полученные результаты
Schema : dbo
Table : MyTable_1
Statistics : IX_MyTable_1_Field1
ModificationCount : 2
SamplingPercent : 100
LastUpdate : 6/13/2024 1:39:04 PM
Schema : dbo
Table : MyTable_2
Statistics : _WA_Sys_00000015_4B4D17CD
ModificationCount : 0
SamplingPercent : 100
LastUpdate : 6/13/2024 12:06:33 PM
Вы можете получить таблицу, используя $таблица | Таблица формата
Вот результат
Schema Table Statistics ModificationCount SamplingPercent LastUpdate
------ ----- ---------- ----------------- --------------- ----------
dbo MyTable_1 IX_MyTable_1_Field1 2 100 6/13/2024 1:39:04 PM
dbo MyTable_2 _WA_Sys_00000015_4B4D17CD 0 100 6/13/2024 12:06:33 PM
Для этого вы можете использовать SQL-XQuery. .nodes разделит XML на отдельные строки и .value вытащит одно значение.
WITH XMLNAMESPACES (
DEFAULT 'http://schemas.microsoft.com/sqlserver/2004/07/showplan'
)
SELECT
[Schema] = x1.statsinfo.value('@Schema', 'sysname'),
[Table] = x1.statsinfo.value('@Table', 'sysname'),
[Statistics] = x1.statsinfo.value('@Statistics', 'sysname'),
ModificationCount = x1.statsinfo.value('@ModificationCount', 'bigint'),
SamplingPercent = x1.statsinfo.value('@SamplingPercent', 'float'),
LastUpdate = x1.statsinfo.value('@LastUpdate', 'datetime2(7)')
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
CROSS APPLY qp.query_plan.nodes('//OptimizerStatsUsage/StatisticsInfo') x1(statsinfo)
WHERE qs.query_plan_hash = @QueryPlanHash;
Так в чем ваш вопрос? Вы сказали нам, чего хотите, но не сказали, о чем спрашиваете. Что мешает вам достичь своей цели?