Query lenta su SQL2000

lunedì 18 giugno 2007 - 10.20

trueman Profilo | Newbie

Ciao, sono nuovo di questo forum. Ho un problema con SQL2000 (purtroppo non posso passare a SQL2005).

Ho due tabelle
MASTER: tabella con chiave TESTATAID: 9500 record
DETAIL: tabella con chiave DETTAGLIOID, TESTATAID: 5.000.000 record

Se eseguo questa query (abbastanza banale)
SELECT * FROM MASTER AS TA
INNER JOIN DETAIL AS TB ON TA.TESTATAID = TB.TESTATAID
WHERE CODICE = 26
ottengo i seguenti risultati:
Record risultanti: 14000. Tempo di escuzione: 2 sec. Indice utilizzato su DETAIL: indice1 che è un indice non cluster con unico campo TESTATAID. Il piano di esecuzione rileva che la per la DETAIL è stato effettuato un “Index seek” (scansione di un intervallo di righe specifico in un indice non cluster, cioè 14.000)

Se la eseguo con questi parametri:
SELECT * FROM MASTER AS TA
INNER JOIN DETAIL AS TB ON TA.TESTATAID = TB.TESTATAID
WHERE CODICE = 25
ottengo questi risultati
Record risultanti: 3960. Tempo di esecuzione 6 min 20 sec. Indice utilizzato su DETAIL: indice cluster (quello contenente le due chiavi). Il piano di esecuzione rileva che la per la DETAIL è stato effettuato un “Clustered Index Scan” (scansione di un indice cluster, considerando l’intero indice o un intervallo di righe, cioè 5.000.000)

e se la eseguo con questi altri parametri:
SELECT * FROM MASTER AS TA
INNER JOIN DETAIL AS TB ON TA.TESTATAID = TB.TESTATAID
WHERE CODICE = 13
ottengo quesi risultati:
Record risultanti: 501.000. Tempo di esecuzione 5 min 20 sec. Indice utilizzato su DETAIL: indice cluster (quello contenente le due chiavi). Il piano di esecuzione rileva che la per la DETAIL è stato effettuato un “Clustered Index Scan” (scansione di un indice cluster, considerando l’intero indice o un intervallo di righe, cioè 5.000.000)

Non capisco il comportamento diverso di SQL con la stessa query ma con WHERE. Avete qualche idea su come migliorare le prestazioni?

Grazie

MAXI

lbenaglia Profilo | Guru

>Non capisco il comportamento diverso di SQL con la stessa query
>ma con WHERE. Avete qualche idea su come migliorare le prestazioni?

Ciao MAXI,

In base alla distribuzione dei dati, alle statistiche e agli indici presenti, il Query Engine può decidere di generare piani di esecuzione differenti.
Per ottimizzare l'esecuzione delle tue query occorrerebbe conoscere nel dettaglio la struttura del db, la distribuzione dei dati, lo stato delle statistiche e degli indici oltre al tipo di query che vai ad eseguire.
Dato che a queste domande puoi rispondere solo tu, l'unico consiglio che ti posso dare è quello di studiare in modo approfondito il funzionamento e l'ottimizzazione degli indici in SQL Server.
Sui Books Online troverai tutte le informazioni che ti servono a partire dal seguente link:

"Indexes"
http://msdn2.microsoft.com/en-us/library/ms189271.aspx

>Grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

trueman Profilo | Newbie

Grazie per la risposta. Temevo di riceverne una del genere. Mi rendo conto come sia difficile rispondere ad una domanda di quel genere senza conoscere la reale struttura del DB. Ho visto che l'articolo che mi hai postato riguarda SQL2005 mentre io lavoro su SQL2000. Va bene lo stesso
Grazie

lbenaglia Profilo | Guru

>Ho visto che l'articolo che mi hai postato riguarda SQL2005 mentre io lavoro
>su SQL2000. Va bene lo stesso
Si, il paragrafo si riferisce ai Books Online di SQL Server 2005, ma i concetti valgono anche per SQL Server 2000.
Ad ogni modo ti segnalo anche un paragrafo dei Books Online di SQL Server 2000:

"Table and Index Architecture"
http://msdn2.microsoft.com/en-us/library/aa174541.aspx

>Grazie
Prego.

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-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5