2010-09-10 99 views
10

我在數據庫表上運行sp_executesql時遇到了一些問題。我正在使用一個ORM(NHibernate)生成SQL查詢,在這種情況下查詢一個表。這個表格中有大約700萬條記錄,並且索引很高。sp_executesql導致我的查詢很慢

當我運行查詢ORM吐出沒有sp_executesql時,它運行速度非常快,profiler顯示它有85個讀取。當我使用sp_executesql運行相同的查詢時,它有大約201,828個讀取。

有沒有什麼我需要做我的SQL Server來提高沒有sp_exectuesql運行查詢的性能?它好像它不使用我的索引。

解決此問題的最佳方法是什麼?如果可能的話,我寧願不改變ORM生成SQL的方式,而是在SQL Server /數據庫級別修復問題,因爲它似乎是問題所在。我猜我需要做更多的數據庫優化來解決這個問題,我只是不知道該怎麼做。

exec sp_executesql N'SELECT top 20 
          this_.Id as Id0_0_, 
          this_.Application as Applicat2_0_0_, 
          this_.[Context] as column3_0_0_, 
          this_.Logger as Logger0_0_, 
          this_.Message as Message0_0_, 
          this_.Exception as Exception0_0_, 
          this_.Thread as Thread0_0_, 
          this_.[Level] as column8_0_0_, 
          this_.LogDate as LogDate0_0_, 
          this_.SessionId as SessionId0_0_ 
         FROM LogMessages this_ 
         WHERE this_.[Context] = @p0', 
        N'@p0 nvarchar(2)', 
        @p0 = N'55' 

上下文是一個varchar(255)。這個字段是非常自由的形式。它並不總是一個整數,長度可能非常。在這種情況下,我查詢了「55」的值,但它可以很容易地查詢「Foooooobaaaarrr」

+1

什麼版本的SQL Server?查詢是什麼樣的? – 2010-09-10 20:18:24

+1

沒有看到我們只能猜到的任何代碼 – SQLMenace 2010-09-10 20:21:14

+0

SQL Server 2008 – Rob 2010-09-10 20:25:19

回答

13

什麼是數據類型。[背景]

現在使用相同的數據類型你正在使用nvarchar(2),但似乎奇怪的東西像55,如果你不使用相同的數據類型,你會得到轉換,然後導致掃描

根據您更新的問題,它看起來像它是varchar( 255),那就這樣做

WHERE this_.[Context] = @p0',N'@p0 varchar(255)',@p0='55' 
+4

「得到轉換,然後導致掃描」是我正在尋找的答案。看起來由於某種原因,NHibernate試圖使用nvarchar而不是varchar導致問題。手動將其更改爲varchar可修復問題。 – Rob 2010-09-10 20:46:20

+2

,因爲.NET中的字符串是unicode,並且將其轉移到nvarchar – SQLMenace 2010-09-10 20:46:55