2010-09-10 116 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