Da più di un anno mantengo online un applicativo per un mio Cliente.
Senza entrare troppo nel dettaglio, di seguito la query incriminata, esegue ricerche su diverse tabelle di database MS SQL 2005 Express, una delle quali, 'Nominativi', conta quasi 6 milioni di record.
Ecco la versione attuale della query, che appena dopo andrò a spiegare.
Andando per ordine: il DISTINCT TOP 500 è stato messo perchè, oltre i 500 record, la query va in timeout.
N = Nominativi è la tabella di quasi 6 milioni di record, contenente un elenco telefonico, sostanzialmente.
ASN = AddolcitoriSuNominativi è una tabella che raccoglie, per ogni Nominativo, lo stato dell'addolcitore (il Cliente chiede agli utente che chiama se hanno questo dispositivio sull'impianto idrico di casa). Se si, nella suddetta tabella, viene creata una nuova riga con i campi IdNominativo e idStatoAddolcitore (dove i valori possono essere da 1 a 7, con relative stringhe Altro, Non Presente, Osmosi, ... e via dicendo.
La cosa fondamentale è la tabella NominativiInLista, cioè una tabella che contiene idLista e idNominativo, aggrega cioè i nomi in delle liste, create nella tabella Liste appunto. Se il nominativo 10 è stato inserito nella lista 2, la tabella NominativiInLista dovrà contenere un record con i valori 10 e 2, ad indicare appunto che il nominativo con ID 10 è nella lista 2. Il nominativo dunque non deve essere selezionato se è presente in qualche lista che, però, abbia il campo conclusa a false (cioè sia ancora in uso) o eliminata a false. Diversamente il nominativo deve poter essere riselezionato per una nuova lista.
Naturalmente poi associo dinamicamente i valori dello stato addolcitore, in base alla query dell'utente. Per cui, ad esempio, sarebbe possibile che lo stato Presente e Osmosi siano impostati a true, in quel caso, il software deve estrarre solo i nomi che presentano uno di questi due stati andando a verificare la cosa nella tabella AddolcitoriSuNominativi appunto.
Infine, viene la cosa bella: il nominativo, se il flag 'SoloRichiamabile' è true, deve essere selezionato solo se un qualunque stato in chiamate precedenti non sia stato impostato su uno degli stati per cui lo stesso non è più richiamabile. Gli stati interessati sono il 3 e il 7: numero sbagliato e anziano. Per fare questo ulteriore check vado a verificare la tabella Chiamate. La stessa contiene infatti un log per ogni esito chiamata inserito per un determinato nominativo presente in una determinata lista. Dunque possiamo avere una lista A che contiene 10 nomi, uno dei quali è stato esitato come Anziano. In tal caso, la query, deve automaticamente escludermi quel nominativo dalla nuova ricerca che effettua.
So che è un tremendo macello. è ormai più di una anno che lavoro su questa query, cercando continuamente di migliorarla. Ora credo di essere arrivato ad una versione definitiva per quelle che sono le mie conoscenze attuali, ma so che si può sempre migliorare.
Forse tra tutti voi c'è chi sa darmi qualche spunto per fare meglio.
In ultimo, ricordo che il tutto è relativo ad un'applicazione web sviluppata in ASP.NET 2.0 con linguaggio VB per quanto riguarda la parte di programmazione.
Attendo fiducioso un vostro riscontro.
Daniel Grandis