แก้ไขผลลัพธ์หรือไม่
ก่อนปิด: ความถูกต้อง คุณต้องการที่จะผลิตชุดขององค์ประกอบที่ไม่ซ้ำกัน? แบบสอบถามปัจจุบันของคุณไม่ได้ทำเช่นนั้น ฟังก์ชั่นuniq()
จากโมดูลintarrayสัญญาว่า:
ลบรายการที่อยู่ติดกัน
เช่นเดียวกับคำแนะนำในคู่มือคุณจะต้อง:
SELECT l.d + r.d, uniq(sort(array_agg_mult(r.arr)))
FROM ...
นอกจากนี้ยังให้คุณเรียงลำดับ - สมมติว่าคุณต้องการที่คุณไม่ได้ชี้แจง
ฉันเห็นว่าคุณมี sort()
ในซอของคุณดังนั้นนี่อาจเป็นข้อผิดพลาดในคำถามของคุณ
Postgres 9.5
ไม่ว่าจะด้วยวิธีใดคุณจะรัก Postgres 9.5 ใหม่ (รุ่นเบต้าปัจจุบัน) มันให้ความสามารถในการarray_agg_mult()
ออกนอกกรอบและเร็วกว่ามาก:
นอกจากนี้ยังมีการปรับปรุงประสิทธิภาพอื่น ๆ สำหรับการจัดการอาเรย์
สอบถาม
วัตถุประสงค์หลักของarray_agg_mult()
การรวมอาเรย์หลายมิติ แต่คุณจะสร้างอาเรย์ 1 มิติเท่านั้น อย่างน้อยฉันก็จะลองใช้คำค้นหาอื่น:
SELECT l.d + r.d AS d_sum, array_agg(DISTINCT elem) AS result_arr
FROM left2 l
JOIN right2 r USING (t1)
, unnest(r.arr) elem
GROUP BY 1
ORDER BY 1;
ซึ่งตอบคำถามของคุณด้วย:
ฟังก์ชันการรวมสามารถลบข้อมูลที่ซ้ำกันได้โดยตรงหรือไม่
DISTINCT
ใช่มันสามารถมี แต่นั่นไม่เร็วกว่าuniq()
สำหรับอาร์เรย์จำนวนเต็มซึ่งได้รับการปรับให้เหมาะสมสำหรับอาร์เรย์จำนวนเต็มในขณะที่DISTINCT
เป็นข้อมูลทั่วไปสำหรับชนิดข้อมูลที่มีคุณสมบัติทั้งหมด
ไม่ต้องการintarray
โมดูล อย่างไรก็ตามผลลัพธ์ไม่จำเป็นต้องจัดเรียง Postgres ใช้ที่แตกต่างกันสำหรับอัลกอริทึมDISTINCT
(IIRC) ORDER BY
ชุดใหญ่ถกกันโดยทั่วไปแล้วผลจะไม่เรียงจนกว่าคุณจะเพิ่มอย่างชัดเจน หากคุณต้องการอาร์เรย์ที่เรียงลำดับคุณสามารถเพิ่มORDER BY
ฟังก์ชันรวมได้โดยตรง:
array_agg(DISTINCT elem ORDER BY elem)
แต่โดยทั่วไปแล้วจะช้ากว่าการป้อนข้อมูลที่จัดเรียงไว้ล่วงหน้าไปarray_agg()
แล้ว ดังนั้นฉันจะจัดเรียงในแบบสอบถามย่อยแล้วรวม:
SELECT d_sum, uniq(array_agg(elem)) AS result_arr
FROM (
SELECT l.d + r.d AS d_sum, elem
FROM left2 l
JOIN right2 r USING (t1)
, unnest(r.arr) elem
ORDER BY 1, 2
) sub
GROUP BY 1
ORDER BY 1;
นี่เป็นตัวแปรที่เร็วที่สุดในการทดสอบคร่าวๆของฉันใน Postgres 9.4
SQL Fiddleตามที่คุณให้ไว้
ดัชนี
ฉันไม่เห็นว่ามีโอกาสมากสำหรับดัชนีใด ๆ ที่นี่ ตัวเลือกเดียวจะเป็น:
CREATE INDEX ON right2 (t1, arr);
เหมาะสมถ้าคุณได้รับการสแกนดัชนีเท่านั้นจากนี้ - ซึ่งจะเกิดขึ้นหากตารางต้นแบบright2
นั้นกว้างกว่าคอลัมน์ทั้งสองนี้อย่างมากและการตั้งค่าของคุณมีคุณสมบัติในการสแกนเฉพาะดัชนีเท่านั้น รายละเอียดใน Postgres Wiki
right2.arr
เป็นโมฆะเช่นคีมาสาธิตให้เห็นของคุณ? คุณต้องการอาร์เรย์ที่เรียงลำดับตามผลลัพธ์หรือไม่