แก้ไขผลลัพธ์หรือไม่
ก่อนปิด: ความถูกต้อง คุณต้องการที่จะผลิตชุดขององค์ประกอบที่ไม่ซ้ำกัน? แบบสอบถามปัจจุบันของคุณไม่ได้ทำเช่นนั้น ฟังก์ชั่น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เป็นโมฆะเช่นคีมาสาธิตให้เห็นของคุณ? คุณต้องการอาร์เรย์ที่เรียงลำดับตามผลลัพธ์หรือไม่