CTE เทียบกับคิวรีย่อยเทียบกับตารางชั่วคราว
ข้อแลกเปลี่ยนด้านการทำให้เป็นรูปธรรม การนำกลับมาใช้ซ้ำ และพฤติกรรมของตัวปรับคิวรีให้เหมาะสม
CTE เทียบกับคิวรีย่อยเทียบกับตารางชั่วคราว เป็นบทเรียน Coding Interview Prep ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Coding Interview Prep และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Coding Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน
สามวิธีจัดการตรรกะเป็นขั้นตอน
เมื่อคำสั่งสอบถามต้องใช้ผลลัพธ์ระหว่างทาง คุณมีเครื่องมือที่ใช้กันทั่วไปสามแบบ ได้แก่ แบบสอบถามย่อย CTE และตารางชั่วคราว ผู้สัมภาษณ์มักขอให้คุณเปรียบเทียบเครื่องมือเหล่านี้ เพราะตัวเลือกที่คุณเลือกบ่งบอกว่าคุณเข้าใจการจัดเก็บผลลัพธ์ระหว่างทางและพฤติกรรมของตัวปรับแผนการทำงานหรือไม่
บทเรียนนี้จะสร้างกรอบการตัดสินใจที่คุณสามารถตอบได้แม้อยู่ภายใต้ความกดดัน
แบบสอบถามย่อย
แบบสอบถามย่อยคือคำสั่งสอบถามที่ฝังอยู่ภายในคำสั่งอื่น มักอยู่ใน FROM, WHERE หรือ SELECT โดยเป็นส่วนหนึ่งของคำสั่งเดียวกัน และตัวปรับแผนการทำงานจะมองคำสั่งเหล่านี้เป็นหน่วยเดียว
- ไม่จำเป็นต้องตั้งชื่อ แต่ตารางที่ได้จากคำสั่งย่อยจำเป็นต้องมีชื่อแทน
- ตัวปรับแผนการทำงานสามารถผสานแบบสอบถามย่อยเข้ากับคำสั่งภายนอกได้อย่างอิสระ
- จะยาวและอ่านยากเมื่อซ้อนกันลึกหลายระดับ
SELECT *
FROM (
SELECT customer_id, SUM(amount) AS total
FROM orders
GROUP BY customer_id
) t
WHERE t.total > 1000;CTE
CTE คือแบบสอบถามย่อยที่มีชื่ออยู่ในบล็อก WITH และมีขอบเขตอยู่ที่คำสั่งเดียว อ่านง่ายกว่าแบบสอบถามย่อยที่ซ้อนกันลึก และสามารถอ้างอิงได้หลายครั้ง
- มีชื่อกำกับ จึงบันทึกจุดประสงค์ไว้อย่างชัดเจน
- อ้างอิงได้มากกว่าหนึ่งครั้งภายในคำสั่งเดียวกัน
- ยังคงมีขอบเขตอยู่ที่คำสั่งเดียว แล้วจึงหายไป
WITH spend AS (
SELECT customer_id, SUM(amount) AS total
FROM orders
GROUP BY customer_id
)
SELECT *
FROM spend
WHERE total > 1000;ตารางชั่วคราว
ตารางชั่วคราวคือตารางจริงที่มีอยู่จริงและคงอยู่ตลอดการเชื่อมต่อหรือตลอดธุรกรรม คุณเติมข้อมูลลงในตารางด้วยคำสั่งหนึ่ง แล้วสอบถามข้อมูลด้วยคำสั่งแยกกันในภายหลัง
- คงอยู่ได้ตลอดหลายคำสั่งภายในการเชื่อมต่อเดียวกัน
- สร้างดัชนีและรวบรวมสถิติได้
- มีต้นทุนด้านการอ่านเขียนดิสก์และต้องล้างข้อมูลอย่างชัดเจน
CREATE TEMP TABLE spend AS
SELECT customer_id, SUM(amount) AS total
FROM orders
GROUP BY customer_id;
SELECT * FROM spend WHERE total > 1000;การจัดเก็บผลลัพธ์ระหว่างทาง: ความแตกต่างหลัก
แนวคิดสำคัญที่ผู้สัมภาษณ์ต้องการตรวจสอบคือการจัดเก็บผลลัพธ์ระหว่างทาง ซึ่งหมายถึงการเขียนผลลัพธ์ระหว่างทางลงในที่ใดที่หนึ่งจริงหรือไม่
- โดยทั่วไปแบบสอบถามย่อยและ CTE ไม่ได้ถูกจัดเก็บผลลัพธ์ระหว่างทาง ตัวปรับแผนการทำงานมักผสานทั้งสองอย่างเข้ากับคำสั่งหลัก
- ตารางชั่วคราวจะถูกจัดเก็บลงในพื้นที่จัดเก็บจริงเสมอ
- ฐานข้อมูลบางระบบอนุญาตให้คุณบังคับหรือปิดการจัดเก็บผลลัพธ์ของ CTE ด้วยคำแนะนำ
ขอบเขตกั้นการปรับแผนกับกับดักโพสต์เกรสแบบเดิม
ในอดีต PostgreSQL ปฏิบัติต่อ CTE ทุกรายการเสมือนเป็นขอบเขตกั้นการปรับแผน โดยจัดเก็บผลลัพธ์ของ CTE และขัดขวางการผลักเงื่อนไขลงไป ตั้งแต่โพสต์เกรส 12 เป็นต้นมา CTE แบบไม่เรียกตัวเองที่เรียบง่ายและถูกอ้างอิงครั้งเดียวจะถูกผสานเข้ากับคำสั่งโดยค่าเริ่มต้น โดยมีคำแนะนำ MATERIALIZED และ NOT MATERIALIZED สำหรับใช้เปลี่ยนพฤติกรรมนี้
การกล่าวถึงรายละเอียดนี้เป็นสัญญาณที่ดีว่าคุณมีความเข้าใจในระดับวิศวกรอาวุโส
WITH spend AS NOT MATERIALIZED (
SELECT customer_id, SUM(amount) AS total
FROM orders GROUP BY customer_id
)
SELECT * FROM spend WHERE total > 1000;การนำกลับมาใช้ซ้ำภายในคำสั่งเดียว
หากคุณอ้างอิงผลลัพธ์ระหว่างทางเดียวกันหลายครั้งในคำสั่งเดียว CTE อาจทำให้โค้ดอ่านง่ายกว่าการเขียนแบบสอบถามย่อยซ้ำ แต่ควรระวังว่า CTE ที่ถูกผสานเข้ากับคำสั่งอาจถูกคำนวณใหม่ทุกครั้งที่มีการอ้างอิง
เมื่อการคำนวณใหม่มีต้นทุนสูง การบังคับจัดเก็บผลลัพธ์ระหว่างทางหรือใช้ตารางชั่วคราวจะช่วยหลีกเลี่ยงการทำงานซ้ำสองครั้ง
การนำกลับมาใช้ซ้ำข้ามคำสั่ง
CTE และแบบสอบถามย่อยมีอายุอยู่เพียงคำสั่งเดียว หากคุณต้องใช้ผลลัพธ์เดียวกันในคำสั่งสอบถามที่แยกจากกันหลายคำสั่ง ตารางชั่วคราวคือเครื่องมือที่เหมาะสม
กรณีทั่วไปคือกระบวนการ ETL หลายขั้นตอนหรือรายงานที่สร้างชุดข้อมูลสำหรับเตรียมใช้งานขึ้นมาครั้งเดียว แล้วนำไปวิเคราะห์หลายแบบ การสร้างดัชนีให้ตารางชั่วคราวจะช่วยเร่งคำสั่งสอบถามถัดไปทุกคำสั่ง
การสร้างดัชนีและสถิติ
มีเพียงตารางชั่วคราวเท่านั้นที่เก็บดัชนีและสถิติใหม่ได้ สำหรับชุดข้อมูลระหว่างทางขนาดใหญ่ที่นำมาเชื่อมตารางหลายครั้ง ความสามารถนี้อาจเป็นปัจจัยชี้ขาด
- CTE/แบบสอบถามย่อย: ตัวปรับแผนการทำงานประเมินจากตารางต้นทาง
- ตารางชั่วคราว: คุณสามารถใช้
ANALYZEกับตารางและเพิ่มดัชนีที่ปรับให้เหมาะกับการเชื่อมตารางในภายหลังได้
ดังนั้น สำหรับผลลัพธ์ขนาดใหญ่ที่นำกลับมาใช้ซ้ำอย่างมาก ตารางชั่วคราวอาจให้ประสิทธิภาพดีกว่า แม้จะมีขั้นตอนเพิ่มเติม
กรอบการตัดสินใจ
คำตอบกระชับสำหรับการสัมภาษณ์งานมีดังนี้
- แบบสอบถามย่อย: ใช้ครั้งเดียว ซ้อนกันไม่ลึก และอ่านง่ายเพียงพอ
- CTE: ช่วยให้อ่านง่ายขึ้น หรือคุณอ้างอิงซ้ำหลายครั้งภายในคำสั่งเดียว
- ตารางชั่วคราว: นำกลับมาใช้ซ้ำข้ามคำสั่ง มีขนาดใหญ่มาก หรือต้องการดัชนีและสถิติ
โดยค่าเริ่มต้นให้เลือกใช้ CTE เพื่อความชัดเจน และเลือกใช้ตารางชั่วคราวเมื่อการจัดเก็บผลลัพธ์ระหว่างทางหรือการนำกลับมาใช้ซ้ำข้ามคำสั่งช่วยได้อย่างแท้จริง
วิธีอธิบายข้อแลกเปลี่ยน
หลีกเลี่ยงการกล่าวแบบสุดโต่ง เช่น 'CTE ช้ากว่าเสมอ' ให้พูดแทนว่า โดยทั่วไป CTE และแบบสอบถามย่อยจะถูกผสานเข้ากับคำสั่ง ดังนั้นจุดเด่นจึงอยู่ที่ความอ่านง่าย ส่วนตารางชั่วคราวจะถูกจัดเก็บผลลัพธ์จริง และคุ้มค่าเมื่อฉันนำผลลัพธ์ขนาดใหญ่กลับมาใช้ซ้ำข้ามคำสั่ง หรือต้องการดัชนี
การยอมรับว่าพฤติกรรมดังกล่าวขึ้นอยู่กับระบบฐานข้อมูล และในโพสต์เกรสยังขึ้นอยู่กับเวอร์ชันด้วย แสดงให้เห็นว่าคุณเข้าใจเนื้อหาอย่างแท้จริง
ตรวจสอบความเข้าใจ
เลือกสถานการณ์ที่ตารางชั่วคราวเป็นตัวเลือกที่ดีกว่าอย่างชัดเจน
ทบทวน: CTE กับแบบสอบถามย่อยและตารางชั่วคราว
การเลือกขึ้นอยู่กับการจัดเก็บผลลัพธ์ระหว่างทางและขอบเขต
- แบบสอบถามย่อยและ CTE: โดยทั่วไปถูกผสานเข้ากับคำสั่ง มีขอบเขตอยู่ที่คำสั่งเดียว และเลือกใช้เพื่อความอ่านง่าย
- CTE ช่วยเพิ่มการตั้งชื่อและการนำกลับมาใช้ซ้ำภายในคำสั่งเดียว
- ตารางชั่วคราว: ถูกจัดเก็บผลลัพธ์จริงเสมอ คงอยู่ข้ามคำสั่ง และสร้างดัชนีได้
- โพสต์เกรส 12 ขึ้นไปจะผสาน CTE แบบง่ายเข้ากับคำสั่ง ให้ใช้คำแนะนำ MATERIALIZED เพื่อควบคุมพฤติกรรมนี้
ถัดไป: ปรับโครงสร้างคำสั่งสอบถามที่ซ้อนกันยุ่งเหยิงให้เป็น CTE ที่อ่านง่าย
คำถามที่พบบ่อย
บทเรียน “CTE เทียบกับคิวรีย่อยเทียบกับตารางชั่วคราว” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “CTE เทียบกับคิวรีย่อยเทียบกับตารางชั่วคราว” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Coding Interview Prep ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Coding Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “CTE เทียบกับคิวรีย่อยเทียบกับตารางชั่วคราว”
ข้อแลกเปลี่ยนด้านการทำให้เป็นรูปธรรม การนำกลับมาใช้ซ้ำ และพฤติกรรมของตัวปรับคิวรีให้เหมาะสม คุณปฏิบัติ Coding Interview Prep ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Coding Interview Prep หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Coding Interview Prep บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “CTE เทียบกับคิวรีย่อยเทียบกับตารางชั่วคราว” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Coding Interview Prep นี้ได้ไหม
ได้ บทเรียน Coding Interview Prep ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- เขียน CTE แรกของคุณ
- ต่อ CTE หลายรายการ
- CTE เทียบกับคิวรีย่อยเทียบกับตารางชั่วคราว
- ปรับโครงสร้างคิวรีซ้อนให้เป็น CTE