Ssis o store per inserimento massicio di record

lunedì 02 novembre 2009 - 11.12

memmo77 Profilo | Expert

Salve. Mi trovo in questa situazione. Ho un grosso elenco di record di cui devo verificare i campi presenti. Elenco un piccolo esempio:

06/2004 ciao
09/2004 pluto
12/2004 caio
03/2005 null
06/2005 null
09/2005 null
12/2005 null
03/2006 ciccio

la funzione dovrebbe riempire i "buchi" che sono presenti dal 03/2005 al 12/2005 con il dato precedente la data più piccola, nell'esempio, con caio al 12/2004.
Mi chiedevo se risolvere con un ssis o con una stored.
Ho solo notato, iniziando a farla con la seconda che il processo è abbastanza lento.
Col ssis, lavorando in memoria dovrei recuperare qualcosa, almeno credo.
Pensavo di leggere la tabella da aggiornare ciclandola con un contenitore ciclo foreach. Salvare i record su delle variabili e su altre di appoggio. Dentro uno script verificare se il successivo sia null. Se si inserisco i dati di appoggio.
Ora ho questo dubbio :D. Dove metto questi record, prima di entrare nel flusso dati per poi inserirli nel db? Grazie, spero di essere stato chiaro.


speedx Profilo | Junior Member

Ciao, io "descriverei" il processo con un SSIS e farei in questo modo se ho ben capito il tuo problema.
1) Estrarrei i buchi dall'elenco delle tue date che vuoi caricare.
2) Ciclerei per ogni data, lanciando, magari una stored procedure, che mi ritorna la data necessaria per riempire il "buco"
3) Leggerei i dati per riempire il buco dalla apposita tabella e li inserirei nella destinazione.
Il processo dovrebbe essere abbastanza rapido...dipende sempre dal quantitativo di dati e da eventuali vincoli sulle tabelle in scrittura.
Consiglio controllare di avere definito indici corretti sulla tabella che velocizzino la lettura.
Per velocizzare la scrittura, utilizzare lock esclusivo e/o disabilitare eventuali CHECK constraint e riabilitarli al termine del caricamento.

Spero di esserti stato utile
Ciao


//// Marcello C.

memmo77 Profilo | Expert

Ho provato come dicevi te, ho impostato il ssis, ma la prima select mi produce 8700 buchi che poi dovrei ciclare .
Ci mette un secolo. Come potrei risolvere?

speedx Profilo | Junior Member

Il numero dei buchi non è esagerato... se ci mette un sacco di tempo penso sia più dovuto al tempo effettivo di caricamento dei dati....
Quanto tempo impiega a leggere i dati ed a scrivere per colmare un buco?
hai controllato che le query che utilizzi per la lettura dei dati siano veloci...
hai FK sulla tabella di destinazione?

una cosa che non ti ho chiesto è se la tabella è partizionata... magari proprio per la data...
se fosse così puoi utilizzare lo switch in della partizione...

//// Marcello C.

memmo77 Profilo | Expert

BEH considera che si fa sempre 87000 select, ognuna con la data selezionata. Se le cicla tutte. No no le tabelle sono ben legate tra loro e la struttura è anche abbastanza semplice.

speedx Profilo | Junior Member

Ciao, se le tabelle sono connesse tra loro, ovvero esistono delle foreign key, questo rallenta gli inserimenti perchè per ogni record che il SSIS/stp scrive questi vincoli vengono verificati.
Io mi occupo di datawarehouse e business intelligence, e spesso ho a che fare con caricamenti mostruovi, una buona tecnica per migliorare le performance in fase di inserimento è sicuramente quello di disabilitare il check dei constraint o addirittura distruggerli e ricrearli/attivarli solo al termine del caricamento.
Ecco come fare
ALTER TABLE tableName NOCHECK CONSTRAINT ALL
e per l’abilitazione:
ALTER TABLE tableName CHECK CONSTRAINT ALL

un'altra ottima soluzione, è quella di partizionare la tabella... in questo modo velocizzi la lettura della partizione che vai a ricopiare ed anche la scrittura....

io ad esempio, non conoscendo nello specifico che dati tratti, penserei ad un partizionamento della tabella fatto appunto sulla data...
Utilizzando come chiave di partizionamento la data, quando andrai a reperire i dati della data "copri buchi" andrai sicuramente a leggere una partizione solo e non a scandire tutta la tabella... quando scrivi scrivi una tabella di appoggio che poi tramite la funzione switch viene importata velocemente.

Ho cercato di spiegarti un po' tutto non sapendo qual'è il tuo livello di competenza...se vuoi altre info o pezzi di codice come esempio chiedi pure...


//// Marcello C.

memmo77 Profilo | Expert

Ti ringrazio moltissimo della disponibilità e delle informazioni. Mi trovo a questo punto. Ho fatto il ssis selezionandomi, come te mi suggerivi, i buchi tra le date. Già questa select di per se, mi produce 87000 record. Questi a sua volta li passo ad un ciclo e per ognuno di essi faccio una select per recuperare il periodo , buono, precedente per poi appoggiare i record su una tabella derivata e infine fare un update.
La fase che che mi rallenta è il ciclo dei buchi, che mi fanno comunque 87000 select. Sono sicuro che una volta che ho i dati, fare un update finale, risulterebbe molto veloce.
Non so se mi spiego. Credo che dovrò prendere un altra strada. Grazie.
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5