레코드가 존재하는지 여부를 확인하는 가장 빠른 방법
제목에서 알 수 있듯이...테이블에 레코드가 있는지 여부를 판단하기 위해 오버헤드를 최소화하고 가장 빠른 방법을 찾고 있습니다.
샘플 쿼리:
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 = ?;
Say the?와 스와프되었습니다.'TB100'...첫 번째 쿼리와 두 번째 쿼리는 모두 동일한 결과를 반환합니다(예:...). 1이 대화에 대해서)마지막 쿼리가 반환됩니다.'TB100'예상대로, 또는 만약 그렇다면id는 테이블에 없습니다.
그 목적은 이 시스템이 어떤 기능을 가지고 있던지 아닌지를 알아내는 것이다.id테이블 안에 있는지 없는지.그렇지 않은 경우 프로그램은 레코드를 삽입하고, 삽입한 경우 이 질문의 범위를 벗어난 다른 프로그램 논리에 기반하여 UPDATE 쿼리를 실행합니다.
어느 쪽이 더 빠르고 오버헤드가 적습니까?(이 작업은 프로그램 실행당 수만 번 반복되며 하루에 여러 번 실행됩니다.)
(M$ 제공 JDBC 드라이버를 통해 Java의 M$ SQL Server에 대해 이 쿼리를 실행합니다.)
EXISTS(또는NOT EXISTS는, 유무를 체크하기 위해서 특별히 설계되어 있기 때문에, 최적인 옵션이어야 합니다.일치하는 첫 번째 행에서 정지하기 때문에 이 행은 다음 명령어가 필요하지 않습니다.TOP절은 실제로 데이터를 선택하지 않으므로 열 크기에 오버헤드가 없습니다.안전하게 사용할 수 있습니다.SELECT *여기 - 와 다를 바 없음SELECT 1,SELECT NULL또는SELECT AnyColumn...(와 같은 잘못된 표현도 사용할 수 있으며 끊어지지 않습니다.)
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 products.id FROM products WHERE products.id = ?;는 첫 번째 레코드를 찾은 후 실행을 종료하기 때문에 모든 제안보다 성능이 우수합니다.
이보다 더 좋을 순탄치 않아
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
이 접근법은 부울을 반환합니다.
아직 아무도 언급하지 않았지만, 데이터가 변경되지 않을 것이라고 확신한다면 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
를 사용할 수도 있습니다.
If EXISTS (SELECT 1 FROM dbo.T1 WHERE T1.Name='Scot')
BEGIN
--<Do something>
END
ELSE
BEGIN
--<Do something>
END
레코드가 데이터베이스에 존재하는지 여부를 확인하는 가장 간단하고 빠른 방법은 다음과 같습니다.좋은 점은 레코드가 모든 관계형 DB에서 작동한다는 것입니다.
SELECT distinct 1 products.id FROM products WHERE products.id = ?;
SELECT COUNT(*) FROM products WHERE products.id = ?;
이것은 모든 데이터베이스에서 작동하는 상호 관계형 데이터베이스 솔루션입니다.
MySQL 또는 Oracle 백그라운드에서 이 문제를 겪고 있는 사용자를 위해 MySQL은 제한된 수의 레코드를 선택하는 LIMIT 절을 지원하며 Oracle은 ROWNUM을 사용합니다.
MySql의 경우 다음과 같이 LIMIT를 사용할 수 있습니다(예: PHP의 표시).
$sql = "SELECT column_name FROM table_name WHERE column_name = 'your_value' LIMIT 1";
$result = $conn->query($sql);
if ($result -> num_rows > 0) {
echo "Value exists" ;
} else {
echo "Value not found";
}
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
SQL SERVER 2012+
SELECT IIF((SELECT TOP 1 1 FROM dbo.[YourTable] WHERE [YourColumn] = [YourValue]) IS NULL, 0, 1)
내 방식대로 해볼래?
IF (SELECT TOP 1 1 FROM [TableName]) = 1
BEGIN
--Do work
END
언급URL : https://stackoverflow.com/questions/18114458/fastest-way-to-determine-if-record-exists
'source' 카테고리의 다른 글
| 데이터를 다른 테이블로 복사 (0) | 2023.04.07 |
|---|---|
| 인덱스를 작성할 때 INCLUDE 절을 사용하는 이유는 무엇입니까? (0) | 2023.04.07 |
| Angular JS 스타일 가이드 - 토드 모토 vs 존 파파 vs 밍코 게체프 (0) | 2023.04.02 |
| 부스트에 의한 JSON의 시리얼화 및 시리얼화 해제 (0) | 2023.04.02 |
| React Query와 Redux의 주요 차이점은 무엇입니까? (0) | 2023.04.02 |