【发布时间】:2009-04-22 08:45:14
【问题描述】:
所以我在 SQL Server 存储过程中遇到了这个奇怪的问题。基本上我有这个漫长而复杂的过程。像这样的:
SELECT Table1.col1, Table2.col2, col3
FROM Table1 INNER JOIN Table2
Table2 INNER JOIN Table3
-----------------------
-----------------------
(Lots more joins)
WHERE Table1.Col1 = dbo.fnGetSomeID() AND (More checks)
-----------------------
-----------------------
(6-7 More queries like this with the same check)
问题是签入 WHERE 子句末尾 Table1.Col1 = dbo.fnGetSomeID()。函数 dbo.fnGetSomeID() 返回一个简单的整数值 1。因此,当我对函数调用应该是 SP 的值 1 进行硬编码时,只需要大约 15 秒。但是当我用 WHERE 子句中的那个函数调用替换它时,大约需要 3.5 分钟。
所以我这样做:
DECLARE @SomeValue INT
SET @SomeValue = dbo.fnGetSomeID()
--Where clause changed
WHERE Table1.Col1 = @SomeValue
所以现在这个函数只被调用一次。但还是一样的3.5分钟。所以我继续这样做:
DECLARE @SomeValue INT
--Removed the function, replaced it with 1
SET @SomeValue = 1
--Where clause changed
WHERE Table1.Col1 = @SomeValue
仍然需要 3.5 分钟。为什么会影响性能?以及如何让它消失?
【问题讨论】:
-
自行执行
dbo.fnGetSomeID()需要多长时间 -
但这应该没关系,因为我最后用硬编码值替换。
-
第二个应该更快。通常,您不希望 WHERE 子句中的函数,因为它们会针对结果集中的每个潜在行进行重新评估。
标签: sql sql-server sql-server-2005 stored-procedures