Bind değişken / parametre sniffing yönet
Oracle
-- Literal yerine bind kullan (plan paylaşımı için):
SELECT * FROM musteri WHERE il = :il;
-- Literal içeren eski kodları paylaştır:
ALTER SESSION SET cursor_sharing = FORCE;Bind değişken hard parse'ı azaltır. Adaptive Cursor Sharing, dengesiz dağılımlı bind değerlerinde birden çok plan tutarak sniffing sorunlarını hafifletir. cursor_sharing=FORCE dikkatli kullanılmalı.
PostgreSQL
-- Prepared statement ile parametreleştir:
PREPARE q (text) AS SELECT * FROM musteri WHERE il = $1;
EXECUTE q('Ankara');
-- Plan önbelleği davranışını ayarla:
SET plan_cache_mode = force_custom_plan;plan_cache_mode=auto generic/custom plan arasında seçim yapar; force_custom_plan her yürütmede parametreye özel plan üretir (sniffing benzeri sorunlara çözüm).
MySQL
-- Sunucu tarafı prepared statement:
PREPARE stmt FROM 'SELECT * FROM musteri WHERE il = ?';
SET @il = 'Ankara';
EXECUTE stmt USING @il;
DEALLOCATE PREPARE stmt;Prepared statement SQL enjeksiyonunu önler ve ayrıştırma maliyetini düşürür. MySQL sürücü düzeyinde de parametreleştirmeyi destekler.
SQL Server
-- Parametreli sorgu (sp_executesql):
EXEC sp_executesql N'SELECT * FROM dbo.musteri WHERE il = @il', N'@il nvarchar(50)', @il = N'Ankara';
-- Sniffing sorununu hint ile yönet:
SELECT ... OPTION (RECOMPILE);
-- veya OPTION (OPTIMIZE FOR (@il = 'Ankara'));OPTION(RECOMPILE) her çalıştırmada parametreye özel plan üretir (CPU maliyetli). OPTIMIZE FOR belirli/tipik değere göre plan sabitler; OPTIMIZE FOR UNKNOWN ortalama seçicilik kullanır.
MongoDB
// Sorgu şekli (query shape) plan önbelleğinin anahtarıdır:
db.musteri.find({ il: "Ankara" }).explain("queryPlanner")
// Bayat planı temizle:
db.musteri.getPlanCache().clear()Aynı şekle sahip sorgular (aynı alanlar/operatörler) önbellekteki planı paylaşır; farklı literal değerler yeni plan üretmez. Değer dağılımı çok dengesizse planCacheClear ile sıfırlayın.
Redis
# Uygulanamaz: sorgu planlayıcı ve parametre sniffing yoktur.Komutlar doğrudan yürütülür; parametreleştirme yerine anahtar tasarımı performansı belirler.
Elasticsearch
# Parametreli search template ile sorguyu yeniden kullan:
POST _scripts/musteri_il
{ "script": { "lang": "mustache", "source": { "query": { "term": { "il": "{{il}}" } } } } }
GET <index>/_search/template
{ "id": "musteri_il", "params": { "il": "Ankara" } }Search template (Mustache) sorgu gövdesini parametreleştirir; uygulama sabit şablonu farklı değerlerle çağırır, sorgu tutarlılığı ve önbellek kullanımını artırır.