2011-03-25 14 views
10

Sorgu 1: (hızlı yıldırım)Neden parametreler argümanlar olarak geçirildiğinde daha yavaş çalışabilir Sp_executesql yapar

sp_executesql "select * from tablesView where Id = 1" 

vs

Sorgu 2: (çok yavaş)

sp_executesql "select * from tablesView where Id = @Id", N"@Id int", @Id=1 

tablesView - a view containing multiple joins

LINQ, sorguları her zaman Query2 formuna dönüştürür ve bu nedenle performans gerçekten çok kötüdür.

Sorular: Sorgu2 yavaşlığı için nedenlere ve varsa bir çözünürlüğe ihtiyacım var. Ve LINQ için bir çözüm.

---- Ek açıklamalar:

performans isabet kesinlikle çünkü sıralamasında fonksiyonları (satırnum) kullanıyorsanız 2 sütun ama ben onlara ihtiyacımız bunları önlemek mümkün değil.

+0

da kimliği = 1 ile satır bir şey var mı:

bir makale nedir parametre koklama olduğunu açıklayan burada yok mu? –

+0

@Lasse, 50 kayıtm olsa bile, fark çok büyük. 0 sn vs 10 sn gibi, bir şey tablodan * seçilir, genellikle birleşme katının bir görünümüdür. – WhoIsNinja

+0

"@ id" için alınan veri türü nedir? Dizinin kullanımını engelleyen kapalı bir dökümün olabilir. –

cevap

0
  1. kaçının SEÇ *
  2. ADO.NET 3.5 "parametresi quessing" Linq yoktur kullanılarak 1 = Tinyint 2345 = SMALLINT 76357242 = INT .. ADO.NET 4.0 parametre quessing varsayılan INT verilerle değiştirilir tip 1 = INT, 2335 = INT, 76357242 = INT)
+0

Asla select seçin *, bu sadece örnek oldu. – WhoIsNinja

7

burada bir kol çıkmak ve satırların bir sürü nerede kimliği = 1.

değilse olduğunu varsayalım gidiyorum , lütfen düzelt beni.

hmm, ben o parametre için geçeceğini merak ediyorum: SQL Server sorgu yavaş işlediğini

olası nedenlerinden biri de sorguya bakar ve gider olmasıdır.
1 olacak mı? Bir gazilyon satırları hakkında nerede var? Sadece 3
Sadece bilmiyorum sahip belki 1742
ya, ben daha iyi benim tüm üsleri

bir sütun halinde kapsayacak bir yürütme planı üretmek için emin olmak için bir tablo taraması yapmak, veya bir sütun kümesi düşük seçiciliğe sahiptir (yani, benzersiz değerlerin sayısı satır sayısından çok daha azdır), SQL Server bazen tüm satırları deterministik olarak almak için bir tabloya veya benzerine döner.

En azından bu benim deneyimim oldu. Özellikle, tarih aralığını zamana bağlı verileri olan tablolarda seçerken aynı davranışı gördüm, bu satırda @dt'nin bir satır içinde bulunduğu tüm satırları almak için bir WHERE dt <= @dt AND dt >= @dt yapıyor, bir tablo taramasına dönüyor ve daha sonra gerçek tarihi SQL'e bir editöre yerleştirdiğimde çok daha hızlı çalışır.

Burada sorun seçicidir, SQL Server, ifadeniz için bir yürütme planı oluştururken tüm senaryoları en iyi nasıl karşılayacağını bilmez, bu nedenle tahmin etmeye çalışır.

Parametre için tipik değerini belirtmek üzere bir sorgu ipucu eklemeye çalışın, örn.:

sp_executesql "select * from tablesView where Id = @Id option (optimize for (@id = 1742))", N"@Id int", @Id=1 
+0

için optimize değil, moroever ben sorguları içinde optimize optimize etmek için linq soramazsınız. :( – WhoIsNinja

+0

Ve kayıtlardan bahsetmişken, bu sorguda hiçbir yerde herhangi bir yan tümce bulunmazsa milyon kayıt olacak, görünüm büyük tablolar – WhoIsNinja

+1

arasında birleşiyor. 1. Kim "hayır nerede yan tümce" hakkında bir şey söyledi? SQL'in bir yan tümce ile yürütülmesi ve farklılıklara bakılması deneyin? 3) ... verilerinizi hala en iyi yaklaşımı bilmeyen bir ORM midir? –

2

Bu sorun koklama bir bir parametre olabilir. SQL sorgunuzun sonunda

satırını dahil etmeyi deneyin. http://blogs.technet.com/b/mdegre/archive/2012/03/19/what-is-parameter-sniffing.aspx

+0

Bunu doğrudan kullanamama rağmen, bu benim sorunumun cevabıydı, yani parametreler dizin kullanmak yerine tablo taramasına neden oluyordu. OPTION (RECOMPILE) kullanımı, alttaki görünümü tablo indekslerinin kullanılmasını sağlayan bir plan kullanmaya zorladı. Ne yazık ki bunu kullanamıyorum, SQL ara katman yazılımım sözdizimini kabul edemez. Benim çözümüm, parametreler olmadan SQL'i oluşturmak, değerleri sorguya etkili şekilde kodlamaktı. İdeal değil, ancak sorguyu sp_executesql haline getirmekten kaçındı. – Paul

İlgili konular