programing

Postgre에 행이 있는지 가장 빠르게 확인SQL

abcjava 2023. 5. 11. 21:00
반응형

Postgre에 행이 있는지 가장 빠르게 확인SQL

테이블에 삽입해야 할 행이 여러 개 있지만 이러한 삽입은 항상 일괄적으로 이루어집니다.따라서 배치의 단일 행이 테이블에 있는지 확인하고 싶습니다. 모든 행이 삽입되었음을 알기 때문입니다.

따라서 기본 키 검사는 아니지만 너무 중요하지는 않습니다.저는 한 줄만 확인하고 싶어서요.count(*)아마 좋지 않을 것이다, 그래서 그것은 약간.exists그런 것 같다.

하지만 저는 포스트그레가 꽤 생소하기 때문에.SQL 아는 사람들에게 물어보고 싶습니다.

내 배치에는 다음 구조의 행이 포함됩니다.

userid | rightid | remaining_count

따라서 테이블에 제공된 행이 포함된 경우userid그것은 그들 모두가 그곳에 있다는 것을 의미합니다.

TRUE/FALSE 반환에는 EXISTES 키워드를 사용합니다.

select exists(select 1 from contact where id=12)

간단히 말하면 다음과 같습니다.

select 1 from tbl where userid = 123 limit 1;

어디에123삽입하려는 배치의 사용자 ID입니다.

위 쿼리는 지정된 사용자 ID의 레코드가 있는지 여부에 따라 빈 집합 또는 단일 행을 반환합니다.

만약 이것이 너무 느린 것으로 판명된다면, 당신은 인덱스를 만드는 것을 조사할 수 있습니다.tbl.userid.

테이블에 배치의 행이 하나라도 있는 경우 모든 행이 삽입되었음을 확실히 알기 때문에 해당 행을 삽입할 필요가 없습니다.

프로그램이 배치 도중 중단되더라도 이 상태를 유지하려면 데이터베이스 트랜잭션을 적절하게 관리하는 것이 좋습니다(즉, 전체 배치가 단일 트랜잭션 내에 삽입됨).

INSERT INTO target( userid, rightid, count )
  SELECT userid, rightid, count 
  FROM batch
  WHERE NOT EXISTS (
    SELECT * FROM target t2, batch b2
    WHERE t2.userid = b2.userid
    -- ... other keyfields ...
    )       
    ;

BTW: 복제 시 전체 배치가 실패하기를 원한다면 (기본 키 제약 조건이 주어지면)

INSERT INTO target( userid, rightid, count )
SELECT userid, rightid, count 
FROM batch
    ;

성공하거나 실패하는 등 원하는 작업을 정확히 수행합니다.

성능을 고려할 때 다음과 같은 기능에서 "PERMPORY"를 사용할 수 있습니다.

 PERFORM 1 FROM skytf.test_2 WHERE id=i LIMIT 1;
  IF FOUND THEN
      RAISE NOTICE ' found record id=%', i;  
  ELSE
      RAISE NOTICE ' not found record id=%', i;  
 END IF;

@MikeM이 지적했듯이.

select exists(select 1 from contact where id=12)

인덱스가 접촉하면 일반적으로 시간 비용을 1ms로 줄일 수 있습니다.

CREATE INDEX index_contact on contact(id);
select true from tablename where condition limit 1;

이것은 postgres가 외부 키를 확인할 때 사용하는 쿼리라고 생각합니다.

귀사의 경우, 한 번에 다음과 같은 작업을 수행할 수 있습니다.

insert into yourtable select $userid, $rightid, $count where not (select true from yourtable where userid = $userid limit 1);
SELECT 1 FROM user_right where userid = ? LIMIT 1

결과 집합에 행이 포함되어 있으면 삽입할 필요가 없습니다.그렇지 않으면 레코드를 삽입합니다.

언급URL : https://stackoverflow.com/questions/7471625/fastest-check-if-row-exists-in-postgresql

반응형