레코드가 있는지 확인하는 가장 빠른 방법
제목에서 알 수 있듯이 ... 레코드가 테이블에 있는지 여부를 결정하기 위해 최소한의 오버 헤드로 가장 빠른 방법을 찾으려고합니다.
샘플 쿼리 :
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 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
아무것도 이길 수 없습니다-
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
'IT박스' 카테고리의 다른 글
Spring MVC에서 응답 컨텐츠 유형을 설정하는 사람 (@ResponseBody) (0) | 2020.07.13 |
---|---|
ngrok이 React dev 서버에 연결하려고 할 때 잘못된 호스트 헤더 (0) | 2020.07.13 |
Android 기기에서 수신 전화를 감지하는 방법은 무엇입니까? (0) | 2020.07.13 |
프래그먼트와 활동 모두에 정의 된 경우 onRequestPermissionsResult가 프래그먼트에서 호출되지 않습니다 (0) | 2020.07.13 |
EC2 인스턴스 내에서 지역 찾기 (0) | 2020.07.13 |