2012-11-22 2 views
1

위로 가기 100 초로 aprox 2 초를 수행하는 쿼리를 만들었습니다.이 정확한 쿼리의 저장 프로 시저를 만들면 실행하는 데 12-13 초가 걸립니다.쿼리가 저장 프로 시저보다 훨씬 느립니다?

왜 그런가요?

  • 요소 나타난 횟수 = 2,309,015는 (사용자 ID로 지정한 = 326,969)
  • 일치 나타난 횟수 = 1,290 (사용자 ID로 지정한 = 498)
  • 사이트에 나타난 카운트 = 71 (사용자 ID로 지정한 = 9)

코드

with search (elementid, siteid, title, description, site, link, addeddate) 
as 
(
    select top(@top) 
     elementid, 
     elements.siteid, title, elements.description, 
     site = 
      case sites.description 
       when '' then sites.name 
       when null then sites.name 
       else sites.name + ' (' + sites.description + ')' 
      end, 
     elements.link, 
     elements.addeddate 
    from elements 
     left join sites on elements.siteid = sites.siteid 
    where title like @search and sites.userid = @userid 
    order by addeddate desc 
) 
select search.*, isnull(matches.elementid,0) as ismatch 
from search 
    left join matches on matches.elementid = search.elementid 
+0

는 쿼리 실행 계획을 보았다 된 문제가 있습니다? –

+0

"aprox를 2 초 동안 수행하는 쿼리를 만들었습니다.이 정확한 쿼리의 저장 프로 시저를 만들면 실행하는 데 12-13 초가 걸립니다."다음은 저장 프로 시저가 쿼리보다 훨씬 느립니다. –

+0

@HamletHakobyan 나는 이해하지 못한다. sp는 느리다. 예. (지금 실행 계획을 점검한다.) –

답변

0

코드없이, 난 단지 추측 할 수있다. 샘플 질의를 작성할 때, 상수 where 절과 두 번째 캐쉬가 있습니다. 저장 프로 시저에서는 where 절의 상수를 기반으로 쿼리 계획을 캐싱하거나 최적화 할 기회가 없습니다. 내가

먼저 하나를 시도 같이 당신의 SP를 작성하는 두 가지 방법을 제안 할 수

+0

왜 차이가 있는지 이해할 수 없습니다. 저장 프로 시저를 실행할 때 다음과 같이 실행합니다. exec web_storedprocedure 1, 100, '% searchphrase %'. 이것은 느린 것, 아무 것도 캐시하지 않은 저장 프로 시저입니다 ...쿼리가 느린 것일 경우 나는 그것을 이해했을 것이다 ... –

0

:

create procedure sp_search 
(
    @top int, 
    @search nvarchar(max), 
    @userid int 
) 
as 
begin 
    declare @p_top int, @p_search nvarchar(max), @p_userid int 

    select @p_top = @top, @p_search = @search, @p_userid = @userid 

    with search (elementid, siteid, title, description, site, link, addeddate) 
    as 
    (
     select top(@p_top) 
      elementid, 
      elements.siteid, title, elements.description, 
      site = 
      case sites.description 
       when '' then sites.name 
       when null then sites.name 
       else sites.name + ' (' + sites.description + ')' 
      end, 
      elements.link, 
      elements.addeddate 
     from elements 
      left join sites on elements.siteid = sites.siteid 
     where title like @p_search and sites.userid = @p_userid 
     order by addeddate desc 
    ) 
    select search.*, isnull(matches.elementid,0) as ismatch 
    from search 
     left join matches on matches.elementid = search.elementid 
end 

두 번째, 당신이 만들 때 그것을 SP 인라인 테이블 함수를

create function sf_search 
(
    @top int, 
    @search nvarchar(max), 
    @userid int 
) 
returns table 
as 
return 
(
    with search (elementid, siteid, title, description, site, link, addeddate) 
    as 
    (
     select top(@top) 
      elementid, 
      elements.siteid, title, elements.description, 
      site = 
      case sites.description 
       when '' then sites.name 
       when null then sites.name 
       else sites.name + ' (' + sites.description + ')' 
      end, 
      elements.link, 
      elements.addeddate 
     from elements 
      left join sites on elements.siteid = sites.siteid 
     where title like @search and sites.userid = @userid 
     order by addeddate desc 
    ) 
    select search.*, isnull(matches.elementid,0) as ismatch 
    from search 
     left join matches on matches.elementid = search.elementid 
) 
+0

나는 그 매개 변수 스니핑이 일반적으로 조언되었다고 생각하지 않았다? 나는 이것을 한 많은 단점을 읽었다 (당신이 게시 한 sp와 관련) – Ric

1

를 사용 컴파일되고 저장되며 SP에 결과가 필터링되는 매개 변수가있을 때 옵티마이 저가 실행시 전달할 값을 알지 못하면 33 % 선택으로 간주하고 이에 따라 계획을 만듭니다. 쿼리를 실행하면 값이 제공되고 최적화 프로그램은이 값에 따라 실행 계획을 만듭니다. 분명히 계획은 다르다.

0

비슷한 질문 here

는 저장된 프로 시저 선언 SET ANSI_NULLS OFF

관련 문제