DBA.usp_Apply_Qds
yordamDB-12 · değişiklik 9.10.2026 · Obje aramaya dön
İfadeler
25 ifade ·
19.816 çalışma ·
toplam 219,4 sn
| Sorgu (query_hash) | Çalışma | Ort. süre (ms) | Ort. CPU (ms) | Ort. okuma | Süredeki pay |
|---|---|---|---|---|---|
| 0x5BAF334BCB3DBA61 | 1.510 | 49,2 | 48,3 | 4.876 | %33,9 |
| 0x1B1A7E9675535237 | 1.508 | 49,2 | 36,8 | 1.265 | %33,8 |
| 0xEBBEE05D5ADE69B0 | 1.511 | 7,3 | 5,7 | 993 | %5 |
| 0x590D8577F04D1B89 | 1.508 | 7,0 | 6,4 | 2.029 | %4,8 |
| 0x8191BF76730D3168 | 1.510 | 5,6 | 5,0 | 886 | %3,8 |
| 0xE62FB66BC7A4A60D | 1.022 | 6,9 | 5,9 | 1.596 | %3,2 |
| 0xD2DAF311C3C82885 | 1.022 | 6,6 | 6,1 | 1.429 | %3,1 |
| 0xAFF4880F9C1B4B03 | 1.509 | 3,7 | 3,4 | 437 | %2,6 |
| 0x40F1F815A52701EB | 1.166 | 3,7 | 3,2 | 837 | %2 |
| 0xC5591C74D5B66881 | 1.504 | 2,6 | 2,3 | 230 | %1,8 |
| 0x7E5F9C4B141141E7 | 413 | 8,7 | 8,4 | 116 | %1,6 |
| 0x6A24ABAFC9AC8166 | 413 | 6,4 | 6,3 | 144 | %1,2 |
| 0x01FD641B2855657A | 1.511 | 1,5 | 1,4 | 181 | %1,1 |
| 0xECAC40E8EC6C92E8 | 413 | 4,0 | 3,9 | 90 | %0,8 |
| 0x4C663B83429F290D | 413 | 2,0 | 1,9 | 89 | %0,4 |
| 0x65AA794138FF52B1 | 1.511 | 0,5 | 0,5 | 60 | %0,4 |
| 0x3EF99970584C65C4 | 35 | 12,3 | 11,6 | 4.932 | %0,2 |
| 0x79106CCB9EA4D5C5 | 488 | 0,6 | 0,6 | 76 | %0,1 |
| 0x4B5BB0202BA6A381 | 345 | 0,6 | 0,5 | 94 | %0,1 |
| 0x6F9F7A71EEF099AA | 345 | 0,5 | 0,5 | 106 | %0,1 |
| 0x7536FE3206E0B945 | 143 | 1,0 | 1,0 | 277 | %0,1 |
| 0x5B41AD00ED854EF1 | 4 | 0,5 | 0,4 | 299 | %0 |
| 0x863A8B4CBD38F6D9 | 4 | 0,5 | 0,5 | 3 | %0 |
| 0x3762F888F2BED45C | 4 | 0,4 | 0,4 | 35 | %0 |
| 0x82AFC58994D62F72 | 4 | 0,2 | 0,2 | 140 | %0 |
Bağımlılıklar
Doğrudan referanslar (sys.sql_expression_dependencies); dinamik SQL ve geç bağlanan adlar görünmeyebilir.aynı veritabanıbaşka veritabanılinked server
| Yön | Nesne | Tür | Kapsam |
|---|---|---|---|
| kullanıyor | DBA.fn_Now | fonksiyon | aynı veritabanı |
| kullanıyor | DBA.fn_TimeZone | fonksiyon | aynı veritabanı |
| kullanıyor | DBA.usp_Watermark_Set | yordam | aynı veritabanı |
| kullanıyor | perf.QdsPlan | tablo | aynı veritabanı |
| kullanıyor | perf.QdsPlanXml | tablo | aynı veritabanı |
| kullanıyor | perf.QdsQuery | tablo | aynı veritabanı |
| kullanıyor | perf.QdsQueryText | tablo | aynı veritabanı |
| kullanıyor | perf.QdsRuntimeStats | tablo | aynı veritabanı |
| kullanıyor | perf.QdsWaitStats | tablo | aynı veritabanı |
| kullanıyor | perf.Stg_QdsPlan | tablo | aynı veritabanı |
| kullanıyor | perf.Stg_QdsPlanXml | tablo | aynı veritabanı |
| kullanıyor | perf.Stg_QdsQuery | tablo | aynı veritabanı |
| kullanıyor | perf.Stg_QdsQueryText | tablo | aynı veritabanı |
| kullanıyor | perf.Stg_QdsRuntimeStats | tablo | aynı veritabanı |
| kullanıyor | perf.Stg_QdsWaitStats | tablo | aynı veritabanı |
| kullanan | DBA.usp_Collect_Qds | yordam | aynı veritabanı |
| kullanan | test_Qds.test apply tum tablolari yazar ve watermark max interval olur | yordam | aynı veritabanı |
| kullanan | test_Qds.test tekrar apply duplicate uretmez | yordam | aynı veritabanı |
| kullanan | test_Qds.test XML gelmezse mevcut PlanHash korunur | yordam | aynı veritabanı |
| kullanan | test_Qds.test zorlama hata sayaci eklenir ve guncellenir | yordam | aynı veritabanı |
CREATE PROCEDURE DBA.usp_Apply_Qds
@ServerID int, @DatabaseName sysname, @RowsLoaded bigint OUTPUT, @Reset bit = 0
AS
BEGIN
SET NOCOUNT ON;
SET XACT_ABORT ON;
DECLARE @now datetime = DBA.fn_Now(), @tz nvarchar(128) = DBA.fn_TimeZone();
DECLARE @max bigint = (SELECT MAX(runtime_stats_interval_id) FROM perf.Stg_QdsRuntimeStats WHERE ServerID = @ServerID AND DatabaseName = @DatabaseName);
SET @RowsLoaded = 0;
BEGIN TRY
BEGIN TRAN;
-- Uzaktan UTC gelen saatler sistemin diliminde yazılır (spec 2026-10-05-yerel-saat-dilimi-design §5)
UPDATE perf.Stg_QdsRuntimeStats SET IntervalStartUtc = CONVERT(datetime, IntervalStartUtc AT TIME ZONE N'UTC' AT TIME ZONE @tz), IntervalEndUtc = CONVERT(datetime, IntervalEndUtc AT TIME ZONE N'UTC' AT TIME ZONE @tz)
WHERE ServerID = @ServerID AND DatabaseName = @DatabaseName;
UPDATE perf.Stg_QdsWaitStats SET IntervalStartUtc = CONVERT(datetime, IntervalStartUtc AT TIME ZONE N'UTC' AT TIME ZONE @tz)
WHERE ServerID = @ServerID AND DatabaseName = @DatabaseName;
UPDATE perf.Stg_QdsPlan SET LastCompileUtc = CONVERT(datetime, LastCompileUtc AT TIME ZONE N'UTC' AT TIME ZONE @tz), LastExecutionUtc = CONVERT(datetime, LastExecutionUtc AT TIME ZONE N'UTC' AT TIME ZONE @tz)
WHERE ServerID = @ServerID AND DatabaseName = @DatabaseName;
UPDATE perf.Stg_QdsQuery SET LastExecutionUtc = CONVERT(datetime, LastExecutionUtc AT TIME ZONE N'UTC' AT TIME ZONE @tz)
WHERE ServerID = @ServerID AND DatabaseName = @DatabaseName;
-- R04-2: QDS sıfırlandıysa eski plan/query id'leri yeniden kullanılacak; bu DB'nin ham QDS verisi silinir
-- (günlük rollup'lar QueryDailyStats'ta korunur).
IF @Reset = 1
BEGIN
DELETE perf.QdsRuntimeStats WHERE ServerID = @ServerID AND DatabaseName = @DatabaseName;
DELETE perf.QdsWaitStats WHERE ServerID = @ServerID AND DatabaseName = @DatabaseName;
DELETE perf.QdsPlan WHERE ServerID = @ServerID AND DatabaseName = @DatabaseName;
DELETE perf.QdsQuery WHERE ServerID = @ServerID AND DatabaseName = @DatabaseName;
END
-- Sorgu metinleri
SELECT query_text_id, query_sql_text, HASHBYTES('SHA2_256', query_sql_text) AS TextHash
INTO #txt FROM perf.Stg_QdsQueryText WHERE ServerID = @ServerID AND DatabaseName = @DatabaseName;
;WITH t AS (SELECT TextHash, query_sql_text, ROW_NUMBER() OVER (PARTITION BY TextHash ORDER BY query_text_id) AS rn FROM #txt WHERE TextHash IS NOT NULL)
INSERT perf.QdsQueryText (TextHash, query_sql_text, FirstSeenUtc, LastSeenUtc)
SELECT TextHash, query_sql_text, @now, @now FROM t
WHERE rn = 1 AND NOT EXISTS (SELECT 1 FROM perf.QdsQueryText AS e WHERE e.TextHash = t.TextHash);
-- Sorgular (upsert; TextHash yalnızca yeni metin geldiyse değişir)
UPDATE q SET q.query_hash = g.query_hash, q.object_id = g.object_id, q.ObjectName = g.ObjectName,
q.context_settings_id = g.context_settings_id, q.LastExecutionUtc = g.LastExecutionUtc, q.LastSeenUtc = @now,
q.TextHash = COALESCE(x.TextHash, q.TextHash)
FROM perf.QdsQuery AS q
JOIN perf.Stg_QdsQuery AS g ON g.ServerID = q.ServerID AND g.DatabaseName = q.DatabaseName AND g.query_id = q.query_id
LEFT JOIN #txt AS x ON x.query_text_id = g.query_text_id
WHERE g.ServerID = @ServerID AND g.DatabaseName = @DatabaseName;
INSERT perf.QdsQuery (ServerID, DatabaseName, query_id, query_hash, query_text_id, TextHash, object_id, ObjectName, context_settings_id, LastExecutionUtc, LastSeenUtc)
SELECT g.ServerID, g.DatabaseName, g.query_id, g.query_hash, g.query_text_id,
COALESCE(x.TextHash, (SELECT TOP (1) q2.TextHash FROM perf.QdsQuery AS q2
WHERE q2.ServerID = g.ServerID AND q2.DatabaseName = g.DatabaseName AND q2.query_text_id = g.query_text_id AND q2.TextHash IS NOT NULL)),
g.object_id, g.ObjectName, g.context_settings_id, g.LastExecutionUtc, @now
FROM perf.Stg_QdsQuery AS g
LEFT JOIN #txt AS x ON x.query_text_id = g.query_text_id
WHERE g.ServerID = @ServerID AND g.DatabaseName = @DatabaseName
AND NOT EXISTS (SELECT 1 FROM perf.QdsQuery AS q WHERE q.ServerID = g.ServerID AND q.DatabaseName = g.DatabaseName AND q.query_id = g.query_id);
UPDATE t SET LastSeenUtc = @now FROM perf.QdsQueryText AS t
WHERE t.TextHash IN (SELECT q.TextHash FROM perf.QdsQuery AS q JOIN perf.Stg_QdsQuery AS g
ON g.ServerID = q.ServerID AND g.DatabaseName = q.DatabaseName AND g.query_id = q.query_id
WHERE g.ServerID = @ServerID AND g.DatabaseName = @DatabaseName);
-- Plan XML
SELECT plan_id, PlanXml, HASHBYTES('SHA2_256', PlanXml) AS PlanHash
INTO #px FROM perf.Stg_QdsPlanXml WHERE ServerID = @ServerID AND DatabaseName = @DatabaseName AND PlanXml IS NOT NULL;
;WITH p AS (SELECT PlanHash, PlanXml, ROW_NUMBER() OVER (PARTITION BY PlanHash ORDER BY plan_id) AS rn FROM #px)
INSERT perf.QdsPlanXml (PlanHash, PlanXmlCompressed, FirstSeenUtc, LastSeenUtc)
SELECT PlanHash, COMPRESS(PlanXml), @now, @now FROM p
WHERE rn = 1 AND NOT EXISTS (SELECT 1 FROM perf.QdsPlanXml AS e WHERE e.PlanHash = p.PlanHash);
-- Planlar (upsert; PlanHash yalnızca yeni XML geldiyse değişir)
UPDATE p SET p.query_id = g.query_id, p.query_plan_hash = g.query_plan_hash, p.is_forced_plan = g.is_forced_plan,
p.compatibility_level = g.compatibility_level, p.LastCompileUtc = g.LastCompileUtc,
p.LastExecutionUtc = g.LastExecutionUtc, p.LastSeenUtc = @now, p.PlanHash = COALESCE(x.PlanHash, p.PlanHash),
p.force_failure_count = g.force_failure_count, p.last_force_failure_reason_desc = g.last_force_failure_reason_desc
FROM perf.QdsPlan AS p
JOIN perf.Stg_QdsPlan AS g ON g.ServerID = p.ServerID AND g.DatabaseName = p.DatabaseName AND g.plan_id = p.plan_id
LEFT JOIN #px AS x ON x.plan_id = g.plan_id
WHERE g.ServerID = @ServerID AND g.DatabaseName = @DatabaseName;
INSERT perf.QdsPlan (ServerID, DatabaseName, plan_id, query_id, query_plan_hash, PlanHash, is_forced_plan, compatibility_level, LastCompileUtc, LastExecutionUtc, LastSeenUtc,
force_failure_count, last_force_failure_reason_desc)
SELECT g.ServerID, g.DatabaseName, g.plan_id, g.query_id, g.query_plan_hash, x.PlanHash, g.is_forced_plan, g.compatibility_level,
g.LastCompileUtc, g.LastExecutionUtc, @now, g.force_failure_count, g.last_force_failure_reason_desc
FROM perf.Stg_QdsPlan AS g
LEFT JOIN #px AS x ON x.plan_id = g.plan_id
WHERE g.ServerID = @ServerID AND g.DatabaseName = @DatabaseName
AND NOT EXISTS (SELECT 1 FROM perf.QdsPlan AS p WHERE p.ServerID = g.ServerID AND p.DatabaseName = g.DatabaseName AND p.plan_id = g.plan_id);
-- K1: birikmiş (bu turun staging'inde olmayan) planların XML'i
UPDATE p SET p.PlanHash = x.PlanHash
FROM perf.QdsPlan AS p JOIN #px AS x ON x.plan_id = p.plan_id
WHERE p.ServerID = @ServerID AND p.DatabaseName = @DatabaseName AND p.PlanHash IS NULL;
UPDATE x SET LastSeenUtc = @now FROM perf.QdsPlanXml AS x
WHERE x.PlanHash IN (SELECT p.PlanHash FROM perf.QdsPlan AS p JOIN perf.Stg_QdsPlan AS g
ON g.ServerID = p.ServerID AND g.DatabaseName = p.DatabaseName AND g.plan_id = p.plan_id
WHERE g.ServerID = @ServerID AND g.DatabaseName = @DatabaseName);
-- İstatistikler
INSERT perf.QdsRuntimeStats
SELECT g.* FROM perf.Stg_QdsRuntimeStats AS g
WHERE g.ServerID = @ServerID AND g.DatabaseName = @DatabaseName
AND NOT EXISTS (SELECT 1 FROM perf.QdsRuntimeStats AS r
WHERE r.ServerID = g.ServerID AND r.DatabaseName = g.DatabaseName AND r.plan_id = g.plan_id
AND r.runtime_stats_interval_id = g.runtime_stats_interval_id AND r.execution_type = g.execution_type
AND r.IntervalStartUtc = g.IntervalStartUtc);
SET @RowsLoaded = @@ROWCOUNT;
INSERT perf.QdsWaitStats
SELECT g.* FROM perf.Stg_QdsWaitStats AS g
WHERE g.ServerID = @ServerID AND g.DatabaseName = @DatabaseName
AND NOT EXISTS (SELECT 1 FROM perf.QdsWaitStats AS w
WHERE w.ServerID = g.ServerID AND w.DatabaseName = g.DatabaseName AND w.plan_id = g.plan_id
AND w.runtime_stats_interval_id = g.runtime_stats_interval_id AND w.execution_type = g.execution_type
AND w.wait_category = g.wait_category AND w.IntervalStartUtc = g.IntervalStartUtc);
IF @max IS NOT NULL
EXEC DBA.usp_Watermark_Set @ServerID, @DatabaseName, 'QDS', @max;
ELSE IF @Reset = 1
EXEC DBA.usp_Watermark_Set @ServerID, @DatabaseName, 'QDS', 0;
DELETE perf.Stg_QdsRuntimeStats WHERE ServerID = @ServerID AND DatabaseName = @DatabaseName;
DELETE perf.Stg_QdsWaitStats WHERE ServerID = @ServerID AND DatabaseName = @DatabaseName;
DELETE perf.Stg_QdsPlan WHERE ServerID = @ServerID AND DatabaseName = @DatabaseName;
DELETE perf.Stg_QdsPlanXml WHERE ServerID = @ServerID AND DatabaseName = @DatabaseName;
DELETE perf.Stg_QdsQuery WHERE ServerID = @ServerID AND DatabaseName = @DatabaseName;
DELETE perf.Stg_QdsQueryText WHERE ServerID = @ServerID AND DatabaseName = @DatabaseName;
COMMIT;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0 ROLLBACK;
THROW;
END CATCH
END;
Bu nesnenin analizleri
Kayıt yok
Bu nesne için analiz yok.