当前位置: 首页 > 面试题库 >

sp_executesql导致我的查询非常慢

鲁涵映
2023-03-14
问题内容

在数据库表上运行sp_executesql时遇到一些问题。我使用的是ORM(NHibernate),在这种情况下,该ORM(NHibernate)生成查询一个表的SQL查询。该表中大约有700万条记录,并且已被高度索引。

当我运行没有sp_executesql的ORM吐出的查询时,它运行非常快,并且探查器显示它具有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”


问题答案:

。[Context]的数据类型是什么?使用相同的数据类型

现在您正在使用nvarchar(2),但是对于像55这样的东西来说似乎很奇怪,如果您使用的数据类型不同,则会得到转换,从而导致扫描

根据您更新的问题,它看起来像是varchar(255),然后执行此操作

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


 类似资料:
  • 我正在对一个小表执行一个简单的查询 系统表只有三列(Id、Name、Progress)和1300行。 我获取数据的代码是: 这段代码在JTable中显示日期大约需要15秒,而如果在phpmyadmin中执行查询,则需要不到1秒。

  • 问题内容: 为什么简单地更新此表以添加列需要一个多小时?该表有1500万行。它具有2个索引和一个键主键。ALTER TABLE查询现在已处于“复制到tmp表”状态1小时15分钟。 表: 问题答案: 对于非常大的表,MySQL的ALTER TABLE性能可能会成为问题。MySQL通过创建一个具有所需新结构的空表,将旧表中的所有数据插入新表中,然后删除旧表来执行大多数更改。这可能会花费很长的时间,特别

  • 问题内容: 我有一个表,其中有一个索引(A列,B列)。我正在运行一个查询,如下所示: 这个查询很慢!该计划如下所示: Postgres似乎没有一次对5000个值进行一次索引扫描,而是一次对5000个值进行了一次索引扫描,这解释了为什么查询如此缓慢。 实际上,这样做是更快的方法: 获取结果,然后在应用程序内的B列上进行过滤(python)。 我真的更希望结果已经由Postgres在合理的运行时间下进

  • 我正在处理一个需要JDBC调用Oracle数据库的项目。我已经设置了UCP池化来与SpringJDBC一起工作。我有一个相当简单的查询,我正在执行如下... 我的java代码来设置这个查询看起来像下面... 只要数组中只有一个id,这一切都可以正常运行。当我添加第二个ID时,查询需要将近5分钟的时间运行。如果我获取精确的查询并在SQLDeveloper中执行它,则需要.093秒。 我的代码或配置一

  • 问题内容: 是否可以执行这样的mysql查询? 我需要在一般的“ where”子句中使用子查询的结果。 问题答案: 您可以将其包装在子查询中,如下所示:

  • 问题内容: 我有这个查询: 内部查询运行得非常快(不到0.1秒),以获取两个ID,一个ID表示状态1,一个ID表示状态2,然后它根据主键进行选择,以便对其进行索引。说明查询说,它仅使用where搜索135k行,我一生都无法弄清楚为什么这么慢。 问题答案: