同一查询的不同执行时间 - SQL Server

Posted

技术标签:

【中文标题】同一查询的不同执行时间 - SQL Server【英文标题】:Different execution time for same query - SQL Server 【发布时间】:2011-01-28 06:23:58 【问题描述】:

我有一个问题:

Select a from tbl_abc where id in ( select id from tbl_xyz where mainid = 12)

当我执行这个查询时,执行需要 1-2 秒,但是当我在存储过程中使用相同的查询时,下面的查询需要超过 5 分钟:

  If(Select a from tbl_abc where id in ( select id from tbl_xyz where mainid = 12))
    BEGIN
       -- CREATE TEMPORARY TABLE [Say: #temp1]
 #temp1 => Select a from tbl_abc where id in ( select id from tbl_xyz where mainid = 12)
      inserting the same value in the temp table
      drop #temp1
    END

这可能是什么原因?我该如何解决这个问题?我正在从 asp.net 运行 SP

【问题讨论】:

为什么是 IF 语句?你想做什么? 你检查过查询计划和 io/cpu 统计信息吗? 对于那些面临同样问题的人:两个答案 [by: binil & by: gbn] 对我有用。 【参考方案1】:

一个 EXISTS 会为你短路 IF

If EXISTS (Select a from tbl_abc where id in ( select id from tbl_xyz where mainid = 12))
    BEGIN
       -- CREATE TEMPORARY TABLE [Say: #temp1]
 #temp1 => Select a from tbl_abc where id in ( select id from tbl_xyz where mainid = 12)
      inserting the same value in the temp table

    END

但是,为什么不查询一次 tbl_abc 和 tbl_xyz 呢?

   Select a
   INTO #temp1 
   from tbl_abc where id in ( select id from tbl_xyz where mainid = 12)
   IF EXISTS (SELECT * FROM #temp1) /* or use @@ROWCOUNT*/
   BEGIN
     --DoStuff
   END
   drop TABLE #temp1

【讨论】:

【参考方案2】:

试试这个

declare @Count int

select @Count = count (a) from tbl_abc where id in ( select id from tbl_xyz where mainid = 12)

if(@Count > 0)
begin
   #temp1 => Select a from tbl_abc where id in ( select id from tbl_xyz where mainid = 12)
      inserting the same value in the temp table
      drop #temp1
end

我也遇到了同样的情况,就这样解决了。

这可能是因为查询执行了两次并且它包含一个子查询。在执行这样的查询时不知道里面到底发生了什么。但是像这样更改查询解决了我延迟的问题

【讨论】:

这虽然有效,但效率不高。根据我的回答和***.com/questions/3271455/…,您将使用 EXISTS @gbn 但是在使用“exists”时我发现了同样的问题。执行时间太长了。但是当我像上面的答案一样改变它时,它开始正常工作。我不知道为什么。 @gbn 当你在 sql server 中检查它存在时工作正常。但是从我的应用程序调用它时,它会延迟,有时会抛出异常。我的表包含超过 1000000 条记录【参考方案3】:

mainid 值是否实际上是硬编码的 (12),或者这只是示例,实际上,您将此值作为参数传递给存储的 proc? (如果它是硬编码的,您可能希望忽略以下内容。

如果“12”实际上是一个参数,那么您可能是参数嗅探的受害者。 Here's a question with some useful answers。

提到但未解释的一个解决方案是屏蔽参数 - 通过声明一个局部变量,将其设置为参数的值并在查询中使用它来做到这一点。

【讨论】:

以上是关于同一查询的不同执行时间 - SQL Server的主要内容,如果未能解决你的问题,请参考以下文章

浅析SQL SERVER执行计划中的各类怪相

sql_server 新建远程查询

sql server 2008同一个语句查询,为啥时快时慢

sql server 2008同一个语句查询,为啥时快时慢

SQL Server 2012 使用 OPENROWSET 查询 Access 2007 数据错误

为啥在 oracle SQL 中,在条件相差很大的情况下,对同一列执行具有两个不同值的查询所花费的时间