[sql] 레코드가 있는지 확인하는 가장 빠른 방법

제목에서 알 수 있듯이 … 레코드가 테이블에 있는지 여부를 결정하기 위해 가장 적은 오버 헤드로 가장 빠른 방법을 찾으려고합니다.

샘플 쿼리 :

SELECT COUNT(*) FROM products WHERE products.id = ?;

    vs

SELECT COUNT(products.id) FROM products WHERE products.id = ?;

    vs

SELECT products.id FROM products WHERE products.id = ?;

?가 바뀌 'TB100'었다고 가정하면 첫 번째 쿼리와 두 번째 쿼리 모두 정확히 동일한 결과 (예 : 1이 대화의 경우)를 반환합니다 . 마지막 쿼리는 'TB100'예상대로 반환 되거나 id테이블에 없는 경우 아무 것도 반환 하지 않습니다.

목적은 id테이블에 있는지 여부를 파악하는 것 입니다. 그렇지 않은 경우 프로그램은 다음에 레코드를 삽입합니다. 레코드가있는 경우 프로그램은이 질문의 범위를 벗어난 다른 프로그램 논리에 따라 레코드를 건너 뛰거나 UPDATE 쿼리를 수행합니다.

어느 것이 더 빠르고 오버 헤드가 적습니까? (이는 프로그램 실행마다 수만 번 반복되며 하루에 여러 번 실행됩니다).

(M $ 제공 JDBC 드라이버를 통해 Java에서 M $ SQL Server에 대해이 쿼리 실행)



답변

SELECT TOP 1 products.id FROM products WHERE products.id = ?; 첫 번째 레코드를 찾은 후 실행이 종료되므로 모든 제안을 능가합니다.


답변

EXISTS(또는 NOT EXISTS)는 무언가 존재하는지 확인하기 위해 특별히 고안되었으므로 최선의 선택이어야합니다. 일치하는 첫 번째 행에서 중지되므로 TOP절이 필요 하지 않으며 실제로 데이터를 선택하지 않으므로 열 크기에 오버 헤드가 없습니다. 안전하게 사용할 수 없습니다 SELECT *다르지을 – 여기 SELECT 1, SELECT NULLSELECT AnyColumn(당신도 같은 잘못된 표현을 사용 SELECT 1/0하고 휴식하지 않습니다) .

IF EXISTS (SELECT * FROM Products WHERE id = ?)
BEGIN
--do what you need if exists
END
ELSE
BEGIN
--do what needs to be done if not
END


답변

아무것도 이길 수 없습니다-

SELECT TOP 1 1 FROM products WHERE id = 'some value';

테이블에 데이터가 있는지 알 필요가 없습니다. 필요하지 않을 때는 별칭을 사용하지 마십시오.


답변

SELECT CASE WHEN EXISTS (SELECT TOP 1 *
                         FROM dbo.[YourTable]
                         WHERE [YourColumn] = [YourValue])
            THEN CAST (1 AS BIT)
            ELSE CAST (0 AS BIT) END

이 접근 방식은 부울을 반환합니다.


답변

당신은 또한 사용할 수 있습니다

 If EXISTS (SELECT 1 FROM dbo.T1 WHERE T1.Name='Scot')
    BEGIN
         --<Do something>
    END

ELSE
     BEGIN
       --<Do something>
     END


답변

아직 아무도 언급하지 않았다고 생각하지만 데이터가 변경되지 않을 것이라고 확신하는 경우 NoLock 힌트를 적용하여 읽을 때 차단되지 않도록 할 수도 있습니다.

SELECT CASE WHEN EXISTS (SELECT 1
                     FROM dbo.[YourTable] WITH (NOLOCK)
                     WHERE [YourColumn] = [YourValue])
        THEN CAST (1 AS BIT)
        ELSE CAST (0 AS BIT) END


답변

SELECT COUNT(*) FROM products WHERE products.id = ?;

이것은 모든 데이터베이스에서 작동하는 상호 관계형 데이터베이스 솔루션입니다.