2009-11-09 18 views
6

Linq to SQL'de büyük bir performans sorunu keşfettim.Linq'den SQL nvarchar'a sorun

Dizeleri kullanarak bir tablodan seçim yaparken, sql tablosu bir varchar olduğunda bile sql sunucusuna iletilen parametreler her zaman nvarchar olur. Bu, büyük bir performans sorunu olan aramalar yerine tablo taramasıyla sonuçlanır.

var q = (
    from a in tbl 
    where a.index == "TEST" 
    select a) 

var qa = q.ToArray(); 

parametre

bütün endeks ile sonuçlanmaktadır kullanılmadan önce nvarchar varchar dönüştürülen bir nvarchar olarak geçirilir.

Parametre bir değişken ise, çok hızlı bir aramadır.

Bunu geçersiz kılmanın veya değiştirmenin bir yolu var mı?

Teşekkürler Saygılarımızla Craig.

+0

DBML'niz nasıl görünüyor? – RobS

+0

Bir varchar sütunu, bir nvarchar sütunu değil. tablo yarat create (test varchar (200) null değil) index oluştur create ixtest testte (test) – Craig

+0

Veritabanı sorgu planı CONVERT_IMPLICIT ve tarama yerine arama kullanır. Bence SQL problemi için yaygın bir LINQ. Parametrelerin doğru şekilde belirtilmesine olanak tanıyan bir geçici çözüm arıyorum. Varchar (200) yerine nvarchar (4) ile sonuçlanır. – Craig

cevap

8

Hmmm. Bu, LINQ-to-SQL öncesi RTM yapıları ile bilinen bir hataydı, ancak çevrimiçi okuduğumdan bu, RTM'deki eşitlik karşılaştırmaları için sabit bir sorundu (yine de Contains() karşılaştırmaları için kırılmış olsa da). http://social.msdn.microsoft.com/Forums/en-US/linqtosql/thread/4276ecd2-31ff-4cd0-82ea-7a22ce25308b

Çoğu gibi geçici çözüm bu biridir:

//define a query 
IQueryable<Employee> emps = from emp in dc2.Employees where emp.NationalIDNumber == "abc" select emp; 

//get hold of the SQL command translation of the query... 
System.Data.Common.DbCommand command = dc2.GetCommand(emps); 

//change param type from "string" (nvarchar) to "ansistring" (varchar) 
command.Parameters[0].DbType = DbType.AnsiString; 
command.Connection = dc2.Connection; 

//run 
IEnumerable<Employee> emps2 = dc2.Translate<Employee>(command.ExecuteReader()); 

BTW, gördüm bir dava bunlar oluyor bir oldu

olursa olsun, burada bazı geçici çözümler ayrıntılı ile MSDN forumlarında bir iş parçacığı var Değerlerin tek sayı dağılımına sahip tablo (örneğin, tablonun% 50'si aynı değere sahipti) anlamına gelir; bu, parametrenin plan derleme zamanında SQL Server tarafından bilinmediği için, bir tablo taraması mevcut en iyi plandı. Dağıtımınız da olağandışı değilse, tarama, eksik dönüşümden değil, parametrelendirmenin kendisinden gelmeyeceğinden, yukarıdaki geçici çözümler çalışmayacaktır. Bu durumda, bildiğim tek çözüm, bir OPTIMIZE FOR bir ipucu kullanmak ve el ile SQL belirtmek olacaktır.

+0

+1 .. :) başka alternatif geçici çözümlerle birlikte başka bir msdn dizgesi de var: http://social.msdn.microsoft.com/Forums/en-US/linqtosql/thread/20d456f0-9174-4745-bbc5-571f68879e27 – KristoferA

+0

Teşekkürler. Sadece içerdiği bir sorun olduğunu anladım. İlk başta daha geniş olduğunu düşündüm. – Craig