Problema di lentezza con connessione via ODBC

mercoledì 29 aprile 2009 - 09.35

lukepet Profilo | Junior Member

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

>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

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

>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

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

>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
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