제목에서 알 수 있듯이 … 레코드가 테이블에 있는지 여부를 결정하기 위해 가장 적은 오버 헤드로 가장 빠른 방법을 찾으려고합니다.
샘플 쿼리 :
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 = ?;
이것은 모든 데이터베이스에서 작동하는 상호 관계형 데이터베이스 솔루션입니다.