2014. 7. 22. 11:41
MSSQL
SQL에서 차집합을 구하는 여러 연산에 대해서 실행시간 및 점유율, 페이지 읽는 수 등을 계산해 보았다. 결과는 같아도 과정이 틀려서 가장 최적화 된 쿼리를 찾아 보는데 의미가 있으며 이런 쿼리도 있구나라고 생각하면 된다.
전제조건
1. 테스트를 하기 위해서 임시 테이블을 앞글에서 TABLE_A, TABLE_B 를 만들고 USERID 필드를 만들고 랜덤한 캐릭터 5자리를 입력했다. 전체 데이타 개수는 100,000 건이고 연산은 TABLE_A 에만 있는 USERID 를 찾아내는 것이다. 결과는 99,204 건이다.
2. 결과 연산은 첫번째가 전체 7건에 대한 실행 계획 점유율(%)을 계산하고
두번째는 실행 시간을 계산(ms)하고
세번째는 SET STATISTICS IO ON 로 입출력 페이지 수 계산
차집합의 쿼리 유형
1. NOT IN 사용
2. NOT IN + 상관서브쿼리
3. NOT IN + 상관서브쿼리+ TOP 1
4. NOT EXISTS + 상관서브쿼리+ TOP 1
5. 상관 서브쿼리+ TOP 1 + IS NULL
6. LEFT OUTER JOIN + IS NULL
7. OUTER APPLY + IS NULL
1. NOT IN 사용
가장 일반적이고 쉽고 자주 사용하는 쿼리문이다. 그러나 가장 성능이 낮은 쿼리문이다.SELECT * FROM dbo.Table_A WHERE USERID NOT IN (SELECT USERID FROM dbo.Table_B)
2. NOT IN + 상관서브쿼리
수학 차집합 이용 : A - B = A - (A ∩ B)SELECT * FROM dbo.Table_A AS A WHERE A.USERID NOT IN (SELECT USERID FROM dbo.Table_B AS B WHERE A.USERID = B.USERID)
3. NOT IN + 상관서브쿼리+ TOP 1
TOP을 이용한 퀴리도 있구나 !!!SELECT * FROM dbo.Table_A AS A WHERE A.USERID NOT IN (SELECT TOP 1 USERID FROM dbo.Table_B AS B WHERE A.USERID = B.USERID)
4. NOT EXISTS + 상관서브쿼리+ TOP 1
SELECT * FROM dbo.Table_A AS A WHERE NOT EXISTS (SELECT TOP 1 USERID FROM dbo.Table_B AS B WHERE A.USERID = B.USERID)
5. 상관 서브쿼리+ TOP 1 + IS NULL
SELECT * FROM dbo.Table_A AS A WHERE (SELECT TOP 1 USERID FROM dbo.Table_B AS B WHERE A.USERID = B.USERID) IS NULL
6. LEFT OUTER JOIN + IS NULL
SELECT * from dbo.Table_A AS A LEFT OUTER JOIN dbo.Table_B AS B ON A.USERID = B.USERID where B.USERID IS NULL
7. OUTER APPLY + IS NULL
SELECT * from dbo.Table_A AS A OUTER APPLY (SELECT TOP 1 USERID FROM dbo.Table_B AS B WHERE A.USERID = B.USERID) AS B WHERE B.USERID IS NULL
결과 리포트
'MSSQL' 카테고리의 다른 글
다른 SQL Server로 TDE 보호 데이터베이스 이동 (0) | 2014.07.22 |
---|---|
테이블별 데이터 개수, 인덱스 사이즈, 생성일, 마지막 수정일을 알고 싶을때... (0) | 2014.07.22 |
모든 데이타베이스 숨기기 (0) | 2014.07.22 |
랜덤 쿠폰 번호와 순차적 쿠폰 번호 발행하기 (0) | 2014.07.22 |
랜덤 알파펫 조합하기 (0) | 2014.07.22 |