IT박스

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

itboxs 2020. 7. 13. 21:42
반응형

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


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

샘플 쿼리 :

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 = ?;

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


다음은 레코드가 데이터베이스에 존재하는지 여부를 판별하는 가장 간단하고 빠른 방법입니다. 모든 관계형 DB에서 작동하는 것이 좋습니다.

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

create or replace procedure ex(j in number) as
i number;
begin
select id into i from student where id=j;
if i is not null then
dbms_output.put_line('exists');
end if;
exception
   when no_data_found then
        dbms_output.put_line(i||' does not exists');

end;

나는 이것을 과거에 사용했으며 무언가 존재하는지 확인하기 위해 전체 테이블 스캔이 필요하지 않습니다. 매우 빠릅니다 ...

UPDATE TableName SET column=value WHERE column=value
IF @@ROWCOUNT=0
BEGIN
     --Do work
END             

MySQL 또는 Oracle 배경 에서이 문제를 극복하는 사람들을 위해-MySQL은 LIMIT 절을 지원하여 제한된 수의 레코드를 선택하는 반면 Oracle은 ROWNUM을 사용합니다.

참고URL : https://stackoverflow.com/questions/18114458/fastest-way-to-determine-if-record-exists

반응형