मैं अभी कुछ पुराने कोड की समीक्षा कर रहा था, जो प्री-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% स्पीडअप। इसके अलावा, 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 वूडू की तुलना में एक आंतरिक कार्य इतना धीमा क्यों है ?
X86_64 -pc-linux-gnu पर " PostgreSQL 9.5.5 का उपयोग करके , gcc द्वारा संकलित (Ubuntu 6.2.0-5ubuntu12) 6.2.0 20161005, 64-बिट"
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