2009-09-01 21 views
7

C# sql sorgusuna çok basit bir linq var nedenseLINQ Parametre

exec sp_executesql N'SELECT [t0].field1, [t0].field2, [t0].ACCT_NO 
FROM [dbo].[table] AS [t0] 
WHERE [t0].[ACCT_NO] = @p0', N'@p0 decimal(29,0)', @p0 = 12345 

, bu inanılmaz uzun sürüyor Kaçma zamanı (birkaç dakika). Yönetim stüdyosunda eşdeğer bir sorgu çalıştırırsam (acct_no = 12345 tablosundan * seçin), çok büyük bir tabloda bir saniyeden daha az sürer (~ 7MM satır). SQL profiler ile kazı yaptıktan sonra, linq'in bir Onalt (29,0) olarak acctNum parametresini geçtiğini ve alanın bir Sayısal (18,0) olarak veritabanında saklandığını buldum. Oluşturulan SQL'i alır ve parametre tipini ondalıktan sayısal olarak değiştirirseniz, bir saniyeden daha az bir sürede çalışır. Profilde, linq versiyonunun sayısal parametre sorgusu için yaklaşık 2 milyon okuma kullandığını görebiliyorum. Linq'in bu parametreyi onluk yerine sayısal olarak iletmesini nasıl zorlayabilirim?

cevap

5

Büyük olasılıkla sorun, p.ACCT_NO türüyle ilgilidir (başka bir deyişle büyük olasılıkla kayan noktalı sayısal tür olarak oluşturulmuştur). Bu özelliğin int olarak da yazıldığından emin olun ve işe yaramalıdır.

+0

Temel veritabanı alanının SQL veri türünü kastediyor musunuz? Onun bir sayısal (18,0). – maxpower47

+0

Hayır, 'p' türü ne olursa olsun 'ACCT_NO' özelliğinin türünü kastediyorum. –

+0

VS'de p.ACCT_NO Ondalık olarak gösterilir. Bunu nasıl değiştirebilirim? – maxpower47