안녕하세요 형님 누님 고수님들
row_number (partition by order by) 관련하여 질문이 있습니다.
테스트 테이블
chsdb=# \d partition_by_test
Table "public.partition_by_test"
Column | Type | Modifiers
--------+---------------+-----------
a | numeric |
b | character(10) |
c | character(20) |
select * from
(select *,ROW_NUMBER() OVER(PARTITION BY b order by a) as d
from partition_by_test) a
where a.d=1;
b컬럼 기준 a로 정렬하여 순위가 1인 행에 관련하여 출력하는게 목적입니다.
그런데 partition_by_test 테이블 건수가 많다보니까 메모리 사용량이 높습니다.
(partition by , order by 등 sort에서 많이 사용되는듯 합니다)
explain select * from (select *,ROW_NUMBER() OVER(PARTITION BY b order by a) as d
from partition_by_test) a where a.d=1;
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------
Gather Motion 8:1 (slice2; segments: 8) (cost=1826.03..2170.03 rows=18 width=168)
-> Subquery Scan a (cost=1826.03..2170.03 rows=3 width=168)
Filter: d = 1
-> Window (cost=1826.03..1955.03 rows=2150 width=160)
Partition By: partition_by_test.b
Order By: partition_by_test.a
-> Sort (cost=1826.03..1869.03 rows=2150 width=160)
Sort Key: partition_by_test.b, partition_by_test.a
-> Redistribute Motion 8:8 (slice1; segments: 8) (cost=0.00..616.00 rows=2150 width=160)
Hash Key: partition_by_test.b
-> Seq Scan on partition_by_test (cost=0.00..272.00 rows=2150 width=160)
Optimizer status: legacy query optimizer
partition order by 부문에서
모든 행에 순위를 매기지 말고 상위 행에 대해서만 뽑으면 리소스 사용량이 줄을 수 있을 듯한데
이런 방도로 튜닝이나 아니면 다른 방도가 있을까요?
조언 부탁드립니다.
감사합니다. |