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
'programing' 카테고리의 다른 글
Swift에 액세스 수식어가 있습니까? (0) | 2023.05.11 |
---|---|
AKS(Azure Managed Kubernetes)에서 모든 컴퓨팅을 중지 (0) | 2023.05.11 |
어떻게 f-string 평가를 연기/연기합니까? (0) | 2023.05.11 |
Git를 사용하여 모든 분기에서 문자열을 검색하려면 어떻게 해야 합니까? (0) | 2023.05.06 |
Xcode 빌드 설정에서 "아키텍처"와 "유효한 아키텍처"의 차이점은 무엇입니까? (0) | 2023.05.06 |