LA QUERY DELLA VITA: PAGO 50€ CHI MI AIUTASSE IN VIA DEFINITIVA

sabato 18 dicembre 2010 - 13.46
Tag Elenco Tags  VB.NET  |  .NET 2.0  |  Windows Server 2003  |  Visual Studio 2005  |  SQL Server Express  |  Internet explorer 8.0

MagoDaniel1981 Profilo | Newbie

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.

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

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

luigidibiasi Profilo | Guru

Credo che ti convenga postare un grafico delle tabelle con eventuali relazioni, primary key e foreign tra le stesse perché così è veramente difficile che qualcuno risponda....
Luigi Di Biasi


http://www.dibiasi.it/
http://netsell.dibiasi.it - ecomm software -
http://blogs.dotnethell.it/luigidibiasi/

MagoDaniel1981 Profilo | Newbie

Come giustamente suggeritomi, posto immagine del diagramma per le tabelle interessate alla query.

Confidando in una qualche risposta, auguro un buon lavoro.

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