방금 8.5.4 이전 PostgreSQL 용으로 작성된 오래된 코드를 검토하고 있었고 정말 멋진 것을 보았습니다. 나는 커스텀 함수가 하루 중 일부를 다시하는 것을 기억하지만, 미리 array_agg()
보이는 것을 잊어 버렸습니다 . 검토를 위해 현대 집계는 다음과 같이 작성됩니다.
SELECT array_agg(x ORDER BY x DESC) FROM foobar;
그러나 옛날 옛적에 이렇게 쓰여졌습니다
SELECT ARRAY(SELECT x FROM foobar ORDER BY x DESC);
그래서 테스트 데이터로 시도했습니다.
CREATE TEMP TABLE foobar AS
SELECT * FROM generate_series(1,1e7)
AS t(x);
그 결과는 놀라웠습니다. #OldSchoolCool 방식은 엄청나게 빨랐습니다 : 25 % 속도 향상. 또한 ORDER 없이 단순화 하면 동일한 속도가 느려졌습니다.
# EXPLAIN ANALYZE SELECT ARRAY(SELECT x FROM foobar);
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------
Result (cost=104425.28..104425.29 rows=1 width=0) (actual time=1665.948..1665.949 rows=1 loops=1)
InitPlan 1 (returns $0)
-> Seq Scan on foobar (cost=0.00..104425.28 rows=6017728 width=32) (actual time=0.032..716.793 rows=10000000 loops=1)
Planning time: 0.068 ms
Execution time: 1671.482 ms
(5 rows)
test=# EXPLAIN ANALYZE SELECT array_agg(x) FROM foobar;
QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------
Aggregate (cost=119469.60..119469.61 rows=1 width=32) (actual time=2155.154..2155.154 rows=1 loops=1)
-> Seq Scan on foobar (cost=0.00..104425.28 rows=6017728 width=32) (actual time=0.031..717.831 rows=10000000 loops=1)
Planning time: 0.054 ms
Execution time: 2174.753 ms
(4 rows)
그래서 여기서 무슨 일이 일어나고 있습니까? 내부 함수 array_agg 가 플래너의 SQL 부두보다 훨씬 느린 이유는 무엇 입니까?
" gcc에 의해 컴파일 된 x86_64-pc-linux-gnu에서 PostgreSQL 9.5.5 사용 (Ubuntu 6.2.0-5ubuntu12) 6.2.0 20161005, 64 비트"
array_agg
ARRAY
생성자가UNION
내부적으로 표현식과 거의 비슷한 일을하는 것처럼 보이는 입력 순서를 추적해야합니다 . 추측을array_agg
해야한다면 더 많은 메모리가 필요할 것입니다. 철저하게 테스트 할 수는 없지만 우분투 16.04에서 실행되는 PostgreSQL 9.6에서는ARRAY()
쿼리가ORDER BY
외부 병합 을 사용했으며array_agg
쿼리 보다 느 렸습니다 . 당신이 말했듯이, 코드를 읽지 못하면 대답은 우리가 가장 잘 설명하는 것입니다.