Newsgroup: it.comp.www.asp
Titolo: [URGENTE]Tempi di esecuzione query asp vs sql

Ciao,
ho un bisogno urgente di aiuto,
se faccio una query sql con enterprise manager mi impiega pochi
secondi, se faccio la stessa ricerca con asp mi impiega un minuto e
rischia tutte le volte il browser di andarmi in timeout.
La ricerca che faccio è una ricerca di 2000 record e viene stampata
tutta sulla stessa pagina del browser.
Sperando di essere stato un pò chiaro ringrazio chi mi risponde,
Daniele

Ciao Dax,

allora partiamo dal presupposto che la query sia ottimizzata (ma ne ho seri 
dubbi visti i tempi)
oltre al tempo impiegato per l'esecuzione nel caso di pagien asp va calcolato 
l'overhead dovuto all'istanziazione della connection ado e del recordset, 
quindi il tempo di parsing del filtro isapi asp.dll ed infine il rendering 
della pagina in formato html.
Personalmente opterei per un rapido controllo con showplan_all della bontà 
della query che richiami in modo da ev. aggiungere indici mancanti
--
Christian Paparelli
[Microsoft MVP - Windows Server - IIS]
http://italy.mvps.org
http://mvp.support.microsoft.com
My job: 
http://www.ithost.ch
My blog: 
http://blogs.aspitalia.com/cp

 Sperando di essere stato un pò chiaro ringrazio chi mi risponde,
Non ci hai fornito alcuna informazione se non riportando un comportamento 
diverso nei tempi di risposta.
Aiutarti è pressoché impossibile con questi dati.
- Come accedi a SQL Server dalla web application?
- Il web server ed il DBMS risiedono sulla stessa macchina?
- Utilizzi stored procedures?
- Query?
- Comandi DDL delle tabelle coinvolte nella query?
- Una volta eseguita la query che fai nella pagina asp?
Ciao!
-- 
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo
http://italy.mvps.org
 

Allora la query fatta con query analizer richiede 2 secondi al massimo,
mentre fatta con asp ne richiede molti di più tanto da far andare il
più delle volte in timeout la richiesta del browser.
La query è la seguente:
Legenda:
A tabella ordini user associati agli utenti
U tabella utenti associati ai prodotti ordinati
q tabella prodotti disponibili
select distinct p.cognome, a.ord_ID, q.prod_id, q.descrip, u.qta
from ordini_user A
join ordini_utenti U on A.ord_id = U.ord_id and u.ord_id like
'62006___'
join filiali  p on A.id_user = p.codcliente
and p.cognome like '%Marco%'
join prodotto q on U.prod_id=q.prod_id
order by p.cognome, q.prod_ID
Come faccio ad ottimizzarla ancora considerando che voglio stampare i
dati contenuti in 3 tabelle distinte?

Ciao Dax,

iniziamo con vedere se hai questi indici due indici almeno
p.cognome e q.prod_ID oltre a questo usa showplan_all per vedere il piano 
di esecuzione della query, ti ricordo inoltre che con l'operatore like (non 
in tutti i casi comunque) in mssql 2000 non verranno utilizzati indici contrariamente 
a quanto accade in mssql 2005


 indici contrariamente a quanto accade in mssql 2005
Se si utilizza un SARG (o Search ARGument come lo definisce Kalen Delaney) 
tipo colonna LIKE 'valore%' verrano tranquillamente utilizzati gli indici 
definiti sulla colonna in esame, mentre colonna LIKE '%valore%' non è un 
SARG e richiede necessariamente un table scan.


 and p.cognome like '%Marco%'
Questa condizione di ricerca č pessima perché obbliga SQL Server ad 
effettuare un table scan.
E' proprio necessaria scriverla cosě?
Inoltre se in QA impiega 2 secondi, non capisco come possa impiegare 1 
minuto se eseguita dalla tua web application.
Prova a rispondere alle domande che ti ho proposto nel precedente post, e 
proseguamo con l'indagine :-)


 
Prego e spero di essere stato chiaro

 Cosa intendi?
CREATE TABLE di tutte le tabelle interessate nella query.
Ad ogni modo la tua architettura è molto classica e non vedo cose 
particolari.
Non credo che il problema sia riconducibile a SQL Server e nemmeno allo 
snippet di codice che hai postato, anche se dubito che ci vogliano 2 secondi 
per risolvere la query e 58 per looppare il recordset...
Prova a debuggare il codice client (ad esempio con l'utilizzo di 
Response.Write in punti strategici del codice) in modo da stabilire con 
certezza se il problema riguarda la query (e quindi il popolamento del 
recordset) oppure il codice che segue.
Altri problemi possono essere riconducibili alla rete, a problemi di 
risoluzione DNS, ecc.
Inoltre ti suggerisco caldamente di ricorrere alle stored procedures, in 
base a tutte le considerazioni che hai letto nei 2 post che ti ho suggerito.


 base a tutte le considerazioni che hai letto nei 2 post che ti ho suggerito.
La cosa che mi fa strana è che se provo a fare la query su pochi
record è istantanea mentre se provo a farla su 2000 record impiega una
vita...
La cosa ancora più assurda è che se lo faccio eseguire come localhost
impiega meno rispetto a se lo metto su un server dislocato.
Per le sp devo capire come applicarle nel contesto che mi interessa in
quanto in realtà la cosa che faccio è una banale ricerca all'interno
dei prodotti ordinati.
Servirebbe a qualcosa aumentare il tempo che impiega per andare in
timeout?
Grazie mille se mi riesci ad aiutare,
Daniele.

 Grazie mille se mi riesci ad aiutare,
Prego, ma per risolvere dovrei venire lì ;-)


 scan.
infatti ho aggiunto (non in tutti i casi comunque) per evitare di entrare 
nei dettagli, grazie 1000 della segnalazione


 Ma hai una istanza SQL Server ANCHE sul web server?
No ho un database di test sulla stessa istanza.
Se, anzichè stampare su video con una response write tutti i
risultati, esportassi la ricerca in un file excel riuscirei a risolvere
il problema?
Grazie,
Daniele