Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
SQL Server 2000/2005/2008, Express, Access, MySQL, Oracle
Problema di lentezza con connessione via ODBC
mercoledì 29 aprile 2009 - 09.35
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
lukepet
Profilo
| Junior Member
110
messaggi | Data Invio:
mer 29 apr 2009 - 09:35
Ciao a tutti,
ho un problema con l'esecuzione di una query su un archivio letto via ODBC e vorrei un vostro parere.
Dunque, il ponte ODBC mi permette di leggere i record direttamente da archivi Cobol grazie al driver RM Relativity.
Ho creato una parte di codice VB che consente di eseguire delle query su tali archivi...la struttura è la seguente:
cn = New OdbcConnection(STRINGADICONNESSIONE)
cn.ConnectionTimeout = 50
cm = New OdbcCommand(QUERY, cn)
cn.Open()
rd = cm.ExecuteReader(CommandBehavior.CloseConnection)
If rd.HasRows Then
Do While rd.Read
'Operazioni
Loop
End If
Nella stringa di connessione è specificato il DNS, User e Password. Le prestazioni di lettura variano a seconda del tipo di QUERY che lancio.
se ad esempio eseguo una semplicissima query del tipo
SELECT * FROM Archivio1 ORDER BY Codice2
ho dei tempi di risposta abbastanza veloci, ma se imposto una query un pò più sofisticata del tipo
SELECT * FROM Archivio1 WHERE Codice1 IN (SELECT Codice FROM Archivio2 WHERE (Tipo=0 AND Valido NOT LIKE '0%')) ORDER BY Codice2
allora i tempi di risposta diventano indecenti e prima che l'esecuzione termini passano circa 5 minuti.
Va detto che l'Archivio1 contiene circa 7000 record mentre l'Archivio2 circa 6000. Secondo voi questi ordini di grandezza sono tali da giustificare dei tempi risposta così lunghi? E come potrei fare per ridurli?
Grazie per ogni informazione.
lbenaglia
Profilo
| Guru
5.625
messaggi | Data Invio:
mer 29 apr 2009 - 10:01
>SELECT * FROM Archivio1 WHERE Codice1 IN (SELECT Codice FROM
>Archivio2 WHERE (Tipo=0 AND Valido NOT LIKE '0%')) ORDER BY Codice2
>
>allora i tempi di risposta diventano indecenti e prima che l'esecuzione
>termini passano circa 5 minuti.
Ciao,
Non conosco quel driver ODBC quindi non so quali comandi SQL implementa.
Ad ogni modo vediamo di analizzare la tua query:
1) SELECT * FROM Archivio1
Sei sicuro di aver bisogno di recuperare tutte le colonne della tabella Archivio1?
E' sempre meglio specificare nella SELECT list solo le colonne strettamente necessarie.
2) WHERE Codice1 IN
Generalmente la IN è poco efficiente, meglio sostituirla con una INNER JOIN o con la clausola EXISTS
3) AND Valido NOT LIKE '0%'
Questa condizione è alquanto inefficiente.
E' proprio necessaria? Non puoi riscriverla diversamente?
>Grazie per ogni informazione.
Prego.
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
lukepet
Profilo
| Junior Member
110
messaggi | Data Invio:
mer 29 apr 2009 - 10:28
Grazie mille per la dritta...mi è bastato modificare la query in questo modo:
SELECT * FROM Archivio1 WHERE EXISTS (SELECT Codice FROM Archivio2 WHERE (Tipo=0 AND Valido NOT LIKE '0%' AND Codice=Archivio1.Codice1)) ORDER BY Codice2
Scritta così risulta decisamente più veloce.
Per quanto riguarda il NOT LIKE non so se si può ottimizzare...quel campo ha una serie di codice del tipo 000, 010, 100, 011, etc. E a me servono solo quelli che hanno come primo carattere lo 0.
lbenaglia
Profilo
| Guru
5.625
messaggi | Data Invio:
mer 29 apr 2009 - 10:41
>Per quanto riguarda il NOT LIKE non so se si può ottimizzare...quel
>campo ha una serie di codice del tipo 000, 010, 100, 011, etc.
>E a me servono solo quelli che hanno come primo carattere lo
>0.
Allora perché hai messo il NOT?!
Valido NOT LIKE '0%'
In base a quello che hai scritto dovrebbe essere:
Valido LIKE '0%'
Sicuramente più efficiente rispetto alla precedente condizione.
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
lukepet
Profilo
| Junior Member
110
messaggi | Data Invio:
mer 29 apr 2009 - 10:44
Perdon...mi sono sbagliato, intendevo dire che io devo prendere in considerazione tutti quelli il cui primo carattere sia diverso da 0.
lbenaglia
Profilo
| Guru
5.625
messaggi | Data Invio:
mer 29 apr 2009 - 10:50
>Perdon...mi sono sbagliato, intendevo dire che io devo prendere
>in considerazione tutti quelli il cui primo carattere sia diverso
>da 0.
Prova a vedere se questa condizione è più efficiente rispetto a quella col NOT:
Valido LIKE '[^0]%'
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
Torna su
Stanze Forum
Elenco Threads
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 !