최상의 답변
조인과 하위 쿼리가 모두 SQL 문에서 제자리를 차지하지만 저는 개인적으로 항상 조인만을 사용하여 쿼리를 작성하려고합니다. . 한편, 하위 쿼리 없이는 원하는 데이터를 가져올 수없는 경우에만 하위 쿼리를 도입합니다.
이유는 조인이 더 빠르게 실행되는 경향이 있기 때문입니다. 사실, 조인을 사용하는 쿼리의 검색 시간이 거의 항상 하위 쿼리보다 빠르다고 말할 수 있습니다.
이유는 조인이 계산 부담을 덜어주기 때문입니다. 여러 쿼리를 하나의 조인 쿼리로 대체하여 데이터베이스. 결과적으로 레코드를 검색, 필터링 및 정렬하는 데이터베이스 기능을 더 잘 활용할 수 있습니다.
물론 쿼리에 조인을 더 추가하면 데이터베이스 서버가 더 많은 작업을 수행해야합니다. 데이터 검색 시간을 늦출 수 있습니다.
정규화 된 데이터베이스에서 데이터를 검색하려면 조인이 필요하지만 잘못된 조인은 심각한 성능 저하와 부정확 한 쿼리 결과를 초래할 수 있으므로 조인을 올바르게 작성하는 것이 중요합니다.
경우에 따라 하위 쿼리가 복잡한 조인 및 공용체를 대체 할 수 있지만 성능에 미치는 부정적인 영향을 최소화 할 수 있습니다.
하위 쿼리의 예
때로는 하위 쿼리를 사용하여 돌아 다니지 못할 때가 있습니다. 다음은 MySQL 용 Sakila 샘플 데이터베이스와 Navicat 데이터베이스 개발 및 관리 클라이언트를 사용하는 몇 가지 예입니다.
예제 # 1 : JOIN 절의 일부로 집계 함수 사용
대부분의 경우 테이블은 공통 필드에서 조인됩니다. 실제로 공통 필드가 동일한 데이터임을 표시하기 위해 동일한 이름을 공유하는 것은 드문 일이 아닙니다. 그러나 다음 쿼리에서 customer 테이블은 가장 최근에 등록한 고객에 대한 쿼리 결과가되도록 최신 (MAX) create\_date에 조인됩니다.
집계 함수를 사용할 수 없기 때문에 하위 쿼리가 사용됩니다. WHERE 절의 일부로. 이 독창적 인 해결 방법은 이러한 제한을 우회합니다!
예 # 2 :
이 쿼리에서는 대여 한 영화 수에 AVG () 함수를 적용 할 수 있도록 중간 결과 집합을 가져 오는 데 하위 쿼리가 사용됩니다. 이것은 다른 (COUNT)의 결과에 집계 (AVG)를 적용하기 때문에 이중 집계라고 부르는 것입니다.
이 특정 쿼리는 매우 빠릅니다 (단 0.044 초만 소요됨). 내부 쿼리가 반환하기 때문입니다. 단일 값. 일반적으로 가장 느린 쿼리는 전체 테이블 스캔이 필요한 쿼리입니다.
질문에 대한 답변이되기를 바랍니다.
감사합니다!
아담
답변
보통 가능한 한 명확하게 쿼리를 작성하고 최적화는 RDBMS의 쿼리 프로세서와 DBA (있는 경우)에게 맡겨야합니다. 대부분의 경우에 충분한 성능을 제공해야하지만 예외가 있습니다. 때때로 RDBMS의 쿼리 최적화 프로그램에 사각 지대 또는 불량 사례가 있습니다.
이제 조인 또는 하위 쿼리가 문제가되는 경우 옵티마이 저는 하위 쿼리에있을 가능성이 훨씬 더 높습니다. 조인은 모든 사용자가 사용하는 언어의 기본 기능인 반면 많은 사용자는 하위 쿼리를 전혀 사용하지 않기 때문입니다. Sybase에서 앱을 변환하는 것을 발견했습니다. SQL Server에 Microsoft의 버그로 인해 많은 하위 쿼리를 조인으로 다시 작성해야했습니다. 하위 쿼리 처리-매우 특정한 경우 (부 쿼리 where 절에 바인딩 된 매개 변수가 포함 된 경우). SQL Server에 하위 쿼리에 버그가있는 것은 놀라운 일이 아닙니다. 많은 고객이 SQL Server를 자연스럽게 조인을 생성하지만 하위 쿼리는 생성하지 않는 Microsoft의 그래픽 쿼리 편집기와 함께 사용하기 때문입니다.
저는 일반적으로 조기 최적화를 권장하지 않습니다. 하지만 여기서는 예외입니다. 애플리케이션이 여러 데이터베이스 플랫폼에 걸쳐 이식 가능해야하는 경우 대부분의 경우 하위 쿼리에 대한 조인을 선호합니다. 이는 하위 쿼리에서 버그 나 잘못된 최적화 프로그램 선택에 직면 할 가능성이 더 높기 때문입니다. 응용 프로그램은 이식 할 필요가 없습니다. 가장 자연스러운 방법으로 쿼리를 작성하고 문제가 없으면 대부분의 경우 문제가되지 않습니다. 문제가있는 경우 쿼리를 다르게 다시 작성하여 도움이되는지 확인하십시오. DBA가 있다면 성능 문제에 대해 상담하십시오.