Nhà phát triển C # được ban quản lý khuyến khích viết các thủ tục lưu trữ SQL Server thường tạo ra các thủ tục như thế này
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;
Câu lệnh đơn khá đơn giản và phương pháp này làm cho chúng tạo ra kết quả chính xác.
Thường thì nhiệm vụ của tôi là di chuyển các thủ tục như vậy sang Oracle.
Hãy đối mặt với sự thật sau đây.
- Để các bảng tạm thời khác nhau trong SQL Server hoàn toàn độc lập và có thể có bất kỳ cấu trúc ad hoc nào.
- Các bảng chung toàn cầu của Oracle là các đối tượng toàn cầu và tất cả đều sử dụng nhiều chia sẻ cùng một cấu trúc bảng. Sửa đổi cấu trúc này là không thể, trong khi nó được sử dụng ở bất cứ đâu.
Một trong những điều tôi học được từ một dba của Oracle, là tránh sử dụng các bảng tạm thời bất cứ khi nào có thể. Ngay cả hiệu suất trên máy chủ SQL cũng được hưởng lợi từ các sửa đổi như vậy.
Thay thế các phần chèn riêng lẻ bằng các công đoàn
Trong trường hợp đơn giản nhất, ở trên có thể được chuyển đổi thành một cái gì đó như
select case when ... then ... end, ... from table_a where ...
union
select case when ... then ... end, ... from table_b where ...
Order by ...;
Sử dụng các chức năng
Cả hai hàm vô hướng và các hàm có giá trị bảng có thể giúp chuyển đổi thủ tục của bạn thành một truy vấn duy nhất của biểu mẫu trên.
Biểu thức bảng chung aka Bao thanh toán phụ
Subquery Factoring gần như là thứ tốt nhất mà Oracle cung cấp để tránh các bảng tạm thời. Sử dụng nó, việc di chuyển SQL Server sang Oracle một lần nữa khá dễ dàng. Điều này đòi hỏi SQL Server 2005 trở lên.
Những sửa đổi này cải thiện phiên bản SQL Server và trong nhiều trường hợp làm cho việc di chuyển thẳng tiến. Trong các trường hợp khác, sử dụng các bảng tạm thời toàn cầu để có thể thực hiện di chuyển trong thời gian giới hạn, nhưng nó ít thỏa mãn hơn.
Có cách nào khác để tránh việc sử dụng các bảng tạm thời toàn cầu trong Oracle không?