การดัดแปลงเป็น GEQO (การเพิ่มประสิทธิภาพการสืบค้นเชิงพันธุกรรม) ของ PostgreSQL


16

ฉันต้องการใช้งานฟังก์ชั่นที่สอดคล้องกับฟังก์ชัน GEQO ของ PostgreSQL ฉันเข้าใจว่าวิธีการของ GEQO คือการเข้ารหัสแผนแบบสอบถามเป็นสตริงจำนวนเต็มและ GEQO สร้างลำดับการเข้าร่วมที่เป็นไปได้เหล่านี้โดยการสุ่ม ที่มา: http://www.postgresql.org/docs/9.3/static/geqo-pg-intro.html

คำถามของฉัน: จะแก้ไขฟังก์ชั่น GEQO ได้อย่างไรหากฉันทราบลำดับการรวมที่ถูกต้องอย่างชัดเจนเพื่อที่ฉันจะได้ไม่ต้องค้นหาลำดับการรวมที่แตกต่างกัน ตัวอย่างเช่นหากฉันรู้ว่าวิธีที่ดีที่สุดในการเข้าร่วม 4 ความสัมพันธ์คือ 4-1-3-2 ฉันไม่จำเป็นต้องตรวจสอบการเปลี่ยนลำดับอื่น ๆ

ไม่มีข้อมูลที่ดีเกี่ยวกับการใช้ GEQO ใน PostgreSQL PostgreSQL ให้มุมมองโดยรวมของฟังก์ชัน GEQO เท่านั้น แต่ไม่ได้อธิบายอะไรมาก

หรือฉันสามารถใช้ฟังก์ชันนี้ใน standard_join_search () ตัวเองโดยไม่ใช้ GEQO ได้หรือไม่


3
ดูเหมือนว่าคุณต้องการใช้คำแนะนำการสืบค้น ทั้งหมดนี้เป็นเรื่องดีและดี แต่คุณไม่ควรคาดหวังว่าจะได้รับการยอมรับการเปลี่ยนแปลงในแกนประมวลผลของ PostgreSQL เพราะชุมชนโครงการไม่ใช่สิ่งที่คุณเรียกว่าเป็นแฟนตัวยงของคำแนะนำการสืบค้น หากคุณจริงจังกับเรื่องนี้คุณจะต้องอ่านโค้ดตัววางแผนคิวรีสักหน่อยและคุณจะต้องหาวิธีที่จะส่งคำแนะนำของคุณจากเครื่องมือแยกวิเคราะห์ไปจนถึงนักเขียนและนักวางแผน ฉันไม่เห็นคำตอบที่ง่ายและรวดเร็วที่นี่ สิ่งที่คุณต้องการทำในที่สุดคือบังคับให้เลือกเส้นทางเฉพาะในการวางแผน / เพิ่มประสิทธิภาพ
Craig Ringer

อ่าใช่พวกเขาสงสัยเกี่ยวกับคำแนะนำการสืบค้น ฉันได้อ่านรหัสผู้วางแผนเสร็จแล้วและดูเหมือนว่า GEQO จะเป็นวิธีในการลดการเปลี่ยนแปลงในแกนหลักที่มีอยู่ให้น้อยที่สุด
2761431

2
นั่นคือสิ่งที่คุณพยายามที่จะบรรลุการใช้คำแนะนำแบบสอบถามเพื่อบังคับให้เข้าร่วมการสั่งซื้อ? ถ้าเป็นเช่นนั้นให้ดูว่ามีคนอื่นใช้งานแล้วหรือไม่ คุณควรพิจารณาด้วยว่าทำไมคุณถึงต้องการทำไมนักวางแผนกำลังเลือกผิดตั้งแต่แรก พิจารณาสร้างกรณีทดสอบในตัวเองและรายงานผลการปฏิบัติงานกับ pgsql
Craig Ringer

3
มีpg_hint_plan : en.sourceforge.jp/projects/pghintplanแต่ฉันไม่ได้ใช้ หนึ่ง dba บอกฉันว่ามันทำงานบน 9.2 นอกจากนี้ยังมีบทความในรัสเซียเกี่ยวกับเรื่องนี้habrahabr.ru/post/169751
ckorzhik

คำตอบ:


1

วิธีหนึ่งที่คุณสามารถทำได้โดยไม่ต้องไปยุ่งกับ GEKO คือการใช้ CTE

CTE เป็นอุปสรรคในการปรับให้เหมาะสมดังนั้นคุณสามารถรวมการรวมไว้ใน CTE ตามลำดับที่คุณต้องการและ PG จะถูกบังคับให้ทำเช่นนั้น

ตัวอย่างเช่นถ้าเราต้องการบังคับให้ฐานข้อมูลเข้าร่วม t1 กับ t2 ก่อนและจากนั้นด้วย t4 เราสามารถเรียกใช้บางสิ่งเช่น:

explain 
with j1 as (select *,t1.c4 as t1c4 from t1 join t2 on (t1.c2=t2.id))
    ,j2 as (select * from j1 join t4 on (t1c4=t4.id))
select * from j2;

สิ่งนี้จะส่งผลให้:

                                  QUERY PLAN                                   
-------------------------------------------------------------------------------
CTE Scan on j2  (cost=51485.00..67785.00 rows=815000 width=64)
CTE j1
 ->  Hash Join  (cost=3473.00..14521.00 rows=815000 width=40)
       Hash Cond: (t2.id = t1.c2)
       ->  Seq Scan on t2  (cost=0.00..26.30 rows=1630 width=20)
       ->  Hash  (cost=1637.00..1637.00 rows=100000 width=20)
             ->  Seq Scan on t1  (cost=0.00..1637.00 rows=100000 width=20)
CTE j2
 ->  Hash Join  (cost=289.00..36964.00 rows=815000 width=64)
       Hash Cond: (j1.t1c4 = t4.id)
       ->  CTE Scan on j1  (cost=0.00..16300.00 rows=815000 width=44)
       ->  Hash  (cost=164.00..164.00 rows=10000 width=20)
             ->  Seq Scan on t4  (cost=0.00..164.00 rows=10000 width=20)
(13 rows)

นี่เป็นเพียงตัวอย่างคุณสามารถเปลี่ยนได้ตามต้องการ - ในกรณีใด ๆ PG ไม่สามารถเปลี่ยนลำดับระหว่าง CTE ที่แตกต่างกัน

หวังว่าจะช่วย :)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.