3

我有一个computed column(函数)导致我的一个表非常慢(它的输出是我表中的一列。我认为这可能是我的函数中的一些逻辑语句。我将它们注释掉并返回一个名为'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
4

2 回答 2

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的是 no order by。当多行匹配时,您可以取回其中任何一个。通常,top与 一起使用order by

编辑:

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

create index idx_table_load_closing_paid on table(Load_id, Date_Closing, Date_Paid);
于 2013-07-31T19:01:02.007 回答
1

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

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

于 2013-07-31T19:03:45.580 回答