12 messaggi dal 04 gennaio 2007
PROBLEMA:
ho una tabella Catalogo di 170.000 righe ed una tabella CatalogoOLD di 8000 righe.
La tabella CatalogoOLD contiene un elenco di libri identificati da un codice ISBN a cui è abbinata una descrizione testuale.
LA tabella Catalogo contiene un elenco molto grande di libri identificati sempre da un codice ISBN a cui è associata una descrizione vuota.
Quello che devo fare è semplicemente copiare le descrizioni che trovo in CatalogoOLD nei campi ISBN corrispondenti della tabella Catalogo.
All'apparenza mi sembrava un gioco da ragazzi e invece ho incontrato non poche difficoltà.

CAMPI TABELLA "Catalogo":
isbn - testo

CAMPI TABELLA "CatalogoOLD":
isbnOLD - testoOLD - id, dove id è un campo INT compresi in un intervallo [0..8662]


RISOLUZIONE:

1. attraverso un join sul campo isbn delle due tabelle ho creato come prima cosa una vista di 4000 righe contenenti tutte le descrizioni da inserire
(es: id 63 - isbnOLD 899996789X - testoOLD "Questo libro parla..")

2. ho quindi creato questa STORED PROCEDURE:

DECLARE @contatore AS INT
SET @contatore = 1
-- scorro la vista creata dal join ISBN sulle due tabelle
WHILE @contatore < 8663
BEGIN
-- se id e contatore coincidono effettuo l'UPDATE
IF EXISTS(SELECT id FROM descrizioniOLD WHERE id = @contatore)
BEGIN
UPDATE catalogo
SET testo = (SELECT testoOLD
FROM descrizioniOLD
WHERE id = @contatore)
WHERE isbn = (SELECT isbnOLD
FROM descrizioniOLD
WHERE id = @contatore)
END
-- incremento in ogni caso il contatore
SET @contatore = @contatore + 1
print 'contatore = '+ STR(@contatore)
END


Ebbene.. l'algoritmo pare funzionare bene ma estremamente a rilento rendendone impossibile la terminazione. Stoppando la procedura dopo 5 minuti esatti ho notato che erano state esaminate solo 70 righe stimando che per completare la procedura sarebbe state necessario un tempo di all'incirca 10 ore!
Qualcuno sa consigliarmi un metodo più efficiente?

p.S: ho provato anche con un cursore ma SQLServer mi segnala che non può esaminare più di 100 righe.. è possibile aumentare questo valore? A livello di prestazioni che metodo è meglio adottare? Ciao a tutti e grazie in anticipo a chi prova a darmi una mano
Modificato da Mauri77 il 24 gennaio 2007 20.27 -
426 messaggi dal 17 aprile 2006
ma... non capisco tanto la difficoltà dunque temo mi sfugga qualcosa...
Intanto se le tabelle non le aggiorni di frequente potresti cominciare a creare un indice sulle colonne isbn

ad ogni modo dovrebbe essere sufficiente eseguire dal Query Analizer
update Catalogo set testo=testoold from catalogo inner join catalogoOld on Catalogo.isbn = CatalogoOld.isbnold


mi sfuggirà qualcosa?

Ciao Alessandro
12 messaggi dal 04 gennaio 2007
grazie 'taccio' effettivamente era una boiata.. se il mio prof di basi di dati legge sto post mi sa che mi ritira la laurea!
p.S: domani la provo sulle tabelle reali ma così ad occhio dai non ci dovrebbero essere problemi.. come si calcola già il costo? 170.000 * 8.000 = 1.360.000.000 confronti??? boh anche di indici e ottimizzazione non mi ricordo una mazza! L'importante è che SQL Server di Aruba non esploda!!
grazie ancora
Modificato da Mauri77 il 24 gennaio 2007 23.06 -
Modificato da Mauri77 il 24 gennaio 2007 23.07 -
Modificato da Mauri77 il 24 gennaio 2007 23.08 -

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.