3

배경 :SQL 서버 계산 열은 간단한 select 문에 성능이 둔화되고

가 이전에, 우리 회사는 저장 프로 시저의 where 절에 인코딩을 일부 데이터를 HTML로 사용자 정의 함수를 사용하고 있었다. 아래 예 :

DECLARE @LName --HTML encoded last name as input parameter from user 

SELECT * 
    FROM (SELECT LName 
      FROM SomeView xtra 
     WHERE ((@LName <> '' 
       AND dbo.EncodingFunction(dbo.DecodingFunction(xtra.LName)) = @LName) 
      OR @Lname='')) 

나는 이것을 명확하게하기 위해 단순화했다.

이 쿼리를 사용하는 저장 프로 시저가 빠르게 연속해서 45 번 호출되면 62,000 개의 레코드가있는 테이블의 평균 성능은 약 85 초입니다. UDF를 제거하면 성능이 1 초 이상으로 향상되어 sproc을 45 번 실행합니다.

그래서 우리는 뷰에 의해 액세스 된 테이블에 계산 열을 포함하는 솔루션을 참조하고 결정했습니다. SomeView. 계산 된 열은 같은 테이블 정의로 작성되었습니다 :

[LNameComputedColumn] AS (dbo.EncodingFunction(dbo.DecodingFunction([LName]))) 

나는 다음 테이블을 업데이트하고 자동으로 채워 프로세스를 실행하는 모든 62,000 레코드에 대한 계산 된 열입니다. 그럼 다음에 저장 프로 시저 쿼리를 변경 :

DECLARE @LName --HTML encoded last name as input parameter from user 

SELECT * FROM 
     (SELECT LNameComputedColumn 
     FROM SomeView xtra 
     WHERE ((@LName <> '' AND [email protected]) OR @Lname='') 

내가 저장 프로 시저, 45 개 실행의 평균 실행 시간은 약 90 초로 증가 있음을 실행합니다. 내 변화는 실제로 문제를 악화 시켰습니다!

내가 뭘 잘못하고 있니? 성능을 향상시킬 수있는 방법이 있습니까? 보조 노트로

, 우리는 현재 SQL Server 2000을 사용하고 곧 2008 R2로 업그레이드 할 계획하지만, 모든 코드는 Q 2000

+0

은'OR'의 포인트는 무엇인가 : 당신이 원하는 것은 계산 된 물리적으로 테이블에 삽입시에 계산되고 저장된다 열을 지속입니까? 'OR @LName = '''은 테이블에서 아무것도 얻지 못하기 때문입니다. 너무 많은 것을 추상화하면 모든 사람의 시간을 낭비 할뿐입니다. 우리가 모르는 것에 대해서는 설명 할 수 없습니다. –

답변

3

SQL 서버에서 작동해야합니다 MS SQL 계산 된 열은

... 실적 둔화 : 말 하키)

... where @LName <> '' ... 

Q를 : 당신은 "전체 테이블 스캔"을 말할 수 있습니까?

귀하의 기능이 이 아닙니다.은 비쌉니다. 하지만 실제로 손가락을 가리 키기 전에 더 "선택적인"where 절을 만들어야합니다. ...

IMHO ...

SUGGESTION :

  1. 쿼리 데이터 (모든 관련 "LNAME의"를 얻을 )

  2. 결과 (단지 선택 "Lnames"에 함수를 실행 - 나는 가정, , 은 전체보기 또는 테이블의 모든 행에이 아닙니다.

  3. 저장된 프로에서 두 가지 작업 (쿼리와 필터, 그리고 후 처리)을 수행합니다 계산은 추가 cedure

8

가상 열이 선택된 행의 모든 ​​실행에서 계산을 생성한다.

[LNameComputedColumn] 
    AS (dbo.EncodingFunction(dbo.DecodingFunction([LName]))) PERSISTED