Attualità e Information Technology

July 11, 2007

Sempre sulla clausola OUTPUT

Filed under: IT, SQL

Ripensando alla clausola OUTPUT introdotta in SQL Server 2005 (si veda post precedente), volevo sottolineare quanto agevoli il lavoro quando si tratta di fare più insert nella stessa istruzione dentro ad una tabella con per chiave una identity.

Mi spiego meglio.

Esempio: abbiamo una tabella tab1 con due colonne (campoA e campoB), e una tabella tab2 con tre colonne (id, campoA, campoB) dove il primo campo (id) è chiave ed è definito come identity. Entrambe le tabelle hanno un certo numero di record. Vogliamo inserire i record che abbiamo in tab1 in tab2 e vogliamo sapere quali indici sono stati assegnati a questi nuovi record.

Senza usare la clausola OUTPUT la maniera più veloce è ricorrere ad un trigger che legga la tabella “speciale” Inserted e ci restituisca i record in essa contenuti. Veloce, ma sicuramente una scelta discutibile. Usare un trigger per una cosa del genere non è proprio il massimo, anzi. Diciamolo pure: è una porcata.

Altra possibilità, sempre senza usare la clausola di OUTPUT, e che risulti meno porcata è scrivere ovviamente una query abbastanza articolata. Perchè dico articolata? Per il semplice fatto che in tab2 abbiamo già dei record e in tab1 non abbiamo una chiave definita, quindi individuare i record appena inseriti non è banale.

Veniamo quindi alla clausola OUTPUT, che come avrete intuito mi ha stregato. Sfruttandola la query di nostro interesse diventra estremamente banale, una cosa del tipo:

INSERT INTO tab2 (campoA, campoB)
OUTPUT Inserted.id, Inserted.campoA, Inserted.campoB
SELECT campoA, campoB FROM tab1

Insomma, come si fa a non amare questa istruzione? ;)

Technorati tags , , ,

AddThis Social Bookmark Button

Bulk insert - incrementare la velocità

Filed under: IT, SQL

Segnalo un paio di post di Alberto Ferrari relativi entrambi a come incrementare la velocità di bulk insert sia in SSIS che in semplice T-SQL in presenza di indici clustered. Anticipo che il trucco risiede sempre nell’ordinare i dati in fase di lettura pre-inserimento ;)

Making Fast Load really fast on clustered indexed tables with SSIS
Bulk Insert of sorted data

Technorati tags , , , , ,

AddThis Social Bookmark Button
   

Get free blog up and running in minutes with Blogsome | Theme designs available here