列中的SQL函数运行缓慢

时间:2013-07-31 18:57:20

标签: sql sql-server performance tsql function

我有一个computed column(函数)导致我的一个表非常慢(它的输出是我表中的一列。我认为它可能是我函数中的一些逻辑语句。我评论过那些out并且刚刚返回一个名为'test'的字符串。这仍然导致表变慢。我相信SELECT语句正在减慢函数。当我注释掉select语句时,一切都是樱桃。我我认为我没有以正确的方式使用函数。

FUNCTION [dbo].[Pend_Type](@Suspense_ID int, @Loan_ID nvarchar(10),@Suspense_Date datetime, @Investor nvarchar(10))
RETURNS nvarchar(20)
AS
BEGIN
DECLARE @Closing_Date Datetime, @Paid_Date Datetime
DECLARE @pendtype nvarchar(20)

--This is the issue!!!!
SELECT @Closing_Date = Date_Closing, @Paid_Date = Date_Paid from TABLE where Loan_ID = @Loan_ID

SET @pendtype = 'test'

--commented out logic

RETURN @pendtype
END

更新:

我有另一个computed column做类似的事情,是同一个表中的一列。这个跑得快。任何人都会看到为什么这会有所不同?

Declare @yOrn AS nvarchar(1)
IF((Select count(suspense_ID) From TABLE where suspense_ID = @suspenseID) = 0)
SET @yOrn = 'N'
ELSE
SET @yOrn = 'Y'
RETURN @yOrn

2 个答案:

答案 0 :(得分:3)

您已在select声明中隔离了性能问题:

SELECT TOP 1 @Closing_Date = Date_Closing, @Paid_Date = Date_Paid
from TABLE
where Loan_ID = @Loan_ID;

为了加快运行速度,请在table(Load_id, Date_Closing, Date_Paid)上创建综合索引。

顺便说一句,您使用top而没有order by。当多行匹配时,您可以返回其中任何一行。通常,toporder by一起使用。

编辑:

您可以通过发出以下命令来创建索引:

create index idx_table_load_closing_paid on table(Load_id, Date_Closing, Date_Paid);

答案 1 :(得分:1)

标量函数通常像游标一样执行,一次一行;这就是为什么它们很慢并且要避免。我不会像写的那样使用函数,而是会编写基于集合的版本。顺便提一下,没有按列排序的选择前1并不会总是给你相同的记录,通常是一个糟糕的做法。在这种情况下,我认为你会想要最新的日期或最早的日期。

在这种特殊情况下,我认为最好不要使用函数,而是使用派生表连接。