블로그 이미지
따시쿵

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

'분류 전체보기'에 해당되는 글 113

  1. 2014.07.22 랜덤 쿠폰 번호와 순차적 쿠폰 번호 발행하기
  2. 2014.07.22 차집합 구하기
  3. 2014.07.22 랜덤 알파펫 조합하기
2014. 7. 22. 11:42 MSSQL

1. 랜덤 쿠폰 번호 발행하기

NEWID() 함수를 이용한 방법을 소개하도록 하겠다.

먼저 NEWID() 함수의 속성부터 알아보도록 하자.

1. NEWID() 는 uniqueidentifier 데이타 형식을 가진다.
2. GUID(전역 고유 식별자) 역할을 하는 16바이트 이진 값을 저장한다.
3. GUID는 고유한 이진 숫자 값이다.
4. 전 세계 모든 컴퓨터는 고유한 GUID 값을 생성한다.
5. GUID의 주된 용도는 여러 사이트에 많은 컴퓨터가 있는 네트워크에서 고유한 식별자를 지정하는 것이다.

실제 SQL 문에서 실행되는 예제를 보도록 하자.

DECLARE @NEWID_TEMP VARCHAR(255)
SET @NEWID_TEMP = NEWID()

SELECT @NEWID_TEMP 
SELECT CONVERT(VARBINARY(255), @NEWID_TEMP)

/*****************************************************************************************
문자열 형식 : ABD26C1E-3781-405E-9D77-4B947DD7CBD0
이진 형식 : 0x41424432364331452D333738312D343035452D394437372D344239343744443743424430
*******************************************************************************************/ 


NEWID 를 이용한 전체 소스 코드임...

SET NOCOUNT ON

DECLARE @MAX_COUNT INT
DECLARE @INDEX INT
DECLARE @COUPON_NUM VARCHAR(10)
DECLARE @COUPON_TYPE VARCHAR(10)
DECLARE @COUPON_PREFIX VARCHAR(10)

SET @MAX_COUNT = 1000
SET @INDEX = 1
SET @COUPON_PREFIX = 'L'
SET @COUPON_TYPE = 'C_TYPE'

WHILE @INDEX <= @MAX_COUNT
BEGIN

	SET @COUPON_NUM = LEFT(REPLACE(NEWID(),'-',''), 10)
						
	INSERT INTO dbo.Dior_Coupon_201104 (COUPON_TYPE, COUPON_NUM)
	VALUES (@COUPON_TYPE, @COUPON_NUM)
	
	SET @INDEX = @INDEX + 1
END


2. 순차적 쿠폰번호 발행하기 

쿠폰 번호를 발행하는데 순자적으로, 즉 ETP0001, ETP0002 ,ETP0003 식으로 발행하는 것을 해 보자.

키 포인트는 숫자를 문자열로 변환하면서 자릿수를 맞추어줘야 한다. 이때 사용하는 함수가 REPLCATE 함수를 이용하면 된다.
전제 소스는 아래와 같다.

SET NOCOUNT ON

DECLARE @MAX_COUNT INT
DECLARE @INDEX INT
DECLARE @COUPON_NUM VARCHAR(10)
DECLARE @COUPON_TYPE VARCHAR(10)
DECLARE @COUPON_PREFIX VARCHAR(10)

SET @MAX_COUNT = 1000
SET @INDEX = 1
SET @COUPON_PREFIX = 'L'
SET @COUPON_TYPE = 'C_TYPE'

WHILE @INDEX <= @MAX_COUNT
BEGIN

	SET @COUPON_NUM = @COUPON_PREFIX + 
                          REPLICATE('0', 4 - DATALENGTH(CONVERT(VARCHAR(4),@INDEX))) + 
                          CONVERT(VARCHAR(4),@INDEX)
						
	INSERT INTO dbo.Dior_Coupon_201104 (COUPON_TYPE, COUPON_NUM)
	VALUES (@COUPON_TYPE, @COUPON_NUM)
	
	SET @INDEX = @INDEX + 1
END


 

posted by 따시쿵
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 따시쿵