2017-03-24 1 views
2

을 조인 나는 다음과 같은 하위 쿼리가 있습니다내부와 상관 하위 쿼리의 향상 성능이

SELECT 
    b.state, 
    b.city, 
    count(b.state) as totalCount, 
    sum(cast(replace(b.annual_prod, ',','.') as decimal)) AS annualProd, 
    (
    SELECT count(size_k) 
    FROM opentable_clean a 
    WHERE a.state = b.state 
     AND a.city = b.city 
     AND cast(replace(a.size_k, ',','.') as decimal) >= 20 
    GROUP BY a.state, a.city 
) as Above20k 
FROM opentable_clean b 
GROUP BY b.state, b.city 
ORDER by annualProd DESC; 

이 작동하지만 쿼리가 매우 비효율적이고 기본 테이블의 크기를 주어진 시간이 오래 걸립니다. 내부 조인을 사용하면 성능을 향상시킬 수 있다고 생각하지만 작동하는 것은 시도 할 수 없었습니다.

나는 SQL에 익숙하지 않으므로 어떤 제안이 도움이 될 것입니다.

+3

당신이 그 유형 변환 및 문자열 조작 ('특히 a.size_k') 문자열로 수치를 저장하고있는 것으로 보인다 당신의 내부'where' 절이 SARG 가능하지 않을 가능성이 있습니다. 수치 데이터를 올바르게 저장하도록 테이블을 수정할 수 있습니까? – alroc

+1

어떤 DBMS를 사용하고 있습니까? 포스트그레스? 신탁? –

+0

나는 postgres를 사용하고 있습니다 – user3003374

답변

1

당신이 찾고있는에 참여하지,하지만 집계 함수의 조건 ..이

select b.state, 
    b.city, 
    count(b.state) as totalCount, 
    sum(cast(replace(b.annual_prod, ',','.') as decimal)) AS annualProd, 
    SUM(CASE 
      WHEN cast(replace(a.size_k, ',','.') as decimal) >= 20 
      THEN 1 
      ELSE 0 END) as Above20k 
    FROM opentable_clean b 
    GROUP BY b.state, b.city 
    ORDER by annualProd DESC; 

같은 당신은 여전히 ​​모든 사람을 대체 일에 약간의 타격을 볼 것이다 - 당신도 만들 수 있다면 문자열을 올바르게 저장하기 위해 테이블에 계산 된 지속 열만 있으면 쿼리가 더 잘 수행됩니다.

엔진이 테이블을 두 번 스캔하는 대신, 어쨌든 하나의 테이블로만 작업하기 때문에 한 번 스캔 할 때이 모든 작업을 수행 할 수 있어야합니다. 실제로 두 번째 테이블을 사용했다면 적절한 JOIN과 같은 종류의 메소드를 사용하고 싶을 것입니다.

+0

Dan 감사합니다. 그 일은 훌륭했습니다. 방금 위의 솔루션에서 count를 sum으로 대체해야했습니다. – user3003374

+0

문제 없습니다. 이 대답이 도움이 되었다면 받아 들일 수있는 것으로 표시해보십시오. 나중에 참조 할 수 있도록 원래 질문에서 사용하는 RDBMS에 태그를 지정하는 것이 가장 좋습니다 (태그를 업데이트했습니다). –

+0

'SQL Server'에서와 같이 작동하지만 'SUM'도 의미가 있습니다. –

0

쿼리 성능을 향상 시키려면 먼저 실행 계획과 io 통계를 검토해야합니다.

실행 계획을 보려면 표시 실행 계획 버튼을 클릭하십시오.

io stats를 보려면 SET STATISTICS IO ON을 실행 한 후 쿼리를 실행하십시오. 통계가 메시지와 함께 나타납니다.

인덱스가없는 경우이 쿼리는 tableScan/clusteredIndexScan에서 open_table b를 읽은 다음 각 그룹에 대해 tableScan/clusteredIndexScan에 의해 open_table a를 그룹화하고 읽습니다. 도움을 줄 수

간단한 지수는 (주, 도시)에 하나 개의 인덱스 것

+0

OP에서 SQL Server를 사용하고 있습니까? –

관련 문제