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