2011-09-23 2 views
2

대다수의 관계가있는 두 개의 테이블이 있습니다.이 테이블을 Parent_Table 및 Child_Table (즉, 부모는 0 명 이상의 자식이 있지만 자식은 정확히 하나의 부모를가집니다) . 나는 어떤 조건을 충족시키는 적어도 한 명의 아이를 가진 부모의 수를 세고 싶습니다. 어떤 쿼리가 최적입니까?다차원 관계에 대한 SQL 쿼리 최적화

옵션 1 (확신은이 일이 아니다)

SELECT COUNT(DISTINCT(pt.ID)) 
FROM PARENT_TABLE pt 
JOIN CHILD_TABLE ct 
ON pt.ID = ct.PARENT_ID 
WHERE <parent meets some condition> 
AND <child meets some condition> 

옵션 2

SELECT COUNT(pt.ID) 
FROM PARENT_TABLE pt 
WHERE pt.ID in 
(
SELECT ct.PARENT_ID 
FROM CHILD_TABLE ct 
WHERE <child meets condition> 
) 
AND <parent meets some condition> 

옵션 3 (가장 빠른로 내 생각 엔)

SELECT COUNT(pt.ID) 
FROM PARENT_TABLE pt 
WHERE EXISTS 
(
SELECT 1 
FROM CHILD_TABLE ct 
WHERE ct.PARENT_ID = pt.ID 
AND <child meets condition> 
) 
AND <parent meets some condition> 

아니면 뭔가 그렇지 않으면 전적으로? 각 테이블의 크기 또는 두 조건의 복잡성 또는 데이터의 정렬 여부에 따라 다릅니 까?

편집 : 데이터베이스는 오라클입니다.

+1

일부 적절한 크기의 샘플 데이터에 대해 성능 테스트를 수행해보십시오. –

+0

SQL Server 2005 이상에서는 옵션 2와 3이 동일하게 처리됩니다. – JNK

+0

정확한 답을 얻으려면 RDBMS를 공유하십시오. – JNK

답변

3

첫 번째 쿼리는 느리고 다른 쿼리는 대부분의 DB에서 빠르게 실행해야합니다.

DB를 모르고는 말을 열심히 더 :

그러나 : 카운트 (*) (구별이 (멀리)) 느린 (names_field) 결코 느린
수를 계산보다 종종 더 빠른

아니면 완전히 다른 것입니까?

이는 DB 및 DB의 정확한 버전에 따라 다릅니다.

그것은 큰 부분

또는

가능한 두 조건의 복잡성을 재생 각 테이블

예,의 크기에 의존 하는가

또는 데이터 정렬 여부

빠른 선택을 원할 경우 가입하는 데 사용되는 모든 필드의 색인을 생성해야합니다.
그리고 where 절에 사용 된 모든 필드는 색인화되었거나 카디널리티가 낮아야합니다.

+0

+1 - 이건 꽤 제한된 정보와 함께 당신이 할 수있는만큼 합계. – JNK

+0

count (*)도 count (columnname)와 다른 의미를 가지고 있습니다. – EvilTeach

+0

@EvilTeach, 내부 조인의 컨텍스트에서 기본 키가 아닙니다. – Johan

0

제게는 읽기 쉽기 때문에 처음에는 가장 좋아 보이지만 분명히 대답하지는 않습니다.

당신이 정말로해야 할 일은 각각의 쿼리에 대한 실행 계획을 생성하고 분석하는 것입니다. (저는 대중적인 DBMS의 대부분이 그것을 수행하는 도구를 가지고 있다고 생각합니다). 각 쿼리에 대한 비용 값을 제공합니다.

내가 할 수 없다면 쿼리를 여러 번 실행하고 실행 시간을 비교할 수있을 것입니다.

아니면 완전히 다른 것입니까? 각 테이블의 크기 또는 두 조건의 복잡성 또는 데이터의 정렬 여부에 따라 다릅니 까?

그 이상.

-1

의견 작성자의 말처럼이 질문에 대답하는 가장 좋은 방법은 쿼리와 측정을 실행하는 것입니다.

그러나 일반적으로 데이터베이스 엔진은 매우 효율적으로 조인을 최적화합니다. 3 가지 쿼리간에 거의 차이가 없으며 쿼리 최적화 프로그램으로 모든 쿼리를 동일한 기본 쿼리로 전환 할 수 있습니다. (2와 3은 그대로 동일합니다).

쿼리에 가장 큰 영향을주는 것은 "일부 조건을 충족하는 자식"과 "조건을 충족하는 조건"조항입니다. 나는이 비트를 최적화하는데 집중할 것이다.

+0

사실이 아닙니다. 'IN' 대'DISTINCT'는 처리 시간에 ** 매우 큰 영향을 미칩니다 **. – JNK

+0

ah 예 - DISTINCT는 일반적으로 악조건입니다. 성능 관점에서. 그 작은 덩어리를 발견하지 못했습니다 ...하지만, 어디 조항이 큰 영향을 미칠 것이라고 생각합니까 –