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


121

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을 최적화하기에 충분히 똑똑하다고 생각하지 않습니다.

내 이해가 맞습니까?


8
아니요, 그 순서는 중요하지 않습니다. 괜찮은 쿼리 옵티마이 저는 모든 WHERE 절을 살펴보고 해당 쿼리를 충족하는 가장 효율적인 방법을 알아낼 것입니다
marc_s

3
이 두 진술을 실행했을 때 관찰 한 내용은 무엇입니까? 실행 계획은 어떻게 생겼습니까?
Conrad Frix 2012

3
특정 RDBMS를 언급하고 있습니까? 실제로 차이점이 있습니다.
Bjoern


답변:


101

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

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

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

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

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

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

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


인덱스가 없으면 데이터에 따라 작업이 옳을 수 있습니다. 코스 ... 이상한 결정을 할 수, 인덱스없이이 같은 somnething을 것 일
토니 홉 킨슨

@TonyHopkinson : 나는 그렇게 생각하지 않는다. 인덱스가 없어도 전혀 차이가 있을지 의심 스럽다. 결국 : 인덱스없이 RDBMS가 실제로 할 수있는 것은 전체 테이블 스캔 외에는 무엇입니까 ??
marc_s jul.

2
SQL 서버와 재미있는 보조 노트, NOT 명백하게 순서는 실제로 계획 생성에 영향을 미칠 수있는 조건 내에 존재 : bradsruminations.blogspot.com/2010/04/looking-under-hood.html
저스틴 Swartsel

3
이상한 점은 쿼리를 처음 실행할 때 WHERE 절의 조건 순서가 중요하다는 것입니다! 나는 두 가지 조건, 같은했다 : WHERE T1.col_1/T2.col_2 > 10 AND T2.col_2 <> 0하고있어 DIVIDE BY 0오류가 발생했습니다. 순서를 전환 한 후 쿼리가 성공적으로 실행되었습니다. 그런 다음 주문을 다시 전환하여 오류가 다시 발생할 것으로 예상했지만 이번에는 효과가있었습니다! 결국 내 결론은 첫 번째 실행에서 실행 계획이 작성 될 때까지 주문이 중요하다는 것입니다. 최적화 / 간부 계획 원인 't의 문제는'알아서합니다
라두 게오르규에게

1
나는 당신이 "... 또는 적어도 : 중요하지 않아야한다"라고 말한 것을 좋아합니다-나는 전적으로 동의합니다. 불행히도 때로는 중요합니다. SQL이 최적화 프로그램이 처리하기에 너무 복잡하고 열 순서 및 테이블 조인 순서와 같은 것이 차이를 만드는 경우를 보았습니다. RDBMS, SQL 문 복잡성 및 릴리스에 따라 다릅니다. 매우 복잡한 SQL은 옵티 마이저 결정이 잘못되거나 옵티 마이저 코드에서 하드 코딩 된 기본값을 사용할 수 있습니다.
Victor Di Leo

19

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 문의 절 순서에 관심이 없다는 명확한 예를 제공합니다.


오류를 일으키는 쿼리는 WHERE 술어 평가의 순서와 어떤 관련이 있습니까?
Jim

7
@Jim If ISNUMERIC(table_name) = 1가 먼저 평가 되면 CAST숫자 테이블 이름에 대해서만 호출됩니다. 그러나 먼저 평가되지 않으므로 CAST숫자가 아닌 테이블 이름에 대해서도 평가되어 오류 메시지가 발생합니다.
hibbelig 2013

2
우수한 설명
neeohw jul.

조건을 바꾸면 SQL 서버가 다른 방식으로 처리 할 수 ​​있는지 확인하기 위해 두 가지 방법 모두 실패합니다. 저는 이것이 두 가지 중 하나를 의미 할 수 있다고 생각합니다. (1) 최적화되지 않은 것 또는 (2) 컴파일 시간 오류이고 SQL이 예비를 구제하기 위해 아무것도 비교하려고 시도조차 시작하지 않습니다. 내 추측은 그것이 nr이라는 것입니다. 2.
루이 써머

9

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

6.3.3.3 규칙 평가 순서

...

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

여기 에서 복사


2

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

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

미디엄.


인덱스를 기반으로합니다. 따라서 콘텐츠 측면에서 간접적입니다.
Tony Hopkinson

1

원래 OP 문

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

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

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


0

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.