2010-05-27 3 views
0

나는 모든 오랫동안 잘 실행이 (의사 코드) 같은 것을 간다 저장 프로 시저SQL Server 이외의 데이터베이스 엔진이 이런 식으로 동작합니까?

storedprocedure param1, param2, param3, param4 
    begin 
    if (param4 = 'Y') 
     begin 
      select * from SOME_VIEW order by somecolumn 
     end 
    else if (param1 is null) 
      begin 
      select * from SOME_VIEW 
       where (param2 is null or param2 = SOME_VIEW.Somecolumn2) 
       and (param3 is null or param3 = SOME_VIEW.SomeColumn3) 
      order by somecolumn 
      end 
    else 
      select somethingcompletelydifferent 
    end 

있습니다. Param4가 'Y'이면 갑자기 쿼리가 계속 실행되기 시작했습니다. 코드를 다음으로 변경하십시오.

storedprocedure param1, param2, param3, param4 
    begin 
    if (param4 = 'Y') 
     begin 
      set param2 = null 
      set param3 = null 
     end 
    if (param1 is null) 
      begin 
      select * from SOME_VIEW 
       where (param2 is null or param2 = SOME_VIEW.Somecolumn2) 
       and (param3 is null or param3 = SOME_VIEW.SomeColumn3) 
      order by somecolumn 
      end 
    else 
      select somethingcompletelydifferent 

그리고 예상되는 매개 변수 내에서 다시 실행됩니다 (40,000+ 레코드의 경우 15 초 정도). 이것은 내 질문의 요점은 SQL Server에 대한 특정이 특정 "기능", 또는이의 RDBMS 사이에서 일반적인 기능 '입니다 2005 SQL 서버 함께 일반적으로 그 : 이년 단지에 대해 잘 실행

  1. 쿼리 데이터가 커짐에 따라 작업을 중단하십시오.
  2. "새로운"실행 계획은 논리적으로 동일한 대안이 잘 실행 되더라도 데이터베이스 서버가 쿼리를 실행하는 기능을 파괴합니까?

이것은 SQL Server에 대한 호언 장담처럼 보일 수도 있지만 어느 정도는 그렇다고 생각하지만 다른 사람들이 Oracle, DB2 또는 다른 RDBMS에서 이런 종류의 현실을 경험하는지 실제로 알고 싶습니다. 다른 사람들과 약간의 경험을 쌓았지만 SQL Server에서는 이러한 종류의 복잡성과 복잡성 만 보았 기 때문에 복잡한 데이터베이스가있는 다른 사람들이 다른 제품과 비슷한 경험을 갖고 있는지 궁금합니다.

답변

4

두 가지 원인이있을 수 있습니다.

1) 통계는 최신입니까? 당신이 이런 종류의 물건에 대한 BTW

스니핑 매개 변수를 앓고 할 수

2)

(PARAM2가 null

또는 PARAM2 = SOME_VIEW.Somecolumn2)

Do you use [email protected] OR @Param IS NULL in your WHERE clause? Don't, it doesn't perform

에서보세요
+0

"all"데이터베이스에 문제가 생길 수 있습니다. 즉, 실행 계획은 데이터 증가/통계가 오래되었거나 dbms가 모든 데이터/문제를 처리하는 데 어려움이 있으므로 원숭이가 될 수 있습니다. – nos

+0

포인터를 보내 주셔서 감사합니다. 그러나이 경우에는 매개 변수가없는 직선 선택보다 성능이 뛰어나며 dynamicSQL 자체 문제가있을 수 있습니다. 그래서 우리는 사례별로 그것을 취합니다. – Yishai

1

이 문제의 특정 인스턴스를 상상할 수 있습니다. 이러한 상황을 초래하는 모든 조건은 SQL 서버에만 해당됩니다. (예 : SQL Server 2008은 다르게 동작합니다.)

그러나 이는 쿼리 최적화 프로그램의 일반적인 "기능"입니다. 그들은 귀하의 질의를보고 무엇이 가장 빨리 실행되는지에 대한 정보에 근거한 추측을 시도합니다. 옵티마이 저가 인덱스 스캔이나 인덱스 탐색을 선택하면 간접적으로 같은 것을 표현할 수있는 대안적인 방법을 제공하여 개선 된 실행 시간을 유도 하는지를 확인함으로써 사용자에게 직접적인 통제력이 거의 없습니다.

쿼리에 영향을 줄 수있는 다른 스키마 변경 사항이없는 경우 인덱스 통계가 업데이트되는지 확인하십시오. 우리는 일주일에 한번씩 배치 작업을 사용합니다.

+0

우리는 실제로 매주 업데이트합니다. 이러한 업데이트 이후 첫 번째 영업일에 문제가 나타 났으므로 업데이트가 모든 것을 설정했을 수 있습니다. – Yishai

관련 문제