PostgreSQL Common Table Expressions เทียบกับตารางชั่วคราวหรือไม่


11

เอกสาร PostgreSQL กับการแสดงตัวอย่างต่อไปนี้:

WITH regional_sales AS (
        SELECT region, SUM(amount) AS total_sales
        FROM orders
        GROUP BY region
     ), top_regions AS (
        SELECT region
        FROM regional_sales
        WHERE total_sales > (SELECT SUM(total_sales)/10 FROM regional_sales)
     )
SELECT region,
       product,
       SUM(quantity) AS product_units,
       SUM(amount) AS product_sales
FROM orders
WHERE region IN (SELECT region FROM top_regions)
GROUP BY region, product;

นอกจากนี้ยังบันทึก:

คุณสมบัติที่มีประโยชน์ของการสืบค้นด้วยแบบสอบถามนั้นจะถูกประเมินเพียงครั้งเดียวต่อการประมวลผลของการสืบค้นหลักแม้ว่าจะถูกอ้างถึงมากกว่าหนึ่งครั้งโดยการสืบค้นหลักหรือการสืบค้นด้วยคำสั่ง Sibling WITH

ฉันเห็นว่าWITHสามารถใช้สำหรับสิ่งอื่น ๆ เช่นการประเมินแบบเรียกซ้ำ แต่ในตัวอย่างข้างต้นมีความแตกต่างที่สำคัญระหว่างการใช้WITHและการสร้างตารางชั่วคราวหรือไม่?


เมื่อคุณใช้ CTE เพื่อสร้างคิวรีการเพิ่มคอลัมน์อื่นSELECTในWITHเป็นเพียงพิมพ์ชื่อและเรียกใช้ซ้ำ ขณะที่ตารางชั่วคราวมันจะใช้เวลาและDROP CREATEในทางกลับกันถ้าคุณสร้างแบบสอบถามและคุณจะนำข้อมูลสแตติกมาใช้ซ้ำหลายครั้งการสร้างตารางชั่วคราวด้วยดัชนีนั้นมีประโยชน์อย่างมากต่อ CTE
Vao Tsun

@VaoTsun หากใช้TEMPORARY TABLEกับON COMMIT DROPภายในแบบสอบถามก็เป็นเพียงเรื่องของการแก้ไขแบบสอบถามและเรียกใช้อีกครั้งใช่มั้ย postgresql.org/docs/9.6/static/sql-createtable.html
Nathan Long

คำตอบ:


16

มีความแตกต่างเล็กน้อยบางประการ แต่ไม่มีอะไรรุนแรง:

  • คุณสามารถเพิ่มดัชนีในตารางชั่วคราว
  • มีตารางชั่วคราวสำหรับอายุการใช้งานของเซสชัน (หรือถ้าON COMMIT DROPธุรกรรม) WITHจะมีการกำหนดขอบเขตให้กับแบบสอบถามอย่างเคร่งครัด
  • หากเคียวรีเรียกใช้ฟังก์ชัน / โพรซีเดอร์จะสามารถดูตารางชั่วคราว แต่ไม่สามารถมองเห็นWITHนิพจน์ตารางใด ๆ ได้
  • ตาราง temp สร้างVACUUMงานในแคตตาล็อกระบบที่WITHไม่จำเป็นต้องใช้การปัดเศษพิเศษเพื่อสร้าง / เติมและต้องใช้งานพิเศษในการจัดการแคชของเซิร์ฟเวอร์ดังนั้นจึงมีประสิทธิภาพน้อยกว่าเล็กน้อย

โดยรวมแล้วคุณควรเลือกที่WITHจะสร้างตารางชั่วคราวยกเว้นว่าคุณรู้ว่าคุณจะได้รับประโยชน์จากการสร้างดัชนี

อย่างไรก็ตามตัวเลือกอื่นซึ่งเป็นคิวรีย่อยในFROMประโยคมีข้อดีที่แตกต่างกันมาก โดยเฉพาะอย่างยิ่งมันสามารถถูก inline และ qualifier สามารถดึงขึ้น / ผลักลง ผมเขียนเกี่ยวกับเรื่องนี้ในบทความบล็อกล่าสุด


มุมมองและมุมมองชั่วคราวคืออะไร
CMCDragonkai

1
ค่อนข้างจะอยู่ระหว่าง แต่ใกล้กับตารางอุณหภูมิมากกว่าคำ CTE ไม่มีดัชนี กำหนดขอบเขต สามารถมองเห็นได้ถึงฟังก์ชั่น / ขั้นตอน ต้องการเครื่องดูดฝุ่นแค็ตตาล็อก
Craig Ringer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.