2010-03-27 3 views
2

다음 쿼리를 타고 외부로 최적화 필터 하위 쿼리를합니까 서브 쿼리에서.는 조항

또는

는 하위 쿼리 조합 내에서 각 쿼리를 실행하고 (쿼리가 아마 제안으로)

하는 경우에는 다음과 같은 쿼리가 더 잘 수행 할 필터링을 위해 외부 쿼리에 결과를 반환합니다 :

select * from 
(
    select a, b 
    from c 
    where a = 'mung' 
    UNION 
    select a, b 
    from d 
    where a = 'mung' 
) 
order by b 

분명히 쿼리 1은 유지 관리에 가장 적합하지만 이에 대한 많은 성과를 희생합니까?

어느 것이 가장 좋습니까?

편집 나는이 모든 첫 번째 장소에서 하위 쿼리로 필요한 이유를 나타 내기 위해 쿼리에서 by 절 순서를 추가 무시 죄송합니다!

편집 좋아, 나는 간단한 답이 될 것이라고 생각했지만 데이터베이스에 대해 이야기하는 것을 잊어 버렸다. 분석기를 통해 실행하면 최적화가 수행되지 않는다는 것을 나타내지 만, 물론 테이블에 4 개의 행만 있기 때문에 가능합니다. 더 간단한 예 또는 아니오를 기대하고있었습니다. 좀 더 복잡한 테스트를 설정해야합니다.

나는 순간에 MySQL을,하지만 내가 여기에 일반적인 대답 후 나는 ...

+0

내 자신의 무지 될 수있을 것입니다 그런데 왜 최적화를 요구하지 무엇을 제안 된 실행 계획 (실행 계획 보여주기)을 묻고이를 어떻게 공격하는지 살펴봄으로써 수행 할 것입니다. 분명히 완전한 그림은 아니지만, 그것이 무엇을 암시하고 사용하는지 알 수 있습니다. – GrayWizardx

+1

IT는 책임을집니다. 때로는 그럴 것이고 때로는 그렇지 않을 수도 있습니다. 해당 UNION을 UNION으로 변경하면 더 자주 * will *됩니다. – RBarryYoung

+2

그리고 그것은 확실히 당신이 사용하고있는 SQL의 브랜드, 에디션 및 버전에 따라 매우 달라집니다. – RBarryYoung

답변

2

사용 :

SELECT x.a, 
     x.b 
    FROM TABLE_X x 
WHERE x.a = 'mung' 
UNION 
SELECT y.a, 
     y.b 
    FROM TABLE_Y y 
WHERE y.a = 'mung' 
  • 하위 쿼리가 주어진 상황
  • 에서 불필요 위의 쿼리는 "a"열에서 사용 가능한 경우 인덱스를 사용합니다. 하위 쿼리 방법을 사용하여, 거기에 당신이 중복 염려 할 필요가없는 경우
  • 사용 UNION ALL을 활용하는 인덱스 없다 - 그것은보다 빠른 UNION
+0

죄송 합니다만, 먼저 하위 쿼리가 필요한 이유를 나타 내기 위해 쿼리에 순서를 넣어야합니다. 내 죄책감 ..여전히 다른 두 점은 옵티마이 저가 필터가 하위 쿼리에 적용되어야한다는 것을 알 수 없다는 것을 나타냅니다. –

+1

@Mongus Pong : 옵티마이 저가 무엇을하고 있는지를 결정하는 것이 가장 좋을 것입니다. 그리고 데이터베이스 공급 업체 (버전이 아닌 경우)도 다를 수 있습니다. –