ODBC'de dinamik SQL performansı

Statik SQL birçok durumda iyi çalışsa da, veri erişiminin önceden belirlenemediği bir uygulama sınıfı vardır. Örneğin, elektronik tablonun kullanıcının sorgu girmesini sağladığını ve elektronik tablonun verileri almak için DBMS'ye gönderdiğini varsayalım. Bu sorgunun içeriği, elektronik tablo programı yazıldığında programcı tarafından bilinemez.

Dinamik yürütme

Bu sorunu çözmek için elektronik tablo, dinamik SQL adlı bir katıştırılmış SQL biçimi kullanır. Programda sabit kodlanmış statik SQL deyimlerinden farklı olarak, dinamik SQL deyimleri çalışma zamanında derlenebilir ve bir dize konak değişkenine yerleştirilebilir. Daha sonra işlenmek üzere DBMS'ye gönderilirler. DBMS'nin dinamik SQL deyimleri için çalışma zamanında bir erişim planı oluşturması gerektiğinden, dinamik SQL genellikle statik SQL'den daha yavaştır. Dinamik SQL deyimleri içeren bir program derlendiğinde, statik SQL'de olduğu gibi dinamik SQL deyimleri programdan kaldırılamaz. Bunun yerine, bunlar deyimini DBMS'ye geçiren bir işlev çağrısıyla değiştirilir; aynı programdaki statik SQL deyimleri normal şekilde işlenir.

Dinamik SQL deyimi yürütmenin en basit yolu EXECUTE IMMEDIATE deyimidir. Bu deyim, derleme ve yürütme için SQL deyimini DBMS'ye geçirir.

EXECUTE IMMEDIATE deyiminin bir dezavantajı, DBMS'nin deyim her yürütüldüğünde SQL deyimini işlemeye yönelik beş adımın her birinden geçmesi gerektiğidir. Birçok deyim dinamik olarak yürütülürse bu işlemdeki ek yük önemli olabilir ve bu deyimler benzerse boşa gider.

Hazırlanmış icra

Yukarıdaki durumu ele almak için dinamik SQL, aşağıdaki adımları kullanan hazırlanmış yürütme adlı iyileştirilmiş bir yürütme biçimi sunar:

  1. Program, EXECUTE IMMEDIATE ifadesinde olduğu gibi, bir SQL ifadesini arabellekte oluşturur. Host değişkenleri yerine, bir sabit için daha sonra bir değer sağlanacağını göstermek amacıyla deyim metninin herhangi bir yerinde bir soru işareti (?) kullanılabilir. Soru işareti parametre işaretçisi olarak adlandırılır.

  2. Program, SQL deyimini DBMS'ye bir PREPARE deyimiyle geçirir. Bu deyim, DBMS'den deyimi ayrıştırmasını, teyit etmesini, optimize etmesini ve onun için bir yürütme planı oluşturmasını talep eder. Program daha sonra PREPARE deyimini daha sonra yürütmek için execute deyimini (EXECUTE IMMEDIATE deyimi değil) kullanır. İfadenin parametre değerlerini SQL Veri Alanı veya SQLDA adlı özel bir veri yapısı aracılığıyla geçirir.

  3. Program, dinamik deyim her yürütildiğinde farklı parametre değerleri sağlayarak EXECUTE deyimini art arda kullanabilir.

Hazırlanan yürütme hala statik SQL ile aynı değildir. Statik SQL'de, bir SQL deyimini işlemenin ilk dört adımı derleme zamanında gerçekleşir. Hazırlanan yürütmede, bu adımlar çalışma zamanında yine de gerçekleşir, ancak yalnızca bir kez yapılır. Planın yürütülmesi yalnızca EXECUTE çağrıldığında gerçekleşir. Bu davranış, dinamik SQL mimarisinin doğasında bulunan bazı performans dezavantajlarını ortadan kaldırmaya yardımcı olur.

Ayrıca bakınız

ÇALIŞTIR (Transact-SQL)
sp_executesql (Transact-SQL)