Oracle and WITH clause

สืบเนื่องด้วยมีปัญหาเรื่อง Performance ในการทำงานกับข้อมูล transaction log เจ้านายท่านก็ให้ไปหา Solution มาแก้ปัญหา แต่เนื่องด้วยความสามารถน้อยไปหน่อย เจ้านายก็เลยไปวานให้ DBA แก้ไขปัญหาให้ (นั่นละหน้าที่จริงๆของ DBA) DBA ก็ให้เปลี่ยนพวก Sub Query ที่เรียกใช้บ่อยๆ และ ไม่ได้เปลี่ยน Parameter ในเงื่อนไข where ให้มาใช้ WITH แทน จาการอ่านมาคร่าวๆ WITH จะสร้างข้อมูลของ Query ขึ้นมาโดยทำงานคล้ายๆ กับ Global temporary tables (GTT) (อย่าถามผมเลย ผมไม่รู้มันคืออะไรเหมือนกัน) รูปแบบของคำสั่ง WITH เป็นดังนี้ครับ
1. แบบประกาศตัวเดียว

WITH <alias_name> AS (subquery_sql_statement)
SELECT <column_name_list> FROM <alias>;

เช่น

WITH QR AS (SELECT col1,col2 FROM tb)
SELECT col1 FROM QR;

2. แบบประกาศหลายๆตัว

WITH <alias_one> AS 
  (subquery_sql_statement),
    <alias_two> AS
  (sql_statement_from_alias_one)
SELECT <column_name_list>
FROM <alias_one>, <alias_two>
WHERE <join_condition>;

ตัวอย่างเช่น

WITH Q1 AS
  (SELECT col1 FROM tb1),
  Q2 AS
  (SELECT col2 FROM tb2)
SELECT /*+ MATERIALIZE */ *
FROM Q1, Q2
WHERE Q1.col1 = Q2.col2;

แหล่งข้อมูลที่ลอกมา
Oracle With Clause
Oracle SQL-99 WITH clause

  1. แล้วเร็วขึ้นไหมครับ ผมก็เจอปัญหานี้เหมือนกัน แต่ต่างกันที่ DB ของผมแค่ mySQL และอีกอย่าง DBA ก็ไม่มีีกับเขา เห้อเหนื่อยแต้

  2. ในกรณีนี้เร็วขึ้นอย่างชัดเจนครับ แต่คงไม่สามารถนำไปใช้ได้กับทุกกรณีครับ สำหรับ MySQL นั้นจูนดีๆ เร็วไม่เบาครับลองหาตัวอย่างการใช้งานดูครับ

  1. No trackbacks yet.