Wednesday, December 1, 2010

Compiled Query ile sorgularınızı hızlandırın




Merhaba,

Kullandığımız LinqToSql sorgularında çalışma mekanizması kabaca aşağıdaki gibi.




Her LinqtoSql komutu çalıştırıldığında tüm adımları baştan almaktadır. System.Data.Objects.CompiledQuery Sealed class sayesinde, bu sorguları önbellekleyerek direkt db ye gönderide bulunmakta ve sorgu hızı 5-6 kat artmaktadır.


Sorgu ilk çalıştırıldığında LinqtoSql engine sonucu cache leyecek ve daha sonraki sorgularda cahce den işlemleri devam ettirecek. Result ın cache lenmediğine dikkat çekmek isterim sadece linqtosql sorgusunu çalıştırdığı anda db ye gönderene kadar yaptığı işlemleri cache ler, sorgunun sonucunu değil.

public static Func Compile(Expression> query) where TArg0 : DataContext;
Targ0 DataContext nesnesini - zaten bu tip üzerine bir kısıtlayıcı (constraint) konulmuş -
Targ1 filitreleme işleminde kullanılacak parametreyi
TResult işlem sonucunda geriye dönecek verinin türünü
query ise Linq To Sql sorgusunu temsil etmektedir.

private static Func FUncGetEntityByIdForInvoice =
System.Data.Objects.CompiledQuery.Compile(
(EntitiesModel ctx, int ID) =>
ctx.Entity.Where(ti => ti.ID == ID).Select(p => new AnonymEntity
{
ID = p.ID,
Name = p.Name,
TypeID = p.FinanceTypes.FinanceTypeID,
StatusID = p.FinanceStatus.FinanceStatusID,
FinanceRelationID = p.Relations.RelationID,
InvoiceAddressID = p.Addresses1.AddressID,
PaymentTermsID = p.PaymentTerms.PaymentTermsID,
VATCodeID = p.VatCodes.VatCodeID,
GeneralLedgerAccNo = p.GeneralLedgers.GeneralLedgerID
}).FirstOrDefault()
);

using (EntitiesModel context = new EntitiesModel ())
{
AnonymEntity lopc = lopc = FUncGetEntityByIdForInvoice (context, Id);
}
Ortalama performance artışı ile ilgili rakamlar;
Sorgu Sayısı Complied Query Normal Query
1 0 ms 3 ms
10 3 ms 22 ms
100 30 ms 174 ms
1000 284 ms 1786 ms

No comments: