【发布时间】: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