【问题标题】:Sql Performance issue about subquery and temp table关于子查询和临时表的 Sql 性能问题
【发布时间】:2014-05-21 07:56:32
【问题描述】:

关于语句中的子查询,我有一个非常奇怪的问题。

一点背景:

我们为我们的产品运行了一项服务,我首先获取用户可以访问的所有产品。之后我会过滤掉客户不想要的产品。

我用参数化的临时表和删除查询做了这个..

因此,我们的大多数查询都是这样的:

DELETE FROM @total 
WHERE Number NOT IN (SELECT Id 
                     FROM ProductTable 
                     WHERE Something = @something)

出错的地方是当我们尝试过滤日期时间时

当我在存储过程中使用以下内容时

DELETE FROM @total 
WHERE Number NOT IN (SELECT * 
                     FROM ProductTable 
                     WHERE DateTimeColumn > @ParameterDateTime)

如果我们在存储过程之外使用这个子查询,它会在几秒钟内工作。存储过程内部,耗时81500毫秒

我们尝试将with (nolock) 添加到表中,但这并没有改变任何东西。

在删除之前在临时表中添加所有内容,然后根据临时表删除确实有效。

SELECT PackagedProductId 
INTO #temp2 
FROM ProductTable WITH(NOLOCK) 
WHERE DateTimeColumn > @ParameterDateTime

DELETE FROM @total          
WHERE Number NOT IN (SELECT * FROM #temp2)

我的问题如下:

  • 为什么当我将它作为子查询放在 delete 语句中时需要 81500 毫秒,而在存储过程之外使用它时它会在几毫秒内工作?
  • 为什么我使用临时表可以正常工作?

如果您需要有关此主题的更多信息,请随时询问。

编辑:

DECLARE @total IntListType; --IntListType = User defined table type
CREATE TYPE [dbo].[IntListType] AS TABLE([Number] [int] NULL)

【问题讨论】:

  • 你能显示@total表的定义吗?

标签: sql-server performance stored-procedures subquery


【解决方案1】:

试一试

DELETE FROM @total  
WHERE NOT EXISTS (SELECT 1
                  FROM ProductTable 
                  WHERE Id = @total.Number 
                  AND Something = @something)

DELETE FROM @total  
WHERE NOT EXISTS (SELECT 1
                  FROM ProductTable 
                  WHERE Id = @total.Number 
                  AND DateTimeColumn > @ParameterDateTime)

【讨论】:

  • 我不是在寻找不同的方法.. 我在寻找它与临时表而不是子查询一起工作的原因
  • 在这种情况下,我建议你检查一下你的执行计划,并注意每一个 setp sql server 正在执行这个查询,看看哪里出错了。
  • 如果你不打算改变任何东西,你为什么要寻找原因?
  • 我们已经改变了一些东西,你可以在我的问题中看到。现在我正在尝试理解为什么.. sql server 的执行计划已经多次向我证明它是不正确的,因此我不会寄希望于这一点
  • 此外,您在问题中提供的信息量几乎足以为您提供获得相同结果的替代方法,但不足以实际诊断问题。
猜你喜欢
  • 1970-01-01
  • 2012-10-29
  • 2013-02-07
  • 2010-10-08
  • 2019-11-21
  • 1970-01-01
  • 2011-06-29
  • 2013-02-18
  • 2011-10-07
相关资源
最近更新 更多