Vom Management ermutigte C # -Entwickler, gespeicherte SQL Server-Prozeduren zu schreiben, erzeugen häufig solche Prozeduren
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;
Die einzelnen Anweisungen sind recht einfach und führen mit dieser Methode zu korrekten Ergebnissen.
Oft besteht meine Aufgabe darin, solche Prozeduren nach Oracle zu migrieren.
Stellen wir uns den folgenden Fakten.
- Verschiedene temporäre Tabellen in SQL Server sind völlig unabhängig und können jede Ad-hoc-Struktur haben.
- Globale allgemeine Oracle-Tabellen sind globale Objekte, und alle Verwendungszwecke haben dieselbe Tabellenstruktur. Das Ändern dieser Struktur ist nicht möglich, solange sie überall verwendet wird.
Eines der Dinge, die ich von einer Oracle-Datenbank gelernt habe, war, die Verwendung temporärer Tabellen zu vermeiden, wann immer dies möglich ist. Sogar die Leistung auf SQL Server profitiert von solchen Änderungen.
Ersetzen Sie die einzelnen Einsätze durch Gewerkschaften
Im einfachsten Fall kann das Obige in so etwas umgewandelt werden
select case when ... then ... end, ... from table_a where ...
union
select case when ... then ... end, ... from table_b where ...
Order by ...;
Verwendung von Funktionen
Sowohl Skalarfunktionen als auch Tabellenwertfunktionen können dazu beitragen, Ihre Prozedur in eine einzige Abfrage des obigen Formulars umzuwandeln.
Allgemeine Tabellenausdrücke, auch bekannt als Subquery Factoring
Subquery Factoring ist fast das Beste, was Oracle zu bieten hat, um temporäre Tabellen zu vermeiden. Mit ihm ist die Migration von SQL Server zu Oracle wieder recht einfach. Dies erfordert SQL Server 2005 und höher.
Diese Änderungen verbessern die SQL Server-Version und machen in vielen Fällen die Migration einfach. In anderen Fällen ermöglicht der Rückgriff auf globale temporäre Tabellen die Migration in einer begrenzten Zeit, ist jedoch weniger zufriedenstellend.
Gibt es weitere Möglichkeiten, die Verwendung globaler temporärer Tabellen in Oracle zu vermeiden?