복붙노트

[SQL] 기록이 존재하는 경우 가장 빠른 방법은 결정

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 및 제 2 쿼리 (이 대화를 ... 말 1) 동일한 결과를 반환합니다. ID가 테이블에없는 경우 마지막 쿼리는 예상대로 'TB100', 또는 아무것도를 반환합니다.

목적은 ID가 표에인지 여부를 파악하는 것입니다. 그렇지 않을 경우, 프로그램은 다음 레코드를 삽입합니다이 경우, 프로그램은 그것을 건너 뛰거나이 질문의 범위를 벗어난 다른 프로그램 로직을 기반으로 UPDATE 쿼리를 수행합니다.

어느 것이 더 빠르고 적은 오버 헤드를 가지고? (이 수십 프로그램 실행 당 수천 번으로 반복되며, 많은 시간을 하루에 실행됩니다).

합니다 (M $를 통해 자바에서 M $ SQL 서버에 대해이 쿼리를 실행하면 JDBC 드라이버를 제공)

해결법

  1. ==============================

    1.SELECT TOP 제품의 1 products.id WHERE products.id =; 이 첫 번째 레코드를 발견 한 후 실행이 종료됩니다 귀하의 제안을 모두 능가 할 것이다.

    SELECT TOP 제품의 1 products.id WHERE products.id =; 이 첫 번째 레코드를 발견 한 후 실행이 종료됩니다 귀하의 제안을 모두 능가 할 것이다.

  2. ==============================

    2.(또는 NOT EXISTS) 특별히 무언가가 최선의 선택이 존재하기 때문에해야한다 (이고) 경우 확인하기 위해 설계되었습니다 존재한다. 그것은이 TOP 절을 필요로하지 않도록 일치하는 첫 번째 행에 정지하고 열 크기의 오버 헤드는 없다 실제로 데이터를 선택하지 않습니다. 당신은 여기에 안전하게 SELECT *를 사용할 수 없습니다 - 다르지 SELECT 1, SELECT NULL 또는 SELECT AnyColumn보다 (당신도 SELECT 1/0 같은 잘못된 표현을 사용하고 휴식하지 않습니다).

    (또는 NOT EXISTS) 특별히 무언가가 최선의 선택이 존재하기 때문에해야한다 (이고) 경우 확인하기 위해 설계되었습니다 존재한다. 그것은이 TOP 절을 필요로하지 않도록 일치하는 첫 번째 행에 정지하고 열 크기의 오버 헤드는 없다 실제로 데이터를 선택하지 않습니다. 당신은 여기에 안전하게 SELECT *를 사용할 수 없습니다 - 다르지 SELECT 1, SELECT NULL 또는 SELECT 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
    
  3. ==============================

    3.아무것도 이길 수 있습니다 -

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

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

    당신은 테이블에 데이터가 있는지 알고 계산 할 필요가 없습니다. 때 필요하지 그리고 별칭을 사용하지 마십시오.

  4. ==============================

    4.

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

    이 방법은 당신을 위해 부울을 반환합니다.

  5. ==============================

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

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

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

    6.사람이 아직 언급했다 생각하지 말고 당신이 확실 데이터는 아래에 변경되지 않습니다, 당신은 또한 읽을 때이 차단되지 않았는지 NOLOCK 힌트를 적용 할 수 있습니다.

    사람이 아직 언급했다 생각하지 말고 당신이 확실 데이터는 아래에 변경되지 않습니다, 당신은 또한 읽을 때이 차단되지 않았는지 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
    
  7. ==============================

    7.

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

    이 모든 데이터베이스에서 작동 십자가 관계형 데이터베이스 솔루션입니다.

  8. ==============================

    8.다음은 레코드가 데이터베이스에 여부 존재하는지 확인하는 가장 간단하고 빠른 방법입니다 좋은 점은 모든 관계형 DB의 작품입니다

    다음은 레코드가 데이터베이스에 여부 존재하는지 확인하는 가장 간단하고 빠른 방법입니다 좋은 점은 모든 관계형 DB의 작품입니다

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

    9.

    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;
    
  10. ==============================

    10.나는 과거에 이것을 사용했습니다 그리고 무언가가 존재하는지 확인하기 위해 전체 테이블 스캔을 필요로하지 않습니다. 그것은 슈퍼 빨리 ...

    나는 과거에 이것을 사용했습니다 그리고 무언가가 존재하는지 확인하기 위해 전체 테이블 스캔을 필요로하지 않습니다. 그것은 슈퍼 빨리 ...

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

    11.MySQL의 또는 Oracle 배경에서이에 비틀 거리는 사람들을 위해 - 오라클 ROWNUM을 사용하는 반면 MySQL은, 기록의 제한된 수를 선택 LIMIT 절을 지원합니다.

    MySQL의 또는 Oracle 배경에서이에 비틀 거리는 사람들을 위해 - 오라클 ROWNUM을 사용하는 반면 MySQL은, 기록의 제한된 수를 선택 LIMIT 절을 지원합니다.

  12. from https://stackoverflow.com/questions/18114458/fastest-way-to-determine-if-record-exists by cc-by-sa and MIT license