2011-09-12 6 views
1

저장 프로 시저를 사용하여 데이터를 가져오고 동적으로 필터링해야했습니다. 예를 들어 id가 5, 10 또는 12 인 일부 데이터를 가져 오지 않으려는 경우 프로 시저에 문자열로 보내고 사용자 정의 함수를 통해 테이블로 변환합니다. 하지만 난 그래서 여기에 성능을 생각해 보자 예입니다해야합니다
사용자 정의 함수 및 성능 사용?

해결 방법 1 :

SELECT * 
FROM Customers 
WHERE CustomerID NOT IN (SELECT Value 
         FROM dbo.func_ConvertListToTable('4,6,5,1,2,3,9,222',',')); 

해결 방법 2 : 성능을 위해 더 나은 솔루션

CREATE TABLE #tempTable (Value NVARCHAR(4000)); 

INSERT INTO #tempTable 
     SELECT Value FROM dbo.func_ConvertListToTable('4,6,5,1,2,3,9,222',',') 

SELECT * 
    FROM BusinessAds 
    WHERE AdID NOT IN (SELECT Value FROM #tempTable) 

DROP TABLE #tempTable 

?

답변

2

당신은 아마 당신은 또한 TVF에 의해 반환 된 테이블에 클러스터 된 인덱스를 넣을 수 있습니다

CREATE TABLE #tempTable (Value int primary key); 
INSERT INTO #tempTable 
SELECT DISTINCT Value 
FROM dbo.func_ConvertListToTable('4,6,5,1,2,3,9,222',',') 

클러스터 된 인덱스와 적절한 데이터 형식을 가진 #temp 테이블을 생성 더 나을 것입니다.

더 나은 SQL Server는 #temp 테이블이 채워진 후 TVF가 다시 컴파일되지 않고 항상 1 행만 반환한다고 가정하므로이 가정이 해당 경우에 대해 최적의 쿼리 계획을 초래할 수 있는지 고려해야합니다. 목록이 큽니다.