DBAtlas · Veritabanı operasyon atlası

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.

DBAtlas'ta aç →