블로그 이미지
따시쿵

calendar

1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

Notice

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


결과 리포트





posted by 따시쿵
2014. 7. 22. 11:41 MSSQL

테이블에 랜덤 문자열을 저장하는 절차

CREATE TABLE [dbo].[Table_1](
	[SEQ] [int] NOT NULL,
	[USERID] [varchar](10) NULL
) 

데이타 100,000 건 입력하기

DECLARE @outer_index int
SET @outer_index = 1

WHILE @outer_index <= 100000
BEGIN

	DECLARE @rnd_num tinyint, @index int, @char char(1), @rndchar VARCHAR(10)
	SET @index = 1
	SET @rndchar = ''

	WHILE @index < 6
	BEGIN
		SET @rnd_num = convert( int, (rand() * 52)+1  )

		SET @char = SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',@rnd_num ,1)
		SET @rndchar = @rndchar + @char
			
		SET @index = @index + 1
	END

	INSERT INTO dbo.Table_1(SEQ, USERID) VALUES(@outer_index, @rndchar)
	
	SET @outer_index = @outer_index + 1
END


posted by 따시쿵