Lo sviluppatore di C # incoraggiato dalla direzione a scrivere le stored procedure di SQL Server spesso produce procedure come questa
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;
Le singole affermazioni sono piuttosto semplici e questo metodo consente loro di produrre risultati corretti.
Spesso il mio compito è migrare tali procedure su Oracle.
Ammettiamo i seguenti fatti.
- Le diverse tabelle temporanee in SQL Server sono completamente indipendenti e possono avere qualsiasi struttura ad hoc.
- Le tabelle comuni globali Oracle sono oggetti globali e tutti gli utilizzi condividono in gran parte la stessa struttura di tabelle. La modifica di questa struttura è impossibile, mentre viene utilizzata ovunque.
Una delle cose che ho imparato da un dba di Oracle è stata quella di evitare l'uso di tabelle temporanee ogni volta che è possibile. Anche le prestazioni sul server SQL beneficiano di tali modifiche.
Sostituire i singoli inserti con i sindacati
Nel caso più semplice, quanto sopra può essere trasformato in qualcosa del genere
select case when ... then ... end, ... from table_a where ...
union
select case when ... then ... end, ... from table_b where ...
Order by ...;
Uso di funzioni
Entrambe le funzioni scalari e le funzioni con valori di tabella possono aiutare a trasformare la procedura in una singola query del modulo precedente.
Espressioni di tabella comuni, ovvero il factoring di subquery
Il factoring di subquery è quasi il migliore che Oracle abbia da offrire per evitare tabelle temporanee. Usarlo la migrazione di SQL Server a Oracle è di nuovo piuttosto semplice. Ciò richiede SQL Server 2005 e versioni successive.
Queste modifiche migliorano la versione di SQL Server e in molti casi rendono semplice la migrazione. In altri casi il ricorso a tabelle temporanee globali consente di eseguire la migrazione in un tempo limitato, ma è meno soddisfacente.
Esistono altri modi per evitare l'uso di tabelle temporanee globali in Oracle?