[sql] SQL : 레코드가 있는지 올바르게 확인하는 방법

SQL Tuning 관련 문서를 읽는 동안 다음을 발견했습니다.

SELECT COUNT(*) :

  • 행 수를 계산합니다.
  • 종종 레코드의 존재를 확인하는 데 잘못 사용됩니다.

SELECT COUNT(*)정말 나쁜?

기록이 있는지 확인하는 올바른 방법은 무엇입니까?



답변

다음 중 하나를 사용하는 것이 좋습니다.

-- Method 1.
SELECT 1
FROM table_name
WHERE unique_key = value;

-- Method 2.
SELECT COUNT(1)
FROM table_name
WHERE unique_key = value;

첫 번째 대안은 결과 또는 하나의 결과를 제공하지 않아야하며, 두 번째 개수는 0 또는 1이어야합니다.

사용중인 문서는 몇 살입니까? 좋은 조언을 읽었지만 최근 RDBMS의 대부분의 쿼리 최적화 프로그램은 SELECT COUNT(*)어쨌든 최적화 하므로 이론과 오래된 데이터베이스에는 차이가 있지만 실제로는 차이를 느끼지 않아야합니다.


답변

Count 함수를 전혀 사용하지 않는 것이 좋습니다.

IF [NOT] EXISTS ( SELECT 1 FROM MyTable WHERE ... )
     <do smth>

예를 들어 데이터베이스에 사용자를 삽입하기 전에 사용자가 있는지 확인하려는 경우 쿼리는 다음과 같습니다.

IF NOT EXISTS ( SELECT 1 FROM Users WHERE FirstName = 'John' AND LastName = 'Smith' )
BEGIN
    INSERT INTO Users (FirstName, LastName) VALUES ('John', 'Smith')
END


답변

당신이 사용할 수있는:

SELECT 1 FROM MyTable WHERE <MyCondition>

조건과 일치하는 레코드가 없으면 결과 레코드 세트가 비어 있습니다.


답변

다른 답변은 꽤 좋지만 불필요한 행을 확인하지 못하도록 추가 LIMIT 1(또는 이에 상응하는 )를 사용하는 것이 좋습니다.


답변

SELECT COUNT(1) FROM MyTable WHERE ...

모든 레코드를 통해 반복됩니다. 이것이 레코드 존재에 사용하기 어려운 이유입니다.

나는 사용할 것이다

SELECT TOP 1 * FROM MyTable WHERE ...

1 개의 레코드를 찾은 후 루프가 종료됩니다.


답변

당신이 사용할 수있는:

SELECT COUNT(1) FROM MyTable WHERE ... 

또는

WHERE [NOT] EXISTS
( SELECT 1 FROM MyTable WHERE ... )

이보다 더 효율적입니다 SELECT *모든 필드가 아닌 각 행에 대해 단순히 값 1을 선택하기 때문에 입니다.

COUNT (*)와 COUNT (열 이름) 사이에는 미묘한 차이가 있습니다.

  • COUNT(*) null을 포함하여 모든 행을 계산합니다.
  • COUNT(column name)Null이 아닌 열 이름 만 계산합니다.

답변

당신이 사용할 수있는:

SELECT 1 FROM MyTable WHERE... LIMIT 1

select 1불필요한 필드 확인을 방지하는 데 사용 합니다.

사용 LIMIT 1 불필요한 행의 검사를 방지 할 수 있습니다.