[sql] SQL에서 절의 순서가 중요합니까?

PEOPLE열이 3 개 있는 테이블이 있다고 가정 해 보겠습니다 ID, LastName, FirstName.이 열 중 어느 것도 인덱싱되지 않습니다.
LastName더 독특하고 FirstName덜 독특합니다.

두 번 검색하면 :

select * from PEOPLE where FirstName="F" and LastName="L"
select * from PEOPLE where LastName="L" and FirstName="F"

내 믿음은 두 번째가 더 빠르다는 것입니다. 더 독특한 기준 ​​( LastName)이 where절 에서 먼저 나오고 레코드가 더 효율적으로 제거 되기 때문 입니다. 나는 옵티마이 저가 첫 번째 SQL을 최적화하기에 충분히 똑똑하다고 생각하지 않습니다.

내 이해가 맞습니까?



답변

아니요, 그 순서는 중요하지 않습니다 (또는 적어도 : 중요하지 않습니다).

괜찮은 쿼리 최적화 프로그램은 절의 모든 부분을 살펴보고 WHERE해당 쿼리를 충족하는 가장 효율적인 방법을 알아냅니다.

저는 SQL Server 쿼리 최적화 프로그램이 두 가지 조건이있는 순서에 관계없이 적합한 인덱스를 선택한다는 것을 알고 있습니다. 다른 RDBMS도 비슷한 전략을 가지고 있다고 가정합니다.

중요한 것은 이것에 적합한 인덱스가 있는지 여부입니다!

SQL Server의 경우 다음과 같은 경우 인덱스를 사용합니다.

  • 색인 (LastName, FirstName)
  • 색인 (FirstName, LastName)
  • 단지 (LastName)또는 단지 (FirstName)(또는 둘 다) 에 대한 색인

반면에 다시 SQL Server의 경우 테이블에서 모든SELECT *을 가져 오는 데 사용 하고 테이블이 다소 작 으면 쿼리 최적화 프로그램이 사용하는 대신 테이블 (또는 클러스터형 인덱스) 스캔을 수행 할 가능성이 높습니다. 인덱스 ( 다른 모든 열을 가져 오기 위해 전체 데이터 페이지를 조회하는 것은 매우 빠르게 비용이 많이 들기 때문입니다).


답변

WHERE 절의 순서는 SQL 표준을 따르는 데이터베이스에서 차이를 만들어서는 안됩니다. 평가 순서는 대부분의 데이터베이스에서 보장되지 않습니다.

SQL이 주문에 관심이 있다고 생각하지 마십시오. 다음은 SQL Server에서 오류를 생성합니다.

select *
from INFORMATION_SCHEMA.TABLES
where ISNUMERIC(table_name) = 1 and CAST(table_name as int) <> 0

이 절의 첫 번째 부분이 먼저 실행되면 숫자 테이블 이름 만 정수로 캐스트됩니다. 그러나 실패하고 SQL Server (다른 데이터베이스와 마찬가지로)가 WHERE 문의 절 순서에 관심이 없다는 명확한 예를 제공합니다.


답변

ANSI SQL Draft 2003 5WD-01-Framework-2003-09.pdf

6.3.3.3 규칙 평가 순서

형식이나 괄호에 의해 우선 순위가 결정되지 않는 경우 식의 효과적인 평가는 일반적으로 왼쪽에서 오른쪽으로 수행됩니다. 그러나 표현식이 실제로 왼쪽에서 오른쪽으로 평가되는지 여부는 구현에 따라 다릅니다. 특히 피연산자 또는 연산자로 인해 조건이 발생할 수있는 경우 또는 표현식의 모든 부분을 완전히 평가하지 않고 표현식의 결과를 확인할 수 있는지 여부는 구현에 따라 다릅니다.

여기 에서 복사


답변

아니요, 모든 RDBM은 먼저 쿼리를 분석하고 where 절을 재정렬하여 최적화합니다.

사용중인 RDBM에 따라 분석 결과를 표시 할 수 있습니다 (예 : Oracle에서 계획 설명 검색).

미디엄.


답변

원래 OP 문

내 믿음은 두 번째가 더 빠르다는 것입니다. 왜냐하면 더 고유 한 기준 (LastName)이> where 절에서 먼저 나오고 레코드가 더 효율적으로 제거되기 때문입니다. 나는 옵티마이 저가 첫 번째 SQL을 최적화하기에 충분히 똑똑하다고 생각하지 않습니다.

두 번째로 가장 선택적인 것보다 더 많은 선택적인 열을 먼저 배치해야하는 인덱스를 만드는 동안 열 순서를 선택하는 것과 이것을 혼동하고 있다고 생각합니다.

BTW, 위의 두 쿼리에 대해 SQL 서버 최적화 프로그램은 최적화를 수행하지 않지만 계획의 총 비용이 병렬 처리 임계 값 비용보다 작은 한 Trivila 계획을 사용합니다.


답변

이름이 인덱싱되지 않는다고 가정하면 사실입니다. 하지만 데이터가 다르면 잘못 될 수 있습니다. 매번 다를 수있는 방법을 찾기 위해 DBMS는 각 열에 대해 고유 한 카운트 쿼리를 실행하고 숫자를 비교해야하는데, 이는 단순히 어깨를 으쓱하고 처리하는 것보다 더 많은 비용이 듭니다.


답변