Sürüm: 0.21.0Bu dokümantasyon Spitfire 0.21.0 içindir.
SQL
Ne işe yarar
SQL adımı bir veritabanında sorgu çalıştırır ve süresini ölçer. Desteklenen veritabanları: PostgreSQL, MySQL / MariaDB, SQL Server ve Oracle. Bir adım iki şekilde çalışabilir:
- Tek sorgu: her iterasyonda aynı query (parametreleri değişebilir).
- Query mix: her iterasyonda birkaç query'den biri, ağırlığına göre rastgele seçilir. Böylece tek bir adım üretimdeki sorgu profilini yeniden üretir; sonuçlarda her query'nin gecikmesi ve hataları ayrı görünür.
Query'leri elle yazabilir, bir .sql dosyasından toplu ekleyebilir, üretim istatistiklerinden (pg_stat_statements, MySQL digest'leri) içe aktarabilir ya da veritabanının schema'sından önerilmesini isteyebilirsiniz (SQL: schema'dan query önerileri).
Veri güvenliği için her query bir write guard'dan geçer: okuma olmayan her şey açık onay ister ve PostgreSQL ile MySQL'de okumalar ayrıca read-only transaction içinde çalışır (bkz. Yazma koruması).
Ne zaman kullanılır
- Veritabanının yük altında hangi query'de yavaşladığını görmek için.
- Bir index, sürüm yükseltmesi ya da parametre değişikliğinin önce/sonra etkisini ölçmek için.
- Uygulamayı hiç ayağa kaldırmadan yalnızca veritabanı katmanını test etmek için.
Yük testi her iterasyonda query'yi gerçek veritabanında çalıştırır. Production yerine bir test/staging kopyası ve en az yetkili, read-only bir veritabanı kullanıcısı kullanın.
Desteklenen veritabanları
| Tür | Varsayılan port | Parametre (placeholder) | Okumalar read-only transaction'da |
|---|---|---|---|
| PostgreSQL | 5432 | $1, $2… |
Evet |
| MySQL / MariaDB | 3306 | ? |
Evet |
| SQL Server | 1433 | @p1, @p2… |
Hayır, yalnızca query kontrolü |
| Oracle | 1521 | :1, :2… |
Hayır, yalnızca query kontrolü |
SQL bağlantısı oluşturma
- Bağlantılar → Bağlantı ekle'ye tıklayın.
- Tür: PostgreSQL, MySQL / MariaDB, SQL Server ya da Oracle.
- Ad: ör.
orders-db. - Sunucu: veritabanının host adı ya da IP'si (zorunlu). SSH tüneli kullanıyorsanız bu ad SSH sunucusu tarafında çözülür.
- Port: boşsa türün varsayılanı.
- Veritabanı / servis: veritabanı adı; Oracle'da servis adı (ör.
FREEPDB1). - Kullanıcı ve Parola (secret). Mümkünse yalnızca gerekli tablolarda
SELECTyetkisi olan ayrı bir kullanıcı kullanın. - En çok açık bağlantı (runner başına): her runner'ın bu bağlantı için açacağı en çok veritabanı bağlantısı; varsayılan 50. VU sayınız yüksekse ve veritabanının
max_connectionssınırı düşükse buna göre ayarlayın: toplam bağlantı ≈ runner sayısı × bu değer. - Production veritabanı: bağlantı production'a gidiyorsa işaretleyin. Listede kırmızı PRODUCTION etiketi görünür; schema okunurken güçlü bir uyarı ve ek onay istenir.
- Sürücü parametreleri: sürücüye gidecek anahtar/değer çiftleri. Ekle ile satır ekleyin. Örnekler: PostgreSQL
sslmode=require; SQL Serverencrypt=true. - Veritabanına yalnızca bir bastion üzerinden erişiliyorsa SSH tüneli bölümünü kullanın (yalnızca kurulum yöneticileri; bkz. SQL: SSH tüneli).
- Kaydet, sonra Test et.
Tek sorgu adımı
- Test editöründe Adım ekle → Protokol: SQL.
- Bağlantı: ör.
orders-db. Bağlantının türü placeholder biçimini belirler. - Sorgu türü düğmelerinden Tek sorgu seçili olsun.
- Sorgu alanına query'yi yazın. Değerleri query'nin içine yazmayın, parametre kullanın (Değerleri sorguya yazmayın; parametre kullanın ($1).).
- Parametreler altında Parametre ekle ile her placeholder için bir değer girin (
#1,#2…). Değerler şablon olabilir:{{customerId}}, bir CSV veri sütunu{{musteriler.id}}, fake veri{{fake.firstName}}, rastgele sayı{{$randInt 1 100000}}. - Saklanacak en çok satır (varsayılan 100): check'lerin ve değişken çıkarmanın gördüğü satır sayısı. Fazlası sayılır ama okunmaz.
- Sorgu okuma ise formun altında yeşil Salt okunur: sorgu read-only transaction içinde çalışır; yazma girişimi veritabanında reddedilir. yazar (PostgreSQL ve MySQL).
- Check sekmesinde örneğin Satır sayısı = 1 ekleyin. Satırlar JSON dizisi olarak döner; Değişken çıkar'da
$[0].statusgibi bir JSONPath ile sütun değerini alabilirsiniz. - Dene ile tek iterasyon çalıştırıp dönen satırları görün, sonra Kaydet.
{"id": "order", "name": "Sipariş getir", "protocol": "sql", "connection": "orders-db",
"sql": {"query": "SELECT id, status, total FROM orders WHERE id = $1", "params": ["{{$randInt 1 100000}}"]},
"extract": [{"var": "status", "from": "jsonpath", "expr": "$[0].status"}],
"checks": [{"type": "rowCount", "op": "eq", "value": 1}]}Diğer veritabanlarında yalnızca placeholder değişir:
[
{"id": "my", "name": "MySQL", "protocol": "sql", "connection": "mysql-db",
"sql": {"query": "SELECT * FROM customers WHERE email = ?", "params": ["user{{__VU}}@example.com"]}},
{"id": "ms", "name": "SQL Server", "protocol": "sql", "connection": "mssql-db",
"sql": {"query": "SELECT TOP 10 * FROM Orders WHERE CustomerId = @p1", "params": ["{{__VU}}"]}}
]Query mix
- SQL adımında Sorgu türü olarak Query mix'i seçin. Yazılı bir query varsa
query_1adıyla ve 1 ağırlığıyla mix'in ilk elemanı olur. - Sorgu ekle ile her query için bir satır ekleyin ya da Toplu ekle / içe aktar ile doldurun.
- Her satıra:
- Ad: benzersiz, en çok 80 karakter, şablon içermeyen kısa bir ad (ör.
byId,search). Sonuç tablolarında ve eşik filtrelerinde bu ad kullanılır. - Ağırlık: pozitif tam sayı. Ağırlıklar görelidir; satırın yanında pay %… olarak gösterilir.
pg_stat_statements'tan gelen çağrı sayıları olduğu gibi kullanılabilir. - Sorgu ve parametreleri.
- Ad: benzersiz, en çok 80 karakter, şablon içermeyen kısa bir ad (ör.
- Bir mix'te en çok 200 query olabilir.
- Mix'teki bir query veri değiştiriyorsa satırında Bu sorgu veriyi değiştirir yazar ve adımın altında Bu query mix'te veriyi değiştiren sorgular var, onaylıyorum kutusu çıkar. Bu tek onay mix'teki tüm yazmaları kapsar.
{"id": "catalog", "name": "Katalog sorguları", "protocol": "sql", "connection": "orders-db",
"sql": {"mix": [
{"name": "byId", "query": "SELECT * FROM products WHERE id = $1", "params": ["{{$randInt 1 5000}}"], "weight": 120000},
{"name": "search", "query": "SELECT * FROM products WHERE name ILIKE $1 LIMIT 20", "params": ["%{{fake.firstName}}%"], "weight": 30000}
]}}Bu örnekte iterasyonların yaklaşık %80'i byId, %20'si search çalıştırır.
Mix kullanan bir adımın kendi query ve params alanı olmaz (query mix kullanan step'in kendi sorgusu ve parametreleri olmaz).
Toplu ekleme
Toplu ekle / içe aktar düğmesi SQL toplu ekle penceresini açar. İlk sekme Sorgular / .sql dosyası:
- Veritabanı listesinden dili seçin (PostgreSQL, MySQL / MariaDB, SQL Server, Oracle). Ayırma kuralları buna göre değişir.
- Query'leri metin alanına yapıştırın ya da .sql dosyası alanından bir dosya seçin.
- Ayrıştır'a tıklayın. Hiçbir query çalıştırılmaz; controller yalnızca metni ifadelere ayırır:
- tırnak ve yorum dışındaki
;, - PostgreSQL dollar quote (
$ … $) ve iç içe yorumlar, - MySQL
#yorumları veDELIMITER, - SQL Server
GOsatırları, - Oracle
/satırları ve PL/SQL blokları.
- tırnak ve yorum dışındaki
- Gözden geçirme tablosu her farklı ifadeyi bir kez gösterir: Satır (dosyadaki satır), Ad, İfade, Tekrar (aynı ifade kaç kez geçti; ağırlık olur), Tür ve Parametre değerleri. Üstteki özet N sorgu: X okuma, Y yazma biçimindedir.
- Tür sütunu: okuma, yazma, kilit (
SELECT … FOR UPDATEgibi), INTO (SELECT … INTOtablo oluşturur), prosedür (CALL/EXEC; yan etkisi bilinmez), çoklu ifade. - Okumalar işaretli, diğerleri işaretsiz gelir. Seçimi Yalnız okumalar, Tümü, Hiçbiri düğmeleriyle ya da satır satır değiştirin. Okuma olmayan bir ifadeyi seçerseniz altta kırmızı Seçilen N ifade veriyi değiştirir ya da kilitler; step'te "veri değiştirir" onayı gerekecek. uyarısı çıkar.
- Sonuç seçin: Tek query mix step'i ya da Her ifade ayrı step.
- Ekle (N)'e tıklayın.
Toplu ekleme gözden geçirme tablosu
Üretim istatistiklerinden içe aktarma
Aynı penceredeki Üretim istatistikleri sekmesi, veritabanınızın gerçekte en çok çalıştırdığı query'leri ve çağrı sayılarını alır:
Yöntem A — CSV/TSV yapıştırma (her kullanıcı):
- Dışa aktarma sorgusu satırını açın; PostgreSQL (psql) ve MySQL / MariaDB için hazır sorgu görünür:
- PostgreSQL:
pg_stat_statements'tanquery, calls, total_exec_time, rowssütunlarını mevcut veritabanı için, çağrı sayısına göre ilk 200 satır olarakstats.csv'ye yazan bir\copykomutu.pg_stat_statementseklentisinin kurulu ve yüklü olması gerekir. - MySQL:
performance_schema.events_statements_summary_by_digest'tenDIGEST_TEXT, COUNT_STAR, SUM_TIMER_WAIT.
- PostgreSQL:
- Sorguyu kendi istemcinizde çalıştırın; çıktıyı başlık satırıyla birlikte metin alanına yapıştırın.
- En çok çağrılan alanında kaç query alınacağını seçin (varsayılan 50, en çok 200).
- İçe aktar'a tıklayın.
Yöntem B — bağlantıdan doğrudan okuma (yalnızca yöneticiler, PostgreSQL ve MySQL):
- Adımın bağlantısı PostgreSQL veya MySQL ise Bağlantıdan oku: orders-db düğmesi görünür.
- Tıklayın. Controller bağlantıyı açar ve yalnızca istatistik sorgusunu, çağrı sayısına göre ilk N satırı, read-only transaction içinde ve zaman aşımıyla çalıştırır.
Her iki yöntemde:
- Çağrı sayıları ağırlık olur.
- Transaction ve oturum command'ları (
BEGIN,COMMIT,SET…) ve istatistik sorgusunun kendisi atlanır; atlananlar Atlanan: … satırında sayılır. - Yazmalar işaretsiz gelir.
- Normalleştirilmiş query'lerde sabitlerin yerinde placeholder (
$1,?) vardır. Parametre değerleri sütununda her birini bir veri sütununa ({{ad.sütun}}) ya da fake değere bağlayın; alan önerileri listeler. - MySQL'in daraltılmış listeleri (
IN (...)) Değer listesi daraltılmış (IN (...)): ekledikten sonra sorguyu elle düzenleyin., kesilmiş metinler Sorgu metni istatistikte kesilmiş: ekledikten sonra tamamlayın. notuyla işaretlenir.
Pencerenin sağ üstündeki Schema'dan öner sekmesi (yalnızca kurulum yöneticileri), veritabanının schema'sından query önerir: SQL: schema'dan query önerileri.
Sorgu başına sonuçlar
Her SQL adımı adım düzeyinde şu metrikleri üretir:
| Metrik | Anlamı |
|---|---|
req_duration |
Query'nin süresi (ms) |
req_failed |
Hatalı query oranı |
reqs |
Çalıştırılan query sayısı |
rows |
Dönen ya da etkilenen satır sayısı |
Query mix'te ayrıca her query kendi serisini üretir; query'nin adı serinin check etiketidir:
| Metrik | Anlamı |
|---|---|
sql_query_duration |
Query başına süre |
sql_query_failed |
Query başına hata oranı |
Koşu sayfasındaki SQL query mix kartı her query'nin Çağrı, Pay ve Hata oranı değerlerini listeler; adımın toplamı yukarıdaki adım tablosundadır. Aynı bilgiler HTML/PDF raporda ve CLI özetinde de vardır. Tek bir query'ye eşik koymak için:
[
{"metric": "sql_query_duration", "filter": {"check": "search"}, "expr": "p(95)<200"},
{"metric": "sql_query_failed", "expr": "rate<0.01"}
]Yazma koruması
Ne yazma sayılır
Write guard her query'yi veritabanının sözdizimine göre token'lara ayırır (yorumlar, tırnaklar, ayırıcılar) ve anahtar kelimeleri yalnızca bir ifadenin başladığı yerde sayar: ifadenin başı, bir CTE gövdesi, CTE listesinden ya da EXPLAIN'den sonraki ifade, bir alt sorgu. Bu yüzden replace() fonksiyonu ya da update adlı bir sütun bir okumayı yazma yapmaz.
| Tür | Örnekler |
|---|---|
| Okuma | SELECT, SHOW, EXPLAIN, DESCRIBE, VALUES, TABLE, WITH … SELECT |
| Yazma | INSERT, UPDATE, DELETE, MERGE, UPSERT, REPLACE, TRUNCATE, DROP, CREATE, ALTER (SQL Server'da ayrıca GRANT, REVOKE, DENY, BULK, DBCC) |
| Kilit | SELECT … FOR UPDATE, FOR SHARE, FOR KEY SHARE; SQL Server UPDLOCK, XLOCK, HOLDLOCK, TABLOCKX hint'leri |
| INTO | SELECT … INTO (tablo oluşturur ya da doldurur) |
| Prosedür | CALL, EXEC, EXECUTE, DO (yan etkileri bilinmez) |
| Çoklu ifade | Birden çok ifade, en az biri yazıyor |
Sınıflandırma ihtiyatlıdır: okuma olarak tanınmayan her şey yazma sayılır.
Onay adımları
- Adımda onay. Okuma olmayan bir query'de adımın altında Bu sorgu veriyi değiştirir, onaylıyorum (mix'te Bu query mix'te veriyi değiştiren sorgular var, onaylıyorum) kutusu çıkar. İşaretlemeden test kaydedilemez; hata şöyledir: bu sorgu veriyi değiştirir (UPDATE); izin vermek için "veri değiştirir" onayını işaretleyin. Editörde ayrıca her iterasyonda veritabanına yazar (INSERT), satır kilitler (FOR UPDATE); eşzamanlı VU'lar birbirini bekler gibi uyarılar listelenir.
- Denemede onay. Dene'ye bastığınızda Veri değiştiren deneme penceresi değiştirecek işlemleri listeler; Anladım, dene ile devam edersiniz.
- Her koşuda onay. Koşu penceresinde Bu testin gerçek veriyi değiştireceğini biliyorum, başlat kutusunu işaretlemeden koşu başlamaz (ya da onay telefondan verilir). Zamanlanmış koşularda ve karşılaştırmalı koşularda da ayrı onay kutuları vardır.
{"id": "audit", "name": "Denetim satırı yaz", "protocol": "sql", "connection": "orders-db",
"sql": {"query": "INSERT INTO audit_log (vu, at) VALUES ($1, now())", "params": ["{{__VU}}"], "allowWrite": true}}Read-only transaction
Write guard ilk savunma hattıdır. PostgreSQL ve MySQL / MariaDB'de okuma olarak sınıflanan her query ayrıca read-only transaction içinde çalışır; gözden kaçan bir yan etki (ör. veri değiştiren bir fonksiyon) veritabanının kendisi tarafından reddedilir.
SQL Server ve Oracle'da böyle bir transaction kipi yoktur. Bu bağlantılarla bir SQL adımında form şu uyarıyı gösterir: SQL Server: bu veritabanında okumalar salt okunur transaction'da çalışmaz; yalnız sorgu kontrolü korur. Salt okunur yetkili bir veritabanı kullanıcısı kullanın. Bu veritabanlarında veriyi korumanın tek güvenilir yolu, bağlantıda yalnızca okuma yetkisi olan (db_datareader / yalnızca SELECT) bir kullanıcı kullanmaktır.
Sık karşılaşılan sorunlar
Belirti: Test et: connection refused ya da zaman aşımı.
Neden: Host/port yanlış, veritabanı yalnızca iç ağdan erişilebilir ya da firewall engelliyor.
Çözüm: Port ve host'u kontrol edin; controller ve runner IP'lerine izin verin; bastion arkasındaysa SSH tüneli kullanın.
Belirti: password authentication failed for user … (PostgreSQL), Access denied for user … (MySQL), Login failed for user … (SQL Server), ORA-01017 (Oracle).
Neden: Kullanıcı/parola yanlış ya da kullanıcının o veritabanına erişimi yok.
Çözüm: Parolayı yeniden yazıp kaydedin; Veritabanı / servis alanını kontrol edin. PostgreSQL'de pg_hba.conf'un controller/runner IP'sine izin verdiğinden emin olun.
Belirti: no pg_hba.conf entry … SSL off ya da SQL Server TLS hatası.
Neden: Sunucu şifreli bağlantı istiyor.
Çözüm: Sürücü parametreleri'ne sslmode = require (PostgreSQL) ya da encrypt = true (SQL Server) ekleyin.
Belirti: ORA-12514: listener does not currently know of service.
Neden: Oracle servis adı yanlış.
Çözüm: Veritabanı / servis alanına SID değil servis adını yazın (ör. FREEPDB1).
Belirti: Kayıtta bu sorgu veriyi değiştirir (…); izin vermek için "veri değiştirir" onayını işaretleyin.
Neden: Query okuma olarak tanınmadı (yazma, kilit, INTO, prosedür ya da çoklu ifade).
Çözüm: Gerçekten yazacaksanız onay kutusunu işaretleyin. Okuma olması gerekiyorsa query'yi sadeleştirin: FOR UPDATE'i kaldırın, prosedür yerine doğrudan SELECT kullanın, birden çok ifadeyi ayrı adımlara bölün.
Belirti: Koşu sırasında cannot execute … in a read-only transaction (PostgreSQL) ya da Cannot execute statement in a READ ONLY transaction (MySQL).
Neden: Okuma gibi görünen query veri değiştirmeye çalıştı (ör. yan etkili bir fonksiyon).
Çözüm: Bu koruma bilerek çalışıyor. Yazma gerçekten amaçlanıyorsa query'yi yazma olarak işaretleyip onaylayın; değilse fonksiyonu değiştirin.
Belirti: Koşu başlatılamıyor: Bu test veriyi değiştiriyor; devam etmek için onaylayın. Neden: Testte onaylı bir yazma var. Çözüm: Koşu penceresindeki Bu testin gerçek veriyi değiştireceğini biliyorum, başlat kutusunu işaretleyin.
Belirti: too many connections / remaining connection slots are reserved.
Neden: Runner sayısı × En çok açık bağlantı (runner başına) veritabanının sınırını aşıyor.
Çözüm: En çok açık bağlantı (runner başına)'yı düşürün ya da veritabanının bağlantı sınırını artırın.
Belirti: Kayıtta query mix'teki search sorgusu veriyi değiştirir… ya da ağırlık pozitif bir tam sayı olmalı. Neden: Mix'te onaysız bir yazma ya da geçersiz ağırlık. Çözüm: Mix onayını işaretleyin ya da yazmayı çıkarın; ağırlıkları 1 veya daha büyük tam sayı yapın.
Belirti: Bağlantıdan oku düğmesi görünmüyor. Neden: Bağlantı SQL Server/Oracle ya da hesabınız yönetici değil. Çözüm: Yöntem A'yı (CSV yapıştırma) kullanın.





