İÇİNDEKİLER
- •Bir değişikliği canlıya almadan önce etkisini ölçmek mi istiyorsunuz?
- •SQLsimTools Nedir?
- •Hangi Soruya Hangi Araç?
- •İlk Çalıştırma: Bağlantı Testi ve Eşzamanlı Yük
- •Önce ve Sonra: Ölçülmüş Bir Örnek
- •JSON Dosyasıyla Karma İş Yükü
- •Gerçek İş Yükünü Yakalayıp Yeniden Oynatmak
- •ostress’ten Geçiş
- •Çalıştırmadan Önce Dikkat Edilmesi Gerekenler
- •Aryasoft Yük Testini Nasıl Kullanıyor?
- •Değişikliğin etkisini kullanıcılarınızdan önce ölçün
SQL Server’da yapılan değişikliklerin çoğu canlıya çok az kanıtla çıkar. Yeni indeks execution plan’de doğru görünür, compatibility level değişikliği birkaç kısa testten geçer, yeni sunucunun çekirdek sayısı eskisinden fazladır. Ardından ilk yoğun pazartesi gelir, eşzamanlı kullanıcı sayısı artar ve değişiklik, sakin bir test sisteminde kimsenin görmediği şekilde davranır.
Bunun çözümü daha fazla temkin değil, ölçümdür: Aynı iş yükünü değişiklikten önce ve sonra, gerçekçi bir eşzamanlılıkla çalıştırmak ve sonuçları karşılaştırmak. SQLsimTools tam olarak bu iş için geliştirilmiş, ücretsiz ve yeni bir araç seti. Bu yazıyı hazırlamadan önce aracı kendi SQL Server 2025 test ortamımızda denedik. Aşağıda aracın ne yaptığını, çalıştırdığımız komutları, ölçtüğümüz sonuçları ve bir replay sonucuna güvenmeden önce bilmeniz gereken sınırları bulacaksınız.
Bir değişikliği canlıya almadan önce etkisini ölçmek mi istiyorsunuz?
Aryasoft, upgrade, taşıma ve performans projelerinde iş yükünü test ortamında ölçer, önce/sonra karşılaştırmasıyla karar verir.
SQLsimTools Nedir?
SQLsimTools; tekrarlanabilir bir SQL iş yükü oluşturmak, bu iş yükünü kontrollü bir eşzamanlılıkla çalıştırmak, ölçmek ve çalıştırmaları birbiriyle karşılaştırmak için geliştirilmiş açık kaynak bir araç setidir. 1.0.0 sürümü 14 Ekim 2026’da MIT lisansıyla yayınlandı. SQL Server 2019, 2022 ve 2025’i, Azure SQL Database’i, Azure SQL Managed Instance’ı ve Microsoft Fabric’teki SQL database’i destekler. Projenin resmî sayfası microsoft.github.io/sqlsimtools adresinde; kaynak kod, dokümantasyon ve sürümler ise GitHub üzerinde yayınlanıyor.
Not
SQLsimTools, Microsoft’un GitHub organizasyonunda yayınlanıyor; ancak proje kendisini resmî bir Microsoft ürünü olarak tanımlamıyor ve Microsoft’un ticari desteği kapsamında değil. Destek, dokümantasyon ile GitHub Issues ve Discussions üzerinden veriliyor. Araç henüz Public Preview aşamasında olduğu için onu canlı ortam araçlarınızın bir parçası olarak değil, bir test aracı olarak konumlandırmanızı öneririz.
Araç seti dört farklı çalışma şekli sunuyor:
| Bileşen | Nedir? | Ne zaman kullanılır? |
|---|---|---|
| sqlsim | ODBC Driver 18 üzerine kurulu, C++ ile yazılmış komut satırı aracı | Betikler, otomasyon, CI hatları, en düşük istemci yükü, Extended Events replay |
| sqlpysim | mssql-python sürücüsünü kullanan Python komut satırı aracı |
Python tabanlı otomasyon; sqlsim ile arasında dokümante edilmiş uyumluluk farkları var |
| sqlsim Studio | Yerel olarak çalışan tarayıcı uygulaması (Windows x64) | Görsel yapılandırma, canlı izleme ve çalıştırmaların yan yana karşılaştırılması |
| Workload Builder | GitHub Copilot ve diğer yapay zekâ kodlama ajanları için hazır beceriler | Düz bir cümleyle tarif edilen test senaryosunun tasarlanması |
sqlsim ve sqlpysim, Windows x64/ARM64 ile Ubuntu 24.04/26.04 x64 üzerinde çalışıyor. Studio şu an yalnızca Windows x64 için Public Preview aşamasında. Araçlar hiçbir telemetri göndermiyor; kurulan tek ağ bağlantısı, sizin belirttiğiniz SQL hedefine yapılıyor.
Hangi Soruya Hangi Araç?
SQLsimTools, DBA’lerin zaten kullandığı araçların yerini almıyor. Her araç farklı bir soruya cevap veriyor; bunları birbirine karıştırmak yanlış sonuçlara götürür:
| Soru | Araç | Neyi ölçer? |
|---|---|---|
| Bu depolama SQL Server iş yükünü taşıyabilir mi? | DiskSpd | SQL Server’dan bağımsız olarak depolama katmanında IOPS, throughput ve gecikme |
| SQL Server’a benzer I/O desenlerinde disk yolu güvenilir mi? | SQLIOSim | Disk alt sistemindeki bütünlük ve kararlılık sorunlarını ortaya çıkarmak için SQL Server I/O’sunun simülasyonu |
| Platform, standart bir benchmark’ta nasıl bir sonuç veriyor? | HammerDB | TPC’den türetilmiş OLTP (TPROC-C) ve analitik (TPROC-H) iş yükleri |
| Tek bir sorgu çok sayıda thread altında nasıl davranıyor? | SqlQueryStress | Tek bir sorgu ya da prosedürün çok sayıda thread, tekrar ve parametre değeriyle çalıştırılması |
| Kendi sorgu karışımımız bir değişiklikten önce ve sonra nasıl davranıyor? | SQLsimTools | Kendi betiklerinizden ya da yakalanmış bir izden üretilen eşzamanlı karma iş yükü; sorgu bazında CPU, okuma ve süre |
Sahadaki çalışmalarımızda ilk iki araç, beklenenden çok daha fazla işe yarıyor. Bugün canlı SQL Server’ların büyük bölümü paylaşımlı sanallaştırma ve depolama altyapıları üzerinde çalışıyor. DMV’ler ve wait istatistikleri bir performans sorununu I/O’ya kadar daralttığında, bir sonraki adım sorunun gerçekten diskten kaynaklandığını kanıtlamaktır. Üreticiye çağrı açarken ya da sanallaştırma ekibine giderken DiskSpd’den alınmış IOPS, gecikme ve kuyruk derinliği değerleriyle gitmek, çözüm sürecini belirgin şekilde hızlandırıyor. Aynı testleri, yeni bir ortamı canlıya almadan önce de çalıştırıyoruz; böylece depolamanın canlı ortam olmaya uygun olup olmadığını en baştan teyit ediyoruz.
SQLsimTools ise bir üst katmanda çalışıyor. Platformun sağlıklı olduğu bilindikten sonra, bir değişiklik için asıl önemli olan soruyu cevaplıyor: Bu iş yükü hızlanıyor mu, yavaşlıyor mu?
İlk Çalıştırma: Bağlantı Testi ve Eşzamanlı Yük
Paketi projenin GitHub sürüm sayfasından indirin ve ZIP dosyasının engelini kaldırın. Dosyalar kod imzası taşımadığı için Windows bir SmartScreen uyarısı gösterebilir. sqlsim, Microsoft ODBC Driver 18 for SQL Server’a ihtiyaç duyar. İşe bir bağlantı testiyle başlayın:
.\x64\sqlsim.exe -S localhost -d master -E -Q "SELECT @@VERSION"
Ardından bir betiği eşzamanlı olarak çalıştırın. -n thread sayısını, -r her thread’in tekrar sayısını belirler. -q sonuç kümelerini ekrana basmaz, -querystats ise sorgu bazında sunucu istatistiklerini toplar:
.\x64\sqlsim.exe -S sql01 -d SalesDB -E -i customer-orders.sql -n 8 -r 50 -q -querystats -json -o before.json
SQL login kullanıyorsanız şifreyi -P - ile standart girişten verin; böylece şifre işlem listesinde görünmez. Bunun yerine -c ile tam bir ODBC bağlantı dizesi verirseniz, sqlsim bu dizeyi olduğu gibi kullanır. Bizim testimizde bu durumda uygulama adı sqlsim yerine SQL Workload Simulator oldu. Bu ayrıntı, yazının ilerleyen bölümündeki replay filtresi için önemli; bu yolu seçerseniz bağlantı dizesine APP=sqlsim ekleyin.
Önce ve Sonra: Ölçülmüş Bir Örnek
Çıktının gerçek bir değişiklikte nasıl göründüğünü görmek için SQL Server 2025 test ortamımızda geçici bir veritabanı oluşturduk. İçinde bir milyon satırlık bir dbo.Orders tablosu ve uygulamalarda sık görülen türden bir sorgu vardı:
-- customer-orders.sql: uygulamanın en sık çalıştırdığı sorgu
DECLARE @CustomerID int = ABS(CHECKSUM(NEWID())) % 20000 + 1;
SELECT COUNT(*) AS OrderCount, SUM(Amount) AS TotalAmount, MAX(OrderDate) AS LastOrder
FROM dbo.Orders
WHERE CustomerID = @CustomerID;
Sabit bir tekrar sayısı yerine süre tabanlı bir iş yükü dosyası kullandık; böylece iki çalıştırma da birebir aynı süreyi aldı: 8 thread, 60 saniye. Testi çalıştırdık, ardından kapsayıcı bir indeks ekleyip aynı dosyayı tekrar çalıştırdık:
{
"duration_seconds": 60,
"workloads": [ { "file": "customer-orders.sql", "threads": 8 } ]
}
.\x64\sqlsim.exe -S sql01 -d SalesDB -E -workload dur60.json -q -querystats -json -o before.json -stream-json > before.ndjson
CREATE INDEX IX_Orders_CustomerID
ON dbo.Orders (CustomerID)
INCLUDE (Amount, OrderDate);
| Metrik | İndeks yok | Kapsayıcı indeks |
|---|---|---|
| 60 saniyede tamamlanan sorgu | 3.171 | 7.462 |
| Kararlı durumdaki verim | ~53 sorgu/sn | ~127 sorgu/sn |
| İstemcinin ölçtüğü sorgu başına süre | 152 ms | 64 ms |
| Sorgu başına sunucu CPU süresi | 76,1 ms | 0,26 ms |
| Sorgu başına logical read | 4.098 | 3,2 |
| Çalıştırma boyunca toplam sunucu CPU’su | 241,4 sn | 1,95 sn |
| Hata | 0 | 0 |
-stream-json parametresi her saniye bir ilerleme kaydı yazar. Ardışık kayıtlar arasındaki farkı çizdiğinizde her çalıştırmanın verim eğrisini elde edersiniz:
Saniye başına tamamlanan sorgu, 8 thread, 60 saniye
Bu rakamlardan üç ders çıkıyor. Birincisi, logical read ve CPU sütunları değişikliğin SQL Server’ın içinde ne yaptığını gösteriyor ve buradaki iyileşme bin kattan fazla. İkincisi, istemcinin ölçtüğü süre yalnızca 152 ms’den 64 ms’ye indi, çünkü bu süre iş istasyonumuzla test sunucusu arasındaki ağ gidiş-dönüşünü de içeriyor. Kullanıcı istemci tarafındaki süreyi hisseder, sunucu ise kendi tarafındaki maliyeti öder; bu yüzden iyi bir karşılaştırma her ikisini de raporlar. Test sırasında wait istatistiklerini okurken de aynı ayrım geçerli: Bir sorgu sunucuda hızlı olup kullanıcı için yine de yavaş olabilir.
Üçüncüsü, turuncu çizginin şekline bakın. Çizgi saniyede yaklaşık 127 sorguda neredeyse düz ilerliyor ve bu tavan SQL Server’a ait değil. 8 thread ve gidiş-dönüş başına yaklaşık 64 ms ile istemci saniyede en fazla 125 civarında sorgu gönderebilir (8 ÷ 0,064 sn). İndeks eklendikten sonra darboğaz sunucudan ağa taşındı. Sunucunun gerçek sınırını görmek için thread sayısını artırmanız ya da yük üreticisini sunucuya daha yakın bir yerde çalıştırmanız gerekir. Tek bir ortalama değer bunu gizlerdi; sabit süreli bir test ve saniyelik bir eğri ise ilk bakışta gösteriyor.
JSON Dosyasıyla Karma İş Yükü
Gerçek sistemler hiçbir zaman tek bir sorgu çalıştırmaz. -workload parametresi, her biri kendi thread, tekrar ya da süre ve bekleme (think time) ayarına sahip birden fazla grubu tanımlayan bir JSON dosyası alır. Aşağıdaki örnek; OLTP sorgularını, daha ağır bir raporlama grubunu ve bir izleme sorgusunu aynı anda çalıştırıyor:
{
"workloads": [
{ "file": "sql\\oltp-lookups.sql", "threads": 4, "iterations": 100 },
{ "file": "sql\\monthly-report.sql", "threads": 2, "iterations": 10 },
{ "queries": [ "SELECT COUNT(*) FROM sys.dm_exec_sessions WHERE is_user_process = 1" ],
"threads": 1, "iterations": 50 }
]
}
.\x64\sqlsim.exe -S sql01 -d SalesDB -E -workload mixed.json -q -json -o mixed-before.json
Araçla birlikte gelen örnek iş yükü, test ortamımızda AdventureWorksLT üzerinde 7 thread ile 3.020 batch’i 54 saniyede ve hatasız tamamladı. Grupları bu şekilde bir arada çalıştırmak, tek sorguluk bir testin asla göstermeyeceği blokaj ve kaynak çekişmesini ortaya çıkarır.
Gerçek İş Yükünü Yakalayıp Yeniden Oynatmak
Kendi yazdığınız betikler yalnızca aklınıza gelen sorguları içerir. Replay bu açığı kapatır: Gerçek trafiği Extended Events ile yakalar, dönüştürür ve başka bir sunucuda ya da farklı bir yapılandırmada yeniden çalıştırırsınız. Akış dört adımdan oluşuyor:
- Yakalama.
sql_batch_completed,rpc_completed,loginvelogoutevent’lerini,session_idvedatabase_nameaction’larıyla birlikte bir event dosyasına yazan bir oturum oluşturun. Proje, bunun için hazır başlatma ve durdurma betikleri sunuyor. - Dönüştürme.
replay\convert-xel.ps1,.xeldosyasınısys.fn_xe_file_target_read_file()ile okur ve bir replay XML dosyası üretir. - Yeniden oynatma.
-replay fast, yakalanan her oturum için ayrı bir bağlantı açar ve o oturumun event’lerini yakalandıkları sırayla, mümkün olan en yüksek hızda çalıştırır.-replay stressise tüm event’leri tek bir sıraya dizer ve-nthread üzerinde-rkez çalıştırır. - Karşılaştırma.
-querystats -jsonile alınan çıktı, her sorgu için hem yakalanan orijinal metrikleri hem de replay ölçümlerini içerir.
.\replay\convert-xel.ps1 -XelFile "D:\xe\capture*.xel" -OutputFile trace.xml -ServerName sql01
.\x64\sqlsim.exe -S sql02 -d SalesDB -E -replay fast -replayfile trace.xml -querystats -json -o replay-sql02.json -q
Test ortamında 6 oturumdan 50 batch yakaladık. İzi bir kez indeks yerindeyken, bir kez de indeksi kaldırdıktan sonra yeniden oynattık. İzdeki ikinci sorgu indeksi kullanmayan bir rapor olduğu için kontrol görevi görüyor:
| İzdeki sorgu | İndeksli replay | İndekssiz replay |
|---|---|---|
| Müşteri sipariş özeti (40 çalıştırma) | 3,1 read, 2 ms CPU, 82 ms | 4.098 read, 72 ms CPU, 186 ms |
| Kapalı sipariş raporu (10 çalıştırma) | 4.152 read, 120 ms CPU | 4.152 read, 126 ms CPU |
50 event’in tamamı iki çalıştırmada da hatasız tamamlandı. Kontrol sorgusu yerinde sayarken müşteri sorgusu belirgin şekilde geriledi. Bir geçiş öncesinde görmek istediğiniz sinyal tam olarak budur: Yeni sunucuda unutulmuş bir indeks, compatibility level değişikliğinden sonra değişen bir plan ya da bir parameter sniffing sorunu, “yeni sunucu daha yavaş gibi” belirsizliği yerine sorgu bazında ölçülmüş bir fark olarak karşınıza çıkar.
Uyarı
Replay, uygulamayı değil ifadeleri yeniden üretir. Projenin kendi dokümantasyonuna göre replay; transaction sınırlarını, bekleme sürelerini, bağlantı durumunu ve oturum düzeyindeki SET seçeneklerini geri getirmiyor. INSERT BULK event’leri, veri izde bulunmadığı için hata veriyor. Bir replay dosyası da en fazla 100 MiB ve 100.000 event içerebiliyor. Yazma işlemi içeren bir iz yeniden oynatıldığında veriyi değiştirir; bu yüzden replay’i yalnızca restore edilmiş bir kopyaya karşı çalıştırın ve stress modunun sonuçlarını birebir bir tekrar olarak değil, dönüştürülmüş bir yük olarak değerlendirin.
Yeni bir sunucuya taşıma yaparken ya da upgrade rehberimizi izleyerek SQL Server 2025’e geçerken, mesai saatlerinden yakalanmış bir örneği eski ve yeni ortamda yeniden oynatmak, gerilemeleri kullanıcılardan önce bulmanın en ucuz yollarından biridir.
ostress’ten Geçiş
SQLsimTools, RML Utilities’in uzun yıllardır kullanılan yük testi aracı ostress’in halefi olarak konumlanıyor. Projenin kendi karşılaştırmasına göre temel farklar şöyle:
| Alan | sqlsim | ostress |
|---|---|---|
| Sürücü | ODBC Driver 18 | SQL Server Native Client (desteği sonlandırıldı) |
| Kimlik doğrulama | Windows, SQL, Microsoft Entra (etkileşimli, MSI, token) | Windows ve SQL |
| Şifreleme | TDS 8.0 strict, mandatory ya da optional | TDS 7.x |
| Availability group | Read-only intent (-R), multi-subnet failover (-M) |
Desteklenmiyor |
| Çıktı | Zaman damgalı metin ve JSON | Metin, isteğe bağlı XML |
| Replay | Extended Events izi | RML replay dosyaları |
Parametrelerin çoğu aynı kalıyor (-S -d -E -U -P -i -n -r -q -v -l -t), ancak bazılarının anlamı değişti. -p, sqlsim’de prepared statement’ları açarken ostress’te paket boyutunu belirliyor. -M, sqlsim’de multi-subnet failover, ostress’te ise en yüksek thread sayısı anlamına geliyor. İlk hatada durma seçeneği de -b yerine -stoponerror oldu. Bu nedenle mevcut ostress betiklerinizi yalnızca çalıştırılabilir dosyanın adını değiştirerek taşımak yerine satır satır gözden geçirmenizi öneririz.
Çalıştırmadan Önce Dikkat Edilmesi Gerekenler
- Sahibinin onayı olmadan asla canlı ortama yöneltmeyin. Araç, verdiğiniz SQL’i istediğiniz eşzamanlılıkla çalıştırır. Küçük başlayın; thread ve tekrar sayısını kademeli olarak artırın.
- Sertifika doğrulamasını açın. sqlsim,
sqlcmd(Go) gibi, siz istemedikçe sunucu sertifikasını doğrulamaz. Azure SQL’e ve makinenizin dışına çıkan her bağlantıya-N mya da-N sekleyin. - Gizli bilgileri komut satırında bırakmayın. Şifre ve token’ları
-P -ya da-T -ile standart girişten verin. - Kaydedilen yapılandırmaları koruyun. Studio gizli bilgileri saklamaz, ancak kaydedilen dosyalarda sorgu metinleri ve sunucu adları düz metin olarak yer alır.
- Önce platformu düzeltin. DiskSpd testinden zaten geçemeyen bir depolama üzerinde yapılan yük testi, yalnızca depolamayı ölçer. Disk katmanını önce disk depolama best practice’leri yazımızdaki önerilerle kontrol edin.
Aryasoft Yük Testini Nasıl Kullanıyor?
Yük testi, upgrade, taşıma ve performans çalışmalarındaki riski azaltma yöntemimizin bir parçası. Depolama katmanında DiskSpd ve SQLIOSim ile yeni bir ortamın canlı yükü taşıyıp taşıyamayacağını doğruluyoruz. Bir sorun I/O’ya kadar indirildiğinde de sanallaştırma ve depolama ekiplerine somut IOPS, gecikme ve kuyruk değerleriyle gidiyoruz. Platform karşılaştırmalarında HammerDB’yi, tek bir sorunlu sorgu için SqlQueryStress’i kullanıyoruz. SQLsimTools ise bu araçların arasındaki eksik parçayı tamamlıyor: Müşterinin kendi iş yükünün, betiklerden ya da yakalanmış bir izden, tekrarlanabilir ve ölçülebilir bir önce/sonra karşılaştırması.
Amacımız her zaman aynı: Bir değişiklik, sakin bir test sisteminde sorunsuz göründüğü için değil, rakamlar daha iyi olduğunu gösterdiği için canlıya çıkmalı.
İlgili Yazılar
- SQL Server Wait Stats Analizi: Pratik Tanı İş Akışı
- SQL Server Extended Events: Temel Oturumlar, Hedefler ve Analiz Rehberi
- SQL Server Taşıma: Minimum Kesintiyle Geçiş Yöntemleri, Cutover ve Geri Dönüş
- SQL Server Index Rehberi: Index Türleri, Tasarım Kuralları, Eksik ve Kullanılmayan Index’ler, Bakım
SQL Server Performans
Değişikliğin etkisini kullanıcılarınızdan önce ölçün
Aryasoft; upgrade, taşıma ve performans projelerinde depolama katmanından kendi iş yükünüze kadar yük testlerini planlar, yürütür ve önce/sonra rakamlarıyla raporlar.