Sql server 在存储过程中使用时,SQL Server中出现标量函数请求超时问题
这是撒拉函数。我在具有多个参数的存储过程中使用它。对于小的结果来说是好的,但是对于大数据来说,它会超时,并且需要很长的执行时间。请分享一些其他替代或一些增强功能Sql server 在存储过程中使用时,SQL Server中出现标量函数请求超时问题,sql-server,tsql,stored-functions,Sql Server,Tsql,Stored Functions,这是撒拉函数。我在具有多个参数的存储过程中使用它。对于小的结果来说是好的,但是对于大数据来说,它会超时,并且需要很长的执行时间。请分享一些其他替代或一些增强功能 ALTER FUNCTION [dbo].[FNGETMULIPLEASSIGNESS_NEW2] ( @TIMELINEID INT, @MILSTONEID INT, @TASKID INT ) RETURNS varchar(max) AS BEGIN DECLARE @Assignees var
ALTER FUNCTION [dbo].[FNGETMULIPLEASSIGNESS_NEW2]
(
@TIMELINEID INT,
@MILSTONEID INT,
@TASKID INT
)
RETURNS varchar(max)
AS
BEGIN
DECLARE @Assignees varchar(max)='', @isExists bit=0
if(@TASKID=0)
BEGIN
Select @Assignees = @Assignees+ FIRSTNAME +' ' + LASTNAME+', '
FROM CASETIMELINEPEOPLE
INNER JOIN USERDETAIL ON
CASETIMELINEPEOPLE.PEOPLEUSERID=USERDETAIL.USERID
WHERE (CASETIMELINEID= @TIMELINEID) AND
(TEMPLATEMILESTONEID=@MILSTONEID) AND
(TEMPLATETASKID is null) and CASETIMELINEPEOPLE.isdeleted=0
END
else
BEGIN
Select @Assignees = @Assignees+ FIRSTNAME +' ' + LASTNAME+','
FROM CASETIMELINEPEOPLE
INNER JOIN USERDETAIL ON
CASETIMELINEPEOPLE.PEOPLEUSERID=USERDETAIL.USERID
WHERE (CASETIMELINEID= @TIMELINEID) AND
(TEMPLATEMILESTONEID=@MILSTONEID) AND
(TEMPLATETASKID=@TASKID) and CASETIMELINEPEOPLE.isdeleted=0
END
SELECT @Assignees=SUBSTRING(@Assignees, 0,LEN(@Assignees))
RETURN @Assignees
END
使用内联表值函数将提高性能 参考:
以下是标量函数的内联表值函数版本,它使用: rextester演示: 测试设置:
create table casetimelinepeople (
casetimelineid int
, peopleuserid int
, templatemilestoneid int
, templatetaskid int
, isdeleted bit not null default 0
);
insert into casetimelinepeople values
(1,1,1,null,0)
,(1,2,1,null,0)
,(1,3,1,null,0)
,(1,2,1,1,0)
,(1,3,1,1,0)
create table userdetail (
userid int not null
, firstname varchar(32) not null
, lastname varchar(32) not null);
insert into userdetail values
(1, 'Some', 'One')
,(2, 'Avinash', 'Raikwar')
,(3, 'Sql','Zim');
go
查询内联表值函数,如下所示:
select *
from dbo.fn_get_multiple_assigness_itvf(1,1,0)
返回
+----------------------------------+
| Assignees |
+----------------------------------+
| Some One,Avinash Raikwar,Sql Zim |
+----------------------------------+
返回:
+-------------------------+
| Assignees |
+-------------------------+
| Avinash Raikwar,Sql Zim |
+-------------------------+
用于为查询中的每一行调用函数:
select *
from casetimelinepeople ctp
cross apply dbo.fn_get_multiple_assigness_itvf(
ctp.casetimelineid
, ctp.templatemilestoneid
, ctp.templatetaskid
) x
返回:
+----------------+--------------+---------------------+----------------+-----------+----------------------------------+
| casetimelineid | peopleuserid | templatemilestoneid | templatetaskid | isdeleted | Assignees |
+----------------+--------------+---------------------+----------------+-----------+----------------------------------+
| 1 | 1 | 1 | NULL | False | Some One,Avinash Raikwar,Sql Zim |
| 1 | 2 | 1 | NULL | False | Some One,Avinash Raikwar,Sql Zim |
| 1 | 3 | 1 | NULL | False | Some One,Avinash Raikwar,Sql Zim |
| 1 | 2 | 1 | 1 | False | Avinash Raikwar,Sql Zim |
| 1 | 3 | 1 | 1 | False | Avinash Raikwar,Sql Zim |
+----------------+--------------+---------------------+----------------+-----------+----------------------------------+
我认为没有太多的替代方案来改进选择。也许通过引用字段向表中添加一些索引会有所帮助。通过
WHERE COALESCE(TEMPLATETASKID,0)=@TASKID
(或者只是一个普通的或处于条件中的)可以避免if/else。索引缺失,罗布·法利的文章非常优秀。谢谢你发布。@AlanBurstein很高兴你喜欢它!
select *
from casetimelinepeople ctp
cross apply dbo.fn_get_multiple_assigness_itvf(
ctp.casetimelineid
, ctp.templatemilestoneid
, ctp.templatetaskid
) x
+----------------+--------------+---------------------+----------------+-----------+----------------------------------+
| casetimelineid | peopleuserid | templatemilestoneid | templatetaskid | isdeleted | Assignees |
+----------------+--------------+---------------------+----------------+-----------+----------------------------------+
| 1 | 1 | 1 | NULL | False | Some One,Avinash Raikwar,Sql Zim |
| 1 | 2 | 1 | NULL | False | Some One,Avinash Raikwar,Sql Zim |
| 1 | 3 | 1 | NULL | False | Some One,Avinash Raikwar,Sql Zim |
| 1 | 2 | 1 | 1 | False | Avinash Raikwar,Sql Zim |
| 1 | 3 | 1 | 1 | False | Avinash Raikwar,Sql Zim |
+----------------+--------------+---------------------+----------------+-----------+----------------------------------+