ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [데이터베이스] MSSQL 난수(random data)
    데이터베이스와 SQL 2022. 10. 22. 14:07

    랜덤 데이터 생성 함수

     

    1) RAND([seed]) 함수 (부동소수점, 0~1 사이의 값 중 생성)

    • 쿼리 당 호출
    • 정확한 의미의 난수 값은 아님 => Pseudo Random 값
    • 동일 seed 에 동일한 결과로 동일 순서로 생성됨 
    SELECT RAND (); 
    
    -- RAND() 함수는 쿼리당 한번 호출 (행 단위가 아님)
    SELECT TOP (5) object_id
    FROM sys.objects
    ORDER BY RAND();
    
    -- 초기 값에 대해 반환된 결과는 항상 동일함
    SELECT RAND(3);
    
    -- 한 connection에 대해 seed 를 지정하게 되면, 모든 후속은 최초 RAND()를 바탕으로 생성
    SELECT RAND(3), RAND(), RAND(); 
    
    -- 최종 1~ 최대값
    SELECT CAST(RAND() * 1000 AS int) + 1

     

    2) NEWID() 함수

    • uniqueidentifier 형의 고유값 생성 (16byte의 GUID 값)
    • 행 단위 호출
    • 좀 더 단순한 형태로 변환해서 사용 => CHECKSUM(NEWID()) 를 사용하여 -21~+21억 (int) 해시값 반환
    SELECT NEWID ();
    
    SELECT CHECKSUM(NEWID()); -- -21억 ~ 21억 (int)의 해시값 반환
    
    -- 1 ~ maxNum 범위의 랜덤 값 생성하기
    DECLARE @maxNum	int = 10000;
    SELECT ABS(CHECKSUM(NEWID())) % @maxNum + 1;
    
    SELECT TOP (5) productID
    FROM dbo.Products
    ORDER BY CHECKSUM(NEWID());

     

    3) 기타 방법

    • TABLESAMPLE
    • 행 단위 샘플링 알고리즘 응용

    TABLESAMPLE 절

    구문

    SELECT * 
    FROM table_name
    TABLESAMPLE [SYSTEM] (sample_number [PERCENT | ROWS] )
    [REPEATABLE (repeat_seed)]

    기능

    • 테이블에서 샘플 데이터 생성 지원 -> 원하는 데이터만큼 샘플링으로 반환
    • 반환 행 수를 제한 (N rows -> N percent)
    • [SYSTEM] 옵션 -> 데이터 page 별로 랜덤 값을 생성하고 그 중에 지정된 비율의 page를 선택 후 전체 행 반환
    • 적용 가능한 시나리오
      • 샘플링이 꼭 개별 행 수준에서 중복 데이터가 나와도 되는 경우에 활용할 수 있음
      • page 와 row의 독립성이 없음

    주의사항 ! 

    • 테이블 행 수가 충분하지 않은 경우에, 지정한 행 수의 반환을 보장하지 못한다
    • 조인이 포함된 경우에 결과 집합 일관성 문제가 발생 할 수 있다. 
    SELECT TOP(20) *
    FROM dbo.Orders TABLESAMPLE(200 ROWS); -- 테이블의 page를 선택하고 그 중에서 값 반환
    
    
    SELECT TOP(5) *
    FROM dbo.Orders TABLESAMPLE(200 ROWS)
    	REPEATABLE (100); -- 동일한 값에 대해서는 동일한 데이터가 리턴되도록 함
    
    SELECT TOP(5) *
    FROM dbo.Orders TABLESAMPLE(200 ROWS)
    	REPEATABLE (100);

     

    반응형

    댓글

Designed by Tistory.