여기에 스타 스키마가 있는데 사실 테이블을 쿼리하고 하나의 매우 작은 차원 테이블에 가입하려고합니다.다음 조인이 쿼리 시간을 크게 늘리는 이유는 무엇입니까?
EXPLAIN ANALYZE SELECT
COUNT(impression_id), imp.os_id
FROM bi.impressions imp
GROUP BY imp.os_id;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------
HashAggregate (cost=868719.08..868719.24 rows=16 width=10) (actual time=12559.462..12559.466 rows=26 loops=1)
-> Seq Scan on impressions imp (cost=0.00..690306.72 rows=35682472 width=10) (actual time=0.009..3030.093 rows=35682474 loops=1)
Total runtime: 12559.523 ms
(3 rows)
이 소요 ~ 12600ms하지만, 물론 거기에는 데이터를 결합, 그래서 의미가 무엇인가에 imp.os_id를 "해결"할 수없는, 그래서 추가 : 정말 다음을 설명 할 수 없습니다 가입 :
EXPLAIN ANALYZE SELECT
COUNT(impression_id), imp.os_id, os.os_desc
FROM bi.impressions imp, bi.os_desc os
WHERE imp.os_id=os.os_id
GROUP BY imp.os_id, os.os_desc;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------------
HashAggregate (cost=1448560.83..1448564.99 rows=416 width=22) (actual time=25565.124..25565.127 rows=26 loops=1)
-> Hash Join (cost=1.58..1180942.29 rows=35682472 width=22) (actual time=0.046..15157.684 rows=35682474 loops=1)
Hash Cond: (imp.os_id = os.os_id)
-> Seq Scan on impressions imp (cost=0.00..690306.72 rows=35682472 width=10) (actual time=0.007..3705.647 rows=35682474 loops=1)
-> Hash (cost=1.26..1.26 rows=26 width=14) (actual time=0.028..0.028 rows=26 loops=1)
Buckets: 1024 Batches: 1 Memory Usage: 2kB
-> Seq Scan on os_desc os (cost=0.00..1.26 rows=26 width=14) (actual time=0.003..0.010 rows=26 loops=1)
Total runtime: 25565.199 ms
(8 rows)
이것은 내 쿼리의 실행 시간을 효과적으로 두 배로 만듭니다. 제 질문은, 제가 그림에서 무엇을 떠나지 않았습니까? 이러한 작은 조회가 쿼리 실행 시간에 큰 차이를 일으키지 않는다고 생각합니다.
는 모두'impressions.os_id'와'os.os_id'에 인덱스를해야합니까? – house9
인덱스는 비트 마스크 인덱스 스캔을 생성합니다 (충분한 선택적인 WHERE 절이 없어도 모든 행이 필요합니다. 노출 인덱스가 인덱스에없는 것으로 가정). – wildplasser
예 모두 인덱스 (btree (os_id)) – Istvan