2017-05-23 6 views
1

이것은 salar fuction입니다. 나는 이것을 muliple 매개 변수로 저장 프로 시저에서 사용하고 있습니다. 작은 결과를 얻으려면 좋지만 큰 데이터의 경우 시간이 초과되고 긴 실행 시간이 필요합니다. 다른 대체 또는 일부 개선 사항을 공유하십시오.스칼라 함수가 저장 프로 시저에서 사용하는 동안 SQL Server에서 요청 시간 제한 문제가 발생합니다.

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 
      ([email protected]) 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 
      ([email protected]) AND 
      ([email protected]) and CASETIMELINEPEOPLE.isdeleted=0 

     END 

     SELECT @Assignees=SUBSTRING(@Assignees, 0,LEN(@Assignees)) 
     RETURN @Assignees 
END 
+1

SELECT를 향상시킬 대안이별로 없습니다. 테이블에 참조 된 필드의 일부 INDEX를 추가하면 도움이 될 수 있습니다. – Galcoholic

+0

당신은'WHERE COALESCE (TEMPLATETASKID, 0) = @ TASKID'에 의해 if/else를 피할 수 있습니다 (또는 조건에서 일반 OR) – joop

+0

감사합니다. Galcoholic. 색인 생성이 누락되었습니다 –

답변

3

인라인 테이블 값 함수를 사용하면 성능이 향상됩니다.

참조 :


이 스칼라 함수 t의 인라인 테이블 값 함수 버전입니다 모자는 stuff() with select ... for xml path ('') method of string concatenation 사용합니다.

create function dbo.fn_get_multiple_assigness_itvf (
    @timelineid int 
    , @milstoneid int 
    , @taskid int 
) returns table as return (
select Assignees = stuff((
    select ',' + firstname + ' ' + lastname 
    from casetimelinepeople ctp 
     inner join userdetail ud 
     on ctp.peopleuserid=ud.userid 
    where casetimelineid = @timelineid 
     and templatemilestoneid = @milstoneid 
     and (templatetaskid = @taskid 
     or (@taskid = 0 and templatetaskid is null) 
     ) 
     and ctp.isdeleted=0 
    for xml path (''), type).value('.','nvarchar(max)') 
    ,1,1,'') 
) 
go 

rextester 데모 : http://rextester.com/UZTJS46485

테스트 설정 :

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) 

반환

012 3,516,
+----------------------------------+ 
|   Assignees    | 
+----------------------------------+ 
| Some One,Avinash Raikwar,Sql Zim | 
+----------------------------------+ 

select * 
from dbo.fn_get_multiple_assigness_itvf(1,1,1) 

반환 :

+-------------------------+ 
|  Assignees  | 
+-------------------------+ 
| Avinash Raikwar,Sql Zim | 
+-------------------------+ 

쿼리의 각 행에 대해 함수를 호출 할 cross apply() 사용 :

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   | 
+----------------+--------------+---------------------+----------------+-----------+----------------------------------+ 
+1

Rob Farley의 기사가 우수합니다. 게시 해 주셔서 감사합니다. –

+0

@AlanBurstein 기쁘게 생각합니다! – SqlZim