我有一个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
答案 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
。当多行匹配时,您可以返回其中任何一行。通常,top
与order by
一起使用。
编辑:
您可以通过发出以下命令来创建索引:
create index idx_table_load_closing_paid on table(Load_id, Date_Closing, Date_Paid);
答案 1 :(得分:1)
标量函数通常像游标一样执行,一次一行;这就是为什么它们很慢并且要避免。我不会像写的那样使用函数,而是会编写基于集合的版本。顺便提一下,没有按列排序的选择前1并不会总是给你相同的记录,通常是一个糟糕的做法。在这种情况下,我认为你会想要最新的日期或最早的日期。
在这种特殊情况下,我认为最好不要使用函数,而是使用派生表连接。