나는 이것이 일반적인 질문이며 몇 가지 다른 게시물과 논문을 읽었으나 색인 된 필드와 두 쿼리가 반환 할 수있는 레코드의 볼륨을 고려하지 못했습니다.중첩 된 선택의 성능
제 질문은 간단합니다. 다음 두 가지 중 성능에있어서 SQL과 유사한 구문으로 작성된 것이 좋습니다.
첫 번째 쿼리 :
Select *
from someTable s
where s.someTable_id in
(Select someTable_id
from otherTable o
where o.indexedField = 123)
두 번째 쿼리
Select *
from someTable
where someTable_id in
(Select someTable_id
from otherTable o
where o.someIndexedField = s.someIndexedField
and o.anotherIndexedField = 123)
나의 이해 번째 쿼리는 첫 번째 쿼리 평가 곳에 외부 쿼리가 반환하는 모든 튜플에 대한 데이터베이스를 조회하는 것입니다 내부를 먼저 선택하고 필터를 외부 쿼리에 적용하십시오.
이제 두 번째 쿼리는 someIndexedField 필드가 인덱싱되지만 수천 또는 수백만 개의 레코드가 있다고 가정 할 때 초고속 쿼리를 사용하여 데이터베이스를 쿼리 할 수 있습니다.
참고 : Oracle 데이터베이스. 첫 번째 쿼리에 대해
. . 일반적으로 데이터베이스를 지정하지 않은 성능 문제는 의미가 없습니다. SQL은 절차 언어가 아닌 설명 적 언어이므로 옵티 마이저 (엔진의 일부)는 주어진 쿼리에 가장 적합한 쿼리 계획을 자유롭게 선택할 수 있습니다. –
@GordonLinoff 좋은 지적. 데이터베이스는 Oracle 데이터베이스입니다. 언어는 정말로 SQL과 같은 문법으로 작성했다고 생각하면 안됩니다. – mixkat
. . 톰 카이트에 따르면, 오라클 최적화 http://asktom.oracle.com/pls/apex/f?p=100:11:0::NO (상관 하위 쿼리를 인식하고 적절한 조인로 바꿀 수 똑똑 :: P11_QUESTION_ID : 3167884300346662300). 오라클은 매우 좋은 최적화 도구를 가지고 있습니다. 흥미로운 점은 첫 번째 버전이 MySQL에서 완전히 끔찍한 성능을 가지고 있다는 것입니다. . . 문제를 수정 한 버전 5.6까지. –