ฉันเพิ่งตรวจสอบโค้ดเก่าที่เขียนขึ้นสำหรับPre-8.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% ยิ่งกว่านั้นการทำให้เรียบง่ายขึ้นโดยไม่มีคำสั่งซื้อแสดงความช้าเหมือนกัน
# 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 ของผู้วางแผน
ใช้ " PostgreSQL 9.5.5บน x86_64-pc-linux-gnu รวบรวมโดย gcc (Ubuntu 6.2.0-5ubuntu12) 6.2.0 20161005, 64-bit"
array_agg()
ประโยคSELECT ARRAY_AGG(c) FROM (SELECT c FROM t ORDER BY id) sub
ต่อการรวมORDER BY
คือสิ่งที่ห้ามการใช้ดัชนีในตัวอย่างของคุณ ตัวสร้างอาร์เรย์จะเร็วกว่าarray_agg()
เมื่อใดสามารถใช้ดัชนีเดียวกัน (หรือไม่) มันไม่ได้อเนกประสงค์ ดู: dba.stackexchange.com/a/213724/3684