2009-11-22 12 views
7

Veritabanı tablosundan oldukça büyük miktarda veri getiren iki sorguyu karşılaştırdım. Sorgu için ben Linq To Sql ve diğer için ben ADO.NET üzerinden geçidi SQL kullanıyorum.Linq To Sql, grid-out SQL'e göre daha yavaş görüntüleniyor?

Linq To Sql'in sahne arkasında çok fazla iş yapması gerektiğini biliyorum, ama aslında ne yapıyor? İki sorgu, aynı miktarda veri getiriyor ancak Linq To Sql sorgusu 5 saniyeden daha yavaş ve 150MB daha fazla RAM kullanıyor! gönderilen

public void MakeList() 
    { 

     int start = Environment.TickCount; 
     SqlCommand sqlCommand = new SqlCommand("SELECT * FROM tDokument", _connection); 
     SqlDataAdapter da = new SqlDataAdapter(sqlCommand); 

     DataSet ds = new DataSet(); 
     da.Fill(ds); 
     int end = Environment.TickCount; 

     GridView1.DataSource = ds; 
     GridView1.DataBind(); 

     Label1.Text = (end - start).ToString(); 
    } 
+2

İşlem hata ayıklayıcıya eklenmediğinde bunu test ettiniz mi? –

+0

NHibernate ile benzer sorunlar buldum. Ben "perdenin arkasında" büyük seceret ne olduğundan emin değilim ama ORM araçları yavaş .... – Dani

+1

@Dani sanırım - performans denemeleri veri bağlama dan takip etmiyor "ORM araçları yavaş". Bu bir ** çok ** genel (ve IMHO, yanıltıcı) ifadesidir. – TrueWill

cevap

8

Linq2Sql veri kümesi aslında bir tutarı ne ile doldurulur oluyor olarak kesinlikle yazılı nesneleri dönüyor hash tablosu. Linq'de, verilerin popülasyonu ve bu verilerin bir GridView'a bağlanması istenen sonuçları elde etmek için çok fazla yansıma kullanır.

İkinci kod parçasında, veri bir veri kümesine yüklenir ve GridView'a bağlanır. Bu aslında, veriye ve arayacak aramalara sahip bir hashtable yüklüyor.

Bildirilebilir işlemler her zaman yansımadan daha hızlı olacaktır. Az miktarda veri ile fark edilebilir bir fark olmayacaktır, ancak birçok veri için Linq'deki yansımanın etkisini göreceksiniz.

+0

Cevabınız için teşekkür ederiz. Cevap vermem lazım. Yansıma nedir? – Poku

+1

Yansıma, bir nesnenin özelliklerini veya yöntemlerini programatik olarak keşfetme işlemidir. MSDN'de System.Reflection ad alanına bakın. Linq'in, sorgu tarafından döndürülen değerleri tDokument nesnesinin özelliklerine atamak için yapması gereken şey budur. Doğrudan özellik atamalarından çok daha yavaştır. – Jason

4

gerçek SQL baktınız mı: Linq kullanarak

Sql:

public void MakeList() 
    { 
     int start = Environment.TickCount; 
     var document = from d in _dm.tDokuments select d; 

     List<tDokument> documentList = document.ToList(); 
     int end = Environment.TickCount; 

     GridView1.DataSource = documentList; 
     GridView1.DataBind(); 

     Label1.Text = (end - start).ToString(); 
    } 

Geçiş SQL + ADO.NET İşte

benim test kodu Profiler ile SQL Server?

Bu durumda, istemcinin farkı nasıl işlediğini (DataSet vs List) olduğunu sanıyorum, ancak bir C# uzmanının yakınında değilim.

+0

Veri kümesi, genel listeden daha fazla yüke sahip olacak, bu yüzden sorun olmamalı. – Jason

+0

@ Jason: teşekkürler. Listenin olacağını düşündüm. – gbn

1

Kişisel önlem doğru olmayabilir, zaman ölçümü için System.Diagnostics.StopWatch sınıfını kullanın:

static void Main(string[] args) 
{ 
    var sw = Stopwatch.StartNew(); 
    Thread.Sleep(100); 
    Console.WriteLine(sw.Elapsed.ToString()); 
    Console.Read(); 
} 
+0

Ses tavsiyesi (muhtemelen bir yorum olmalı). Açıkçası Thread.Sleep iş parçacığının 100 ms'den uzun süre uyuyamasına neden olabilir. – RichardOD

+0

Evet ama baskılı sonucu Yukarıdaki program biraz daha küçük daha 100ms –

+0

oldu çalıştırdığınızda bir yorum Bu yapmaması gereken –

3

Linq To Sql örneğindeki tel üzerinden gönderilen SQL deyimlerini yakalayın ve çözümleyin. SQL Profiler hile yapacak.

Bu ifadeleri hem Örnek 1 hem de 2'den, Management Studio'yu kullanarak doğrudan SQL Server'ınıza karşı çalıştırın. Muhtemelen sorgu planında HERHANGİ önemli bir fark görmeyeceksiniz.

Sanırım çoğu zaman C# nesnesini oluştururken harcanıyor (Jason's answer nails it, sanırım). Linq to Sql

2

o zaman döküm gerçekleşeceği anlamına gelir güçlü girilmiş nesnelerde içine sorgu sonuçlarını çevirmek zorundadır veritabanıyla çalıştırmak için sorgunun ne tür kodundan anlamaya vardır. DataSet sürümünüzün yapamadığı iki şey budur.

Linq to Sql performansıyla ilgileniyorsanız, çalışma zamanında yorumlama gereksinimini ortadan kaldıran compiled queries kullanma seçeneği vardır.