关于子查询和临时表的Sql性能问题

时间:2014-05-21 07:56:33

标签: sql-server performance stored-procedures subquery

我在一个声明中有一个关于子查询的非常奇怪的问题。

一点背景:

我们为我们的产品提供服务,我首先获得用户有权访问的所有产品。之后,我将过滤掉客户不想要的产品。

我使用参数化临时表和删除查询来实现这一点..

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

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)

1 个答案:

答案 0 :(得分:0)

放手一搏

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)