আমি কেবল প্রাক-8.4 পোস্টগ্র্যাস এসকিউএল-র জন্য লেখা কিছু পুরানো কোডটি পর্যালোচনা করছিলাম এবং আমি সত্যিই নিফটির কিছু দেখেছি। আমার মনে আছে একটি কাস্টম ফাংশনটি দিনের মধ্যে এই কিছু কিছু করা, তবে আমি কী 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);
ফলাফলগুলি অবাক করে দিয়েছিল .. # ওল্ডস্কুলকুলের পথটি ছিল ব্যাপকভাবে: 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)
সুতরাং, এখানে কি চলছে। অ্যারে_অ্যাগ , কেন পরিকল্পনার এসকিউএল ভুডোর তুলনায় একটি অভ্যন্তরীণ ফাংশন এত ধীর?
Gcc দ্বারা সংকলিত x86_64-pc-linux- gnu- এ " পোস্টগ্রাইএসকিউএল 9.5.5 ব্যবহার করে (উবুন্টু 6.2.0-5ubuntu12) 6.2.0 20161005, -৪-বিট"
array_agg()
বা অনুরূপ সমষ্টিগত ফাংশন করতে পারেন মতো subquery সাথে এখনও লিভারেজ ইনডেক্স:SELECT ARRAY_AGG(c) FROM (SELECT c FROM t ORDER BY id) sub
। প্রতি-সমষ্টিগতORDER BY
ধারাটি যা আপনার উদাহরণে সূচক ব্যবহারকে বাধা দেয়। একটি অ্যারে কনস্ট্রাক্টর যখন একই সূচক (বা উভয়ই) ব্যবহার করতে পারে তার চেয়ে দ্রুতarray_agg()
হয়। এটা ঠিক বহুমুখী নয়। দেখুন: dba.stackexchange.com/a/213724/3684