Aracılığıyla paylaş


CLR tümleştirme mimarisinin performansı

Şunlar için geçerlidir:SQL ServerAzure SQL Yönetilen Örneği

Bu makalede, .NET Framework ortak dil çalışma zamanı (CLR) ile SQL Server tümleştirmesinin performansını geliştiren bazı tasarım seçenekleri açıklanmaktadır.

Derleme işlemi

SQL ifadelerinin derlenmesi sırasında, yönetilen bir yordama başvuruyla karşılaşıldığında ortak bir ara dil (CIL) saplaması oluşturulur. Bu saptama, SQL Server'dan CLR'ye rutin parametreleri hazırlamaya, işlevi çağırmaya ve sonucu döndürmeye yönelik kodu içerir. Bu tutkal kodu, parametre türüne ve parametre yönüne (,veya başvuru) bağlıdır.

Tutkal kodu, türe özgü iyileştirmeleri etkinleştirir ve null atanabilirlik, kısıtlayan modeller, değere göre ve standart özel durum işleme gibi SQL Server semantiğinin verimli bir şekilde uygulanmasını sağlar. Bağımsız değişkenlerin tam türleri için kod oluşturarak, çağırma sınırı boyunca tür zorlama veya sarmalayıcı nesnesi oluşturma maliyetlerinden ("kutulama" olarak adlandırılır) kaçınırsınız.

Oluşturulan saplama daha sonra yerel koda derlenip CLR'nin tam zamanında (JIT) derleme hizmetleri kullanılarak SQL Server'ın yürütüldiği belirli donanım mimarisi için iyileştirilir. JIT hizmetleri yöntem düzeyinde çağrılır ve SQL Server barındırma ortamının hem SQL Server hem de CLR yürütmesini kapsayan tek bir derleme birimi oluşturmasına izin verir. Saptama derlendiğinde, sonuçta elde edilen işlev işaretçisi işlevin çalışma zamanı uygulaması olur. Bu kod oluşturma yaklaşımı, çalışma zamanında yansıma veya meta veri erişimiyle ilgili ek çağrı maliyetleri olmamasını sağlar.

SQL Server ile CLR arasında hızlı geçişler

Derleme işlemi, yerel koddan çalışma zamanında çağrılabilen bir işlev işaretçisi verir. Skaler değerli kullanıcı tanımlı işlevler için bu işlev çağrısı satır başına temelinde gerçekleşir. SQL Server ile CLR arasında geçiş maliyetini en aza indirmek için, yönetilen çağrı içeren deyimlerin hedef uygulama etki alanını tanımlamak için bir başlangıç adımı vardır. Bu tanımlama adımı, her satır için geçiş maliyetini azaltır.

Performansla ilgili dikkat edilmesi gerekenler

Aşağıdaki bölümde SQL Server'da CLR tümleştirmesine özgü performans konuları özetlenmiştir. Daha fazla bilgi için bkz. SQL Server 2005'te CLR Tümleştirmesini Kullanma. Yönetilen kod performansı hakkında bilgi için bkz. .NET Uygulama Performansını ve Ölçeklenebilirliğini İyileştirme.

Kullanıcı tanımlı işlevler

CLR işlevleri, kullanıcı tanımlı işlevlerden Transact-SQL daha hızlı bir çağırma yolundan yararlanılır. Ayrıca, yönetilen kod yordamsal kod, hesaplama ve dize işleme açısından Transact-SQL göre belirleyici bir performans avantajına sahiptir. Yoğun bilgi işlem kullanan ve veri erişimi gerçekleştirmeyen CLR işlevleri yönetilen kodda daha iyi yazılır. Ancak Transact-SQL işlevler, CLR tümleştirmesinden daha verimli bir şekilde veri erişimi gerçekleştirir.

Kullanıcı tanımlı toplamalar

Yönetilen kod, imleç tabanlı toplamadan önemli ölçüde daha iyi performansa sahip olabilir. Yönetilen kod genellikle yerleşik SQL Server toplama işlevlerinden biraz daha yavaş çalışır. Yerel yerleşik bir toplama işlevi varsa bunu kullanmanız önerilir. Gerekli toplamanın yerel olarak desteklenmediği durumlarda, performans nedeniyle imleç tabanlı uygulama üzerinde CLR kullanıcı tanımlı toplamayı göz önünde bulundurun.

Tablo değerli işlevleri akışla aktarma

Uygulamaların genellikle bir işlevi çağırmanın bir sonucu olarak tablo döndürmesi gerekir. Örnek olarak, içeri aktarma işleminin bir parçası olarak dosyadan tablo verilerini okuma ve virgülle ayrılmış değerleri ilişkisel gösterime dönüştürme verilebilir. Genellikle, çağıran tarafından tüketilmeden önce sonuç tablosunu gerçekleştirerek ve doldurarak bunu gerçekleştirebilirsiniz. CLR'nin SQL Server ile tümleştirilmesi, akış tablosu değerli işlevi (STVF) olarak adlandırılan yeni bir genişletilebilirlik mekanizmasını tanıtır. Yönetilen STVF'ler, karşılaştırılabilir genişletilmiş saklı yordam uygulamalarından daha iyi performans gösterir.

STVF'ler, IEnumerable arabirimi döndüren yönetilen işlevlerdir. IEnumerable, STVF tarafından döndürülen sonuç kümesinde gezinme yöntemlerine sahiptir. STVF çağrıldığında, döndürülen IEnumerable doğrudan sorgu planına bağlanır. Sorgu planı, satırları getirmesi gerektiğinde IEnumerable yöntemleri çağırır. Bu yineleme modeli, tablonun tamamı doldurulana kadar beklemek yerine ilk satır üretildikten hemen sonra sonuçların tüketilmesine olanak tanır. Ayrıca işlevi çağırarak tüketilen belleği önemli ölçüde azaltır.

Diziler ve imleçler karşılaştırması

Transact-SQL imleçlerin dizi olarak daha kolay ifade edilen verileri çapraz geçirmesi gerektiğinde, yönetilen kod önemli performans kazanımlarıyla kullanılabilir.

Dize verileri

varchargibi SQL Server karakter verileri, yönetilen işlevlerde SqlString veya SqlChars türünde olabilir. SqlString değişkenler tüm değerin bir örneğini belleğe oluşturur. SqlChars değişkenleri, tüm değerin bir örneğini belleğe oluşturmayarak daha iyi performans ve ölçeklenebilirlik elde etmek için kullanılabilecek bir akış arabirimi sağlar. Bu, büyük nesne (LOB) verileri için önemli hale gelir. Ayrıca, sunucu XML verilerine SqlXml.CreateReader()tarafından döndürülen bir akış arabirimi aracılığıyla erişilebilir.

CLR ile genişletilmiş saklı yordamlar karşılaştırması

Yönetilen yordamların sonuç kümelerini istemciye geri göndermesine izin veren Microsoft.SqlServer.Server uygulama programlama arabirimleri (API'ler), genişletilmiş saklı yordamlar tarafından kullanılan Açık Veri Hizmetleri (ODS) API'lerinden daha iyi performans gösterir. Ayrıca, System.Data.SqlServer API'leri xml, varchar(max), nvarchar(max)ve varbinary(max)gibi veri türlerini desteklerken, ODS API'leri bu veri türlerini destekleyecek şekilde genişletilmemiştir.

Yönetilen kod ile SQL Server bellek, iş parçacıkları ve eşitleme gibi kaynakların kullanımını yönetir. Bunun nedeni, bu kaynakları kullanıma sunan yönetilen API'lerin SQL Server kaynak yöneticisinin üzerine uygulanmasıdır. Buna karşılık, SQL Server genişletilmiş saklı yordamın kaynak kullanımı üzerinde hiçbir görünüme veya denetime sahip değildir. Örneğin, genişletilmiş bir saklı yordam çok fazla CPU veya bellek kaynağı tüketiyorsa, SQL Server ile bunu algılamanın veya denetlemenin bir yolu yoktur. Ancak yönetilen kodla, SQL Server belirli bir iş parçacığının uzun bir süre boyunca verim almadığını algılayabilir ve ardından görevi diğer işlerin zamanlanması için verim almaya zorlayabilir. Bu nedenle, yönetilen kodun kullanılması daha iyi ölçeklenebilirlik ve sistem kaynağı kullanımı sağlar.

Yönetilen kod, yürütme ortamını korumak ve güvenlik denetimleri gerçekleştirmek için ek yüke neden olabilir. Örneğin, SQL Server'ın içinde çalışırken ve yönetilen koddan yerel koda çok sayıda geçiş gerekir (çünkü SQL Server'ın yerel koda ve geriye doğru hareket ederken iş parçacığına özgü ayarlarda ek bakım yapması gerekir). Bu nedenle genişletilmiş saklı yordamlar, yönetilen ve yerel kod arasında sık geçişlerin olduğu durumlarda SQL Server içinde çalışan yönetilen koddan önemli ölçüde daha iyi performansa sahip olabilir.

Not

Bu özellik kullanım dışı olduğundan yeni genişletilmiş saklı yordamlar geliştirmeyin.

Kullanıcı tanımlı türler için yerel serileştirme

Kullanıcı tanımlı türler (UDF'ler), skaler tür sistemi için genişletilebilirlik mekanizması olarak tasarlanmıştır. SQL Server, UDT'ler için Format.Nativeadlı bir serileştirme biçimi uygular. Derleme sırasında, türün yapısı incelenerek söz konusu tür tanımı için özelleştirilmiş CIL oluşturulur.

Yerel serileştirme, SQL Server için varsayılan uygulamadır. Kullanıcı tanımlı serileştirme, serileştirmeyi yapmak için tür yazarı tarafından tanımlanan bir yöntemi çağırır. en iyi performans için mümkün olduğunda Format.Native serileştirme kullanılmalıdır.

Karşılaştırılabilir UDF'leri normalleştirme

UDT'leri sıralama ve karşılaştırma gibi ilişkisel işlemler doğrudan değerin ikili gösterimi üzerinde çalışır. Bu, diskte UDT durumunun normalleştirilmiş (ikili sıralı) gösterimini depolayarak gerçekleştirilir.

Normalleştirmenin iki avantajı vardır:

  • Tür örneğinin ve yöntem çağırma ek yükünün oluşturulmasından kaçınarak karşılaştırma işlemini önemli ölçüde daha ucuz hale getirir.

  • UDT için bir ikili etki alanı oluşturarak tür değerleri için histogramların, dizinlerin ve histogramların oluşturulmasını sağlar.

Bu nedenle, normalleştirilmiş UDF'ler, yöntem çağırma içermeyen işlemler için yerel yerleşik türlere benzer bir performans profiline sahiptir.

Ölçeklenebilir bellek kullanımı

Yönetilen çöp toplamanın SQL Server'da iyi performans göstermesini ve ölçeklendirmesini sağlamak için büyük, tek ayırmayı önleyin. Boyutu 88 kilobayttan (KB) büyük ayırmalar Büyük Nesne Yığınına yerleştirilir ve bu da çöp toplama işleminin birçok küçük ayırmadan daha kötü performans göstermesine ve ölçeklendirilmesine neden olur. Örneğin, çok boyutlu büyük bir dizi ayırmanız gerekiyorsa, pürüzlü (dağınık) bir dizi ayırmak daha iyidir.

  • CLR kullanıcı tanımlı türleri