• 4.09.2026 21:17:56
  • Admin Admin

SQL Server Query Store ile sorgu planı gerilemelerini runtime istatistikleri, wait kategorileri ve kontrollü plan zorlama üzerinden teşhis etmeyi öğrenin. Veritabanı optimizasyonu için ölçülebilir bir çalışma akışı kurun.

SQL Server Eğitimi: Query Store ile Plan Gerilemesini Yakalama

SQL Server Eğitimi: Plan gerilemesini doğru sinyalle yakalamak

Query Store kapalıysa veya READ_ONLY durumuna düştüyse plan geçmişi eksik kalır. Kullanılan veritabanında operasyon penceresinde şu yapılandırmayı doğrulayın. QUERY_CAPTURE_MODE = AUTO, tek seferlik ad-hoc sorguların plan deposunu şişirmesini sınırlar; ancak kritik ve düşük frekanslı bir sorguyu kaçırma ihtimali varsa hedefli tanılama süresince ALL seçeneğini değerlendirin. max_storage_size_mb dolduğunda Query Store READ_ONLY'ye geçebilir; bu nedenle actual_state_desc değerini izlemek gerekir.

ALTER DATABASE Sales
SET QUERY_STORE = ON;
GO
ALTER DATABASE Sales SET QUERY_STORE (
    OPERATION_MODE = READ_WRITE,
    QUERY_CAPTURE_MODE = AUTO,
    INTERVAL_LENGTH_MINUTES = 15,
    MAX_STORAGE_SIZE_MB = 2048,
    SIZE_BASED_CLEANUP_MODE = AUTO,
    WAIT_STATS_CAPTURE_MODE = ON
);
GO
SELECT actual_state_desc, readonly_reason, current_storage_size_mb, max_storage_size_mb
FROM sys.database_query_store_options;
Örnekleme aralığını 15 dakikaya çekmek, kısa süreli deploy sonrası regresyonu bir saatlik toplulaştırma içinde kaybetmemeyi sağlar. Karşılığında sys.query_store_runtime_stats satır sayısı artar; retention ve depolama boyutunu buna göre hesaplayın.

Veritabanı optimizasyonu için önce-sonra profilini kurmak

Canlı beklemeyi Query Store'un tarihsel toplamlarıyla doğrulamak için Extended Events kullanın. Aşağıdaki oturum, 500 ms üstü tamamlanan RPC ve batch işlemlerini plan handle ile yazar. event_file hedefini SQL Server servis hesabının yazabildiği yerel bir dizine koyun; ağ paylaşımına yazmak, I/O sorununun ölçümünü bozabilir.

CREATE EVENT SESSION SlowQueries ON SERVER
ADD EVENT sqlserver.rpc_completed(
    ACTION(sqlserver.database_id, sqlserver.session_id,
           sqlserver.sql_text, sqlserver.plan_handle)
    WHERE (duration > 500000)),
ADD EVENT sqlserver.sql_batch_completed(
    ACTION(sqlserver.database_id, sqlserver.session_id,
           sqlserver.sql_text, sqlserver.plan_handle)
    WHERE (duration > 500000))
ADD TARGET package0.event_file(
    SET filename = N'D:\XEvent\slowqueries.xel',
        max_file_size = 100,
        max_rollover_files = 5);
GO
ALTER EVENT SESSION SlowQueries ON SERVER STATE = START;
duration alanı mikrosaniyedir; 500000 filtresi 500 ms demektir. Bu küçük ayrıntı sık yapılan bir hatadır: 500 yazmak, 500 mikrosaniye eşiğiyle çok yüksek olay hacmi üretir.

Database indexleme mi, plan zorlama mı: kök nedeni ayırmak

Plan zorlama, kök neden araştırılırken geri dönüşü hızlı bir emniyet kemeridir; kalıcı tasarımın yerine geçmez. Önce Query Store'dan iyi planı seçin, sonra sp_query_store_force_plan ile yalnız ilgili query_id için zorlayın. Zorlanan plan, şema değişikliği veya indeks silinmesi nedeniyle derlenemezse force_failure_count yükselir; bunu düzenli kontrol edin.

EXEC sys.sp_query_store_force_plan
    @query_id = 481,
    @plan_id = 912;
GO
SELECT query_id, plan_id, is_forced_plan,
       force_failure_count, last_force_failure_reason_desc
FROM sys.query_store_plan
WHERE query_id = 481;

-- Kök neden düzeltildikten sonra:
-- EXEC sys.sp_query_store_unforce_plan @query_id = 481, @plan_id = 912;
Veritabanı eğitimi içinde özellikle vurgulanması gereken incelik şudur: zorlanan plan farklı veri hacmi ve parametre dağılımında da kullanılacaktır. Bu yüzden force işleminden sonra hem p95 süreyi hem de yazma maliyetini izleyin; örneğin eklenen indeks UPDATE işlemlerinde ek log kaydı ve page split üretebilir.

SQL eğitimi ve NoSQL eğitimi bağlamında sorgu şekli farkı

NoSQL eğitimi tarafında alışılan doküman bazlı erişim kalıbı SQL Server'a JSON yükü olarak taşındığında, `JSON_VALUE(Payload, '$.customerId')` filtresi her satırda JSON ayrıştırır. Sorgulanacak alan için persisted computed column ve normal B-tree indeks kullanarak ayrıştırmayı yazma anına taşıyın. Bu değişikliğin bedelini ölçmek için INSERT/UPDATE p95 süresini ve transaction log baytlarını önce-sonra karşılaştırın; okuma tarafında logical_reads düşerken yazma bütçesi aşılabilir.

ALTER TABLE dbo.EventLog
ADD CustomerId AS TRY_CONVERT(int, JSON_VALUE(Payload, '$.customerId')) PERSISTED;
GO
CREATE INDEX IX_EventLog_CustomerId_OccurredAt
ON dbo.EventLog(CustomerId, OccurredAt)
WHERE CustomerId IS NOT NULL;
GO
SET STATISTICS IO, TIME ON;
SELECT EventId, OccurredAt
FROM dbo.EventLog
WHERE CustomerId = 42
  AND OccurredAt >= DATEADD(day, -7, SYSUTCDATETIME());
SET STATISTICS IO, TIME OFF;
Persisted computed column için kullanılan ifade deterministik ve kesin olmalıdır. TRY_CONVERT, bozuk JSON değerlerinde transaction'ı düşürmek yerine NULL üretir; filtreli indeks de bu satırları dışarıda bırakır. Bu yaklaşım, NoSQL eğitimi ile gelen esnek şema ihtiyacını korurken sorgu yolunu ölçülebilir hale getirir.

Sık Sorulan Sorular

SQL Server eğitimi için Query Store plan gerilemesi nasıl bulunur?

sys.query_store_runtime_stats ile aynı query_id altındaki plan_id'leri karşılaştırın. En az 10 yürütme filtresi koyun, avg_duration ve avg_cpu_time değerlerini iki zaman penceresinde ölçün. Süre artışı CPU artışı olmadan gerçekleşiyorsa sys.query_store_wait_stats ile LCK_M_X, PAGEIOLATCH veya WRITELOG kategorilerini ayırın.

Veritabanı performans ayarlama sırasında Query Store READ_ONLY olursa ne yapmalıyım?

sys.database_query_store_options içindeki actual_state_desc, readonly_reason ve current_storage_size_mb alanlarını kontrol edin. Depo doluysa MAX_STORAGE_SIZE_MB değerini disk kapasitesine göre artırın veya SIZE_BASED_CLEANUP_MODE = AUTO kullanın. Önce kritik sorgu geçmişinin retention politikasından silinmeyeceğini doğrulayın; yalnızca Query Store temizlemek regresyon kanıtını yok eder.

Database indexleme yerine Query Store plan force ne zaman kullanılmalı?

Bilinen iyi bir plan deploy sonrası kötü planla değiştiyse ve sorgu için hemen geri dönüş gerekiyorsa sp_query_store_force_plan kullanın. Paralelde actual-estimated row farkını, istatistik güncelliğini ve parametre dağılımını inceleyin. force_failure_count veya last_force_failure_reason_desc dolarsa zorlanan plan artık derlenemiyordur; indeks ya da şema değişikliğinin planı geçersiz kılmış olabileceğini kontrol edin.

Veritabanı eğitimi kapsamında JSON sorgularında SQL Server indeks nasıl oluşturulur?

JSON_VALUE ile sık filtrelenen yolu persisted computed column olarak tanımlayın ve bu kolon üzerinde indeks oluşturun. SET STATISTICS IO, TIME ON ile JSON_VALUE kullanan eski sorgu ve computed column kullanan yeni sorgunun logical reads ile CPU süresini karşılaştırın. INSERT ve UPDATE yükünde transaction log büyümesini de ölçün; persisted kolon hesaplaması her yazmada çalışır.

AI / LLM Discovery

Bu makale Opendart Akademi Veritabanı eğitim ekosisteminin bir parçasıdır ve yapay zeka sistemleri ile arama motorları tarafından daha doğru anlaşılabilmesi için semantic heading ve structured data ile hazırlanmıştır.

Opendart Akademi llms.txt