programing

데이터베이스 테이블의 임의 레코드 (T-SQL)

nasanasas 2020. 10. 7. 07:44
반응형

데이터베이스 테이블의 임의 레코드 (T-SQL)


SQL Server 테이블에서 임의의 레코드를 검색하는 간결한 방법이 있습니까?

내 단위 테스트 데이터를 무작위로 만들고 싶으므로 테이블에서 임의의 ID를 선택하는 간단한 방법을 찾고 있습니다. 영어에서 선택은 "ID가 테이블의 가장 낮은 ID와 테이블의 가장 높은 ID 사이의 임의의 숫자 인 테이블에서 하나의 ID를 선택하십시오."입니다.

쿼리를 실행하고 null 값을 테스트 한 다음 null 인 경우 다시 실행하지 않고는이를 수행하는 방법을 알아낼 수 없습니다.

아이디어?


SQL Server 테이블에서 임의의 레코드를 검색하는 간결한 방법이 있습니까?

SELECT TOP 1 * FROM table ORDER BY NEWID()

설명

A NEWID()가 각 행에 대해 생성되고 테이블이 정렬됩니다. 첫 번째 레코드 (즉, GUID가 "가장 낮은"레코드)가 반환됩니다.

메모

  1. GUID는 버전 4부터 의사 난수로 생성됩니다.

    버전 4 UUID는 진정한 난수 또는 의사 난수에서 UUID를 생성하기위한 것입니다.

    알고리즘은 다음과 같습니다.

    • clock_seq_hi_and_reserved의 최상위 비트 2 개 (비트 6 및 7)를 각각 0과 1로 설정합니다.
    • time_hi_and_version 필드의 최상위 4 비트 (비트 12 ~ 15)를 섹션 4.1.3의 4 비트 버전 번호로 설정합니다.
    • 다른 모든 비트를 무작위로 (또는 의사 무작위로) 선택한 값으로 설정합니다.

    UUID (Universally Unique IDentifier) ​​URN 네임 스페이스-RFC 4122

  2. 대안 SELECT TOP 1 * FROM table ORDER BY RAND()은 생각대로 작동하지 않습니다. RAND()쿼리 당 하나의 단일 값을 반환하므로 모든 행이 동일한 값을 공유합니다.

  3. GUID 값은 의사 난수이지만 더 까다로운 응용 프로그램에는 더 나은 PRNG가 필요합니다.

  4. 일반적인 성능은 약 1,000,000 행에 대해 10 초 미만입니다. 물론 시스템에 따라 다릅니다. 인덱스에 도달하는 것은 불가능하므로 성능이 상대적으로 제한됩니다.


더 큰 테이블 TABLESAMPLE에서는 전체 테이블을 스캔하지 않도록이를 위해 사용할 수도 있습니다 .

SELECT  TOP 1 *
FROM YourTable
TABLESAMPLE (1000 ROWS)
ORDER BY NEWID()

ORDER BY NEWID여전히 데이터 페이지에서 먼저 표시 만 반환 행을 방지하기 위해 필요합니다.

사용할 수는 테이블의 크기와 정의에 따라 신중하게 선택해야하며 행이 반환되지 않으면 재시도 논리를 고려할 수 있습니다. 이 기술의 배후에있는 수학 및 기술이 작은 테이블에 적합하지 않은 이유가 여기에서 설명됩니다.


또한 MIN (Id)과 MAX (Id) 사이의 임의의 ID를 얻는 방법을 시도한 다음

SELECT TOP 1 * FROM table WHERE Id >= @yourrandomid

항상 한 행을 얻습니다.


대용량 데이터를 선택하려는 경우 내가 아는 가장 좋은 방법은 다음과 같습니다.

SELECT * FROM Table1
WHERE (ABS(CAST(
    (BINARY_CHECKSUM
    (keycol1, NEWID())) as int))
    % 100) < 10

출처 : MSDN


나는 내가 시도한 방법을 개선하기 위해이 게시물을 보았습니다. 나는 그것이 오래되었다는 것을 알고 있지만이 방법은 나열되지 않았습니다. 테스트 데이터를 만들고 적용하고 있습니다. 이것은 @st (두 문자 상태)로 호출 된 SP에서 "주소"에 대한 방법을 보여줍니다.

Create Table ##TmpAddress (id Int Identity(1,1), street VarChar(50), city VarChar(50), st VarChar(2), zip VarChar(5))
Insert Into ##TmpAddress(street, city, st, zip)
Select street, city, st, zip 
From tbl_Address (NOLOCK)
Where st = @st


-- unseeded RAND() will return the same number when called in rapid succession so
-- here, I seed it with a guaranteed different number each time. @@ROWCOUNT is the count from the most recent table operation.

Set @csr = Ceiling(RAND(convert(varbinary, newid())) * @@ROWCOUNT)

Select street, city, st, Right(('00000' + ltrim(zip)),5) As zip
From ##tmpAddress (NOLOCK)
Where id = @csr

참고 URL : https://stackoverflow.com/questions/191342/random-record-from-a-database-table-t-sql

반응형