ผู้พัฒนา C # ได้รับการสนับสนุนโดยฝ่ายบริหารให้เขียนขั้นตอนการจัดเก็บ SQL Server มักจะสร้างขั้นตอนเช่นนี้
create table #t1 (...);
insert into #t1 Select ... from table_a where ...;
insert into #t1 Select ... from table_b where ...;
update #t1 Set ... = ... where ...
Select * from #t1;
คำสั่งเดียวค่อนข้างง่ายและวิธีนี้ทำให้พวกเขาผลิตผลลัพธ์ที่ถูกต้อง
บ่อยครั้งที่งานของฉันคือการโยกย้ายขั้นตอนดังกล่าวไปยัง Oracle
ลองหน้าข้อเท็จจริงต่อไปนี้
- สำหรับตารางชั่วคราวที่แตกต่างกันใน SQL Server นั้นมีความเป็นอิสระอย่างสมบูรณ์และสามารถมีโครงสร้างแบบเฉพาะกิจได้
- ตารางทั่วโลกของ Oracle เป็นออบเจ็กต์ร่วมและทั้งหมดใช้โครงสร้างตารางร่วมกันมาก การแก้ไขโครงสร้างนี้เป็นไปไม่ได้ในขณะที่ใช้งานได้ทุกที่
สิ่งหนึ่งที่ฉันเรียนรู้จาก Oracle dba คือการหลีกเลี่ยงการใช้ตารางชั่วคราวทุกครั้งที่ทำได้ แม้แต่ประสิทธิภาพบนเซิร์ฟเวอร์ SQL ก็ยังได้รับประโยชน์จากการดัดแปลง
แทนที่เม็ดมีดแต่ละอันด้วยสหภาพ
ในกรณีที่ง่ายที่สุดสิ่งที่กล่าวมาสามารถเปลี่ยนเป็นสิ่งที่ชอบ
select case when ... then ... end, ... from table_a where ...
union
select case when ... then ... end, ... from table_b where ...
Order by ...;
การใช้ฟังก์ชั่น
ทั้งฟังก์ชั่นสเกลาร์และฟังก์ชั่นที่มีคุณค่าของตารางสามารถช่วยเปลี่ยนโพรซีเดอร์ของคุณให้เป็นคิวรีเดียวของแบบฟอร์มด้านบน
นิพจน์ตารางทั่วไป aka แฟ็คเคอร์ย่อย
Factoring Subquery เกือบจะเป็นออราเคิลที่ดีที่สุดที่มีให้เพื่อหลีกเลี่ยงตารางชั่วคราว การใช้การโยกย้ายของ SQL Server ไปยัง Oracle นั้นค่อนข้างง่าย สิ่งนี้ต้องใช้ SQL Server 2005 ขึ้นไป
การปรับเปลี่ยนเหล่านี้ปรับปรุงรุ่นของ SQL Server และในหลาย ๆ กรณีทำให้การโยกย้ายตรงไปข้างหน้า ในกรณีอื่น ๆ หันไปใช้ตารางชั่วคราวทั่วโลกทำให้สามารถทำการย้ายข้อมูลในเวลาที่กำหนด แต่ก็ไม่เป็นที่น่าพอใจ
มีวิธีอื่นอีกหรือไม่ในการหลีกเลี่ยงการใช้ตารางชั่วคราวทั่วโลกใน Oracle?