USE replTransVas;
SET NOCOUNT ON;
DECLARE @ObjectId int = OBJECT_ID(N'dbo.sb_answer');
IF @ObjectId IS NULL
BEGIN
RAISERROR(N'Таблица dbo.sb_answer не найдена в replTransVas.', 16, 1);
RETURN;
END;
-- 1. Индексы и их столбцы.
SELECT
i.name AS indexName,
i.type_desc,
i.is_unique,
i.is_primary_key,
i.is_disabled,
i.has_filter,
i.filter_definition,
ic.key_ordinal,
ic.is_included_column,
c.name AS columnName
FROM sys.indexes AS i
LEFT JOIN sys.index_columns AS ic
ON ic.object_id = i.object_id
AND ic.index_id = i.index_id
LEFT JOIN sys.columns AS c
ON c.object_id = ic.object_id
AND c.column_id = ic.column_id
WHERE i.object_id = @ObjectId
ORDER BY i.index_id, ic.is_included_column, ic.key_ordinal,
ic.index_column_id;
-- 2. Размер таблицы — без полного COUNT(*).
SELECT
SUM(row_count) AS approximateRows,
CAST(SUM(reserved_page_count) * 8.0 / 1024
AS decimal(18,2)) AS baseTableReservedMB
FROM sys.dm_db_partition_stats
WHERE object_id = @ObjectId
AND index_id IN (0, 1);
-- 3. Триггеры: могут добавлять работу к каждому UPDATE.
SELECT
tr.name AS triggerName,
tr.is_disabled,
tr.is_not_for_replication,
OBJECT_DEFINITION(tr.object_id) AS triggerDefinition
FROM sys.triggers AS tr
WHERE tr.parent_id = @ObjectId;
-- 4. Когда обновлялась статистика.
SELECT
s.name AS statisticsName,
s.auto_created,
s.user_created,
p.last_updated,
p.rows,
p.rows_sampled,
p.modification_counter
FROM sys.stats AS s
OUTER APPLY sys.dm_db_stats_properties(
s.object_id, s.stats_id
) AS p
WHERE s.object_id = @ObjectId
ORDER BY s.stats_id;
-- 5. План процедуры репликации из кеша.
SELECT
ps.last_execution_time,
ps.execution_count,
CAST(
ps.total_worker_time / 1000.0
/ NULLIF(ps.execution_count, 0)
AS decimal(18,2)
) AS averageCpuMs,
CAST(
ps.total_elapsed_time / 1000.0
/ NULLIF(ps.execution_count, 0)
AS decimal(18,2)
) AS averageElapsedMs,
ps.total_logical_reads
/ NULLIF(ps.execution_count, 0) AS averageLogicalReads,
qp.query_plan
FROM sys.dm_exec_procedure_stats AS ps
OUTER APPLY sys.dm_exec_query_plan(ps.plan_handle) AS qp
WHERE ps.database_id = DB_ID()
AND ps.object_id = OBJECT_ID(N'dbo.sp_MSupd_dbosb_answer');
-- 6. Текущая очередь задач на процессоры.
SELECT
scheduler_id,
current_tasks_count,
runnable_tasks_count,
current_workers_count,
active_workers_count,
work_queue_count
FROM sys.dm_os_schedulers
WHERE status = N'VISIBLE ONLINE'
ORDER BY scheduler_id;