Newsgroup: it.comp.appl.access
Titolo: Ottimizzazione query

ciao!
Sto realizzando uno scadenziario per un consulente nelle merci pericolose:
ho una tabella molto semplice con i seguenti campi
IdScadenza (Contatore), DataScadenza (Data/Ora), Tipo (Testo), Giorni anticipo (testo), Mesi anticipo (Testo).
dove Il tipo indica che tipo di scadenza abbiamo, giorni e mesi di anticipo indicano quanto prima devo essere
avvertito dell'imminente scadenza.
Il problema l'ho risolto con una query di unione il cui recordset verrà visualizzato all'interno di una listbox.
Il problema è che secondo me la query è un po' lentina... occorrono da 3 ai 5 secondi per la comparsa dei risultati.
Comunque ve la riporto qui di seguito:
-----------------------------------------------------
SELECT tblScadenzeConsulente.IdScadenza, format([tblScadenzeConsulente.DataScadenza],"dddd dd mmmm yyyy") as DataScadenza2,
tblScadenzeConsulente.Tipo,  IIf(DateDiff("d",Date(),[DataScadenza])<=0,"Scaduta!",DateDiff("d",Date(),[DataScadenza])) AS TimeLeft
FROM tblScadenzeConsulente
WHERE tipo='Acconto IRPEF' And DateSerial(Year([DataScadenza]),Month([DataScadenza])-[tblScadenzeConsulente.Mesi
anticipo],Day([DataScadenza])-[tblScadenzeConsulente.Giorni anticipo])<=date()
UNION SELECT tblScadenzeConsulente.IdScadenza, format([tblScadenzeConsulente.DataScadenza],"dddd dd mmmm yyyy") as DataScadenza2,
tblScadenzeConsulente.Tipo,  IIf(DateDiff("d",Date(),[DataScadenza])<=0,"Scaduta!",DateDiff("d",Date(),[DataScadenza])) AS TimeLeft
FROM tblScadenzeConsulente
WHERE tipo='Ass Mercedes' And DateSerial(Year([DataScadenza]),Month([DataScadenza])-[tblScadenzeConsulente.Mesi
anticipo],Day([DataScadenza])-[tblScadenzeConsulente.Giorni anticipo])<=date()
UNION SELECT tblScadenzeConsulente.IdScadenza, format([tblScadenzeConsulente.DataScadenza],"dddd dd mmmm yyyy") as DataScadenza2,
tblScadenzeConsulente.Tipo,  IIf(DateDiff("d",Date(),[DataScadenza])<=0,"Scaduta!",DateDiff("d",Date(),[DataScadenza])) AS TimeLeft
FROM tblScadenzeConsulente
WHERE tipo='Ass Spider' And DateSerial(Year([DataScadenza]),Month([DataScadenza])-[tblScadenzeConsulente.Mesi
anticipo],Day([DataScadenza])-[tblScadenzeConsulente.Giorni anticipo])<=date()
UNION SELECT tblScadenzeConsulente.IdScadenza, format([tblScadenzeConsulente.DataScadenza],"dddd dd mmmm yyyy") as DataScadenza2,
tblScadenzeConsulente.Tipo,  IIf(DateDiff("d",Date(),[DataScadenza])<=0,"Scaduta!",DateDiff("d",Date(),[DataScadenza])) AS TimeLeft
FROM tblScadenzeConsulente
WHERE tipo='Ass Suzuki 250' And DateSerial(Year([DataScadenza]),Month([DataScadenza])-[tblScadenzeConsulente.Mesi
anticipo],Day([DataScadenza])-[tblScadenzeConsulente.Giorni anticipo])<=date()
UNION SELECT tblScadenzeConsulente.IdScadenza, format([tblScadenzeConsulente.DataScadenza],"dddd dd mmmm yyyy") as DataScadenza2,
tblScadenzeConsulente.Tipo,  IIf(DateDiff("d",Date(),[DataScadenza])<=0,"Scaduta!",DateDiff("d",Date(),[DataScadenza])) AS TimeLeft
FROM tblScadenzeConsulente
WHERE tipo='Bollo Mercedes' And DateSerial(Year([DataScadenza]),Month([DataScadenza])-[tblScadenzeConsulente.Mesi
anticipo],Day([DataScadenza])-[tblScadenzeConsulente.Giorni anticipo])<=date()
UNION SELECT tblScadenzeConsulente.IdScadenza, format([tblScadenzeConsulente.DataScadenza],"dddd dd mmmm yyyy") as DataScadenza2,
tblScadenzeConsulente.Tipo,  IIf(DateDiff("d",Date(),[DataScadenza])<=0,"Scaduta!",DateDiff("d",Date(),[DataScadenza])) AS TimeLeft
FROM tblScadenzeConsulente
WHERE tipo='Bollo Spider' And DateSerial(Year([DataScadenza]),Month([DataScadenza])-[tblScadenzeConsulente.Mesi
anticipo],Day([DataScadenza])-[tblScadenzeConsulente.Giorni anticipo])<=date()
UNION SELECT tblScadenzeConsulente.IdScadenza, format([tblScadenzeConsulente.DataScadenza],"dddd dd mmmm yyyy") as DataScadenza2,
tblScadenzeConsulente.Tipo,  IIf(DateDiff("d",Date(),[DataScadenza])<=0,"Scaduta!",DateDiff("d",Date(),[DataScadenza])) AS TimeLeft
FROM tblScadenzeConsulente
WHERE tipo='Bollo Suzuki 250' And DateSerial(Year([DataScadenza]),Month([DataScadenza])-[tblScadenzeConsulente.Mesi
anticipo],Day([DataScadenza])-[tblScadenzeConsulente.Giorni anticipo])<=date()
UNION SELECT tblScadenzeConsulente.IdScadenza, format([tblScadenzeConsulente.DataScadenza],"dddd dd mmmm yyyy") as DataScadenza2,
tblScadenzeConsulente.Tipo,  IIf(DateDiff("d",Date(),[DataScadenza])<=0,"Scaduta!",DateDiff("d",Date(),[DataScadenza])) AS TimeLeft
FROM tblScadenzeConsulente
WHERE tipo='Certificato da consulenza' And DateSerial(Year([DataScadenza]),Month([DataScadenza])-[tblScadenzeConsulente.Mesi
anticipo],Day([DataScadenza])-[tblScadenzeConsulente.Giorni anticipo])<=date()
UNION SELECT tblScadenzeConsulente.IdScadenza, format([tblScadenzeConsulente.DataScadenza],"dddd dd mmmm yyyy") as DataScadenza2,
tblScadenzeConsulente.Tipo,  IIf(DateDiff("d",Date(),[DataScadenza])<=0,"Scaduta!",DateDiff("d",Date(),[DataScadenza])) AS TimeLeft
FROM tblScadenzeConsulente
WHERE tipo='CFP ADR' And DateSerial(Year([DataScadenza]),Month([DataScadenza])-[tblScadenzeConsulente.Mesi
anticipo],Day([DataScadenza])-[tblScadenzeConsulente.Giorni anticipo])<=date()
UNION SELECT tblScadenzeConsulente.IdScadenza, format([tblScadenzeConsulente.DataScadenza],"dddd dd mmmm yyyy") as DataScadenza2,
tblScadenzeConsulente.Tipo,  IIf(DateDiff("d",Date(),[DataScadenza])<=0,"Scaduta!",DateDiff("d",Date(),[DataScadenza])) AS TimeLeft
FROM tblScadenzeConsulente
WHERE tipo='Contributi INPS' And DateSerial(Year([DataScadenza]),Month([DataScadenza])-[tblScadenzeConsulente.Mesi
anticipo],Day([DataScadenza])-[tblScadenzeConsulente.Giorni anticipo])<=date()
UNION SELECT tblScadenzeConsulente.IdScadenza, format([tblScadenzeConsulente.DataScadenza],"dddd dd mmmm yyyy") as DataScadenza2,
tblScadenzeConsulente.Tipo,  IIf(DateDiff("d",Date(),[DataScadenza])<=0,"Scaduta!",DateDiff("d",Date(),[DataScadenza])) AS TimeLeft
FROM tblScadenzeConsulente
WHERE tipo='Dichiarazione redditi' And DateSerial(Year([DataScadenza]),Month([DataScadenza])-[tblScadenzeConsulente.Mesi
anticipo],Day([DataScadenza])-[tblScadenzeConsulente.Giorni anticipo])<=date()
UNION SELECT tblScadenzeConsulente.IdScadenza, format([tblScadenzeConsulente.DataScadenza],"dddd dd mmmm yyyy") as DataScadenza2,
tblScadenzeConsulente.Tipo,  IIf(DateDiff("d",Date(),[DataScadenza])<=0,"Scaduta!",DateDiff("d",Date(),[DataScadenza])) AS TimeLeft
FROM tblScadenzeConsulente
WHERE tipo='Pagamento ICI' And DateSerial(Year([DataScadenza]),Month([DataScadenza])-[tblScadenzeConsulente.Mesi
anticipo],Day([DataScadenza])-[tblScadenzeConsulente.Giorni anticipo])<=date()
UNION SELECT tblScadenzeConsulente.IdScadenza, format([tblScadenzeConsulente.DataScadenza],"dddd dd mmmm yyyy") as DataScadenza2,
tblScadenzeConsulente.Tipo,  IIf(DateDiff("d",Date(),[DataScadenza])<=0,"Scaduta!",DateDiff("d",Date(),[DataScadenza])) AS TimeLeft
FROM tblScadenzeConsulente
WHERE tipo='Pagamento ILOR' And DateSerial(Year([DataScadenza]),Month([DataScadenza])-[tblScadenzeConsulente.Mesi
anticipo],Day([DataScadenza])-[tblScadenzeConsulente.Giorni anticipo])<=date()
UNION SELECT tblScadenzeConsulente.IdScadenza, format([tblScadenzeConsulente.DataScadenza],"dddd dd mmmm yyyy") as DataScadenza2,
tblScadenzeConsulente.Tipo,  IIf(DateDiff("d",Date(),[DataScadenza])<=0,"Scaduta!",DateDiff("d",Date(),[DataScadenza])) AS TimeLeft
FROM tblScadenzeConsulente
WHERE tipo='Pagamento IRPEF' And DateSerial(Year([DataScadenza]),Month([DataScadenza])-[tblScadenzeConsulente.Mesi
anticipo],Day([DataScadenza])-[tblScadenzeConsulente.Giorni anticipo])<=date()
UNION SELECT tblScadenzeConsulente.IdScadenza, format([tblScadenzeConsulente.DataScadenza],"dddd dd mmmm yyyy") as DataScadenza2,
tblScadenzeConsulente.Tipo,  IIf(DateDiff("d",Date(),[DataScadenza])<=0,"Scaduta!",DateDiff("d",Date(),[DataScadenza])) AS TimeLeft
FROM tblScadenzeConsulente
WHERE tipo='Pagamento IVA' And DateSerial(Year([DataScadenza]),Month([DataScadenza])-[tblScadenzeConsulente.Mesi
anticipo],Day([DataScadenza])-[tblScadenzeConsulente.Giorni anticipo])<=date()
UNION SELECT tblScadenzeConsulente.IdScadenza, format([tblScadenzeConsulente.DataScadenza],"dddd dd mmmm yyyy") as DataScadenza2,
tblScadenzeConsulente.Tipo,  IIf(DateDiff("d",Date(),[DataScadenza])<=0,"Scaduta!",DateDiff("d",Date(),[DataScadenza])) AS TimeLeft
FROM tblScadenzeConsulente
WHERE tipo='Patente di guida' And DateSerial(Year([DataScadenza]),Month([DataScadenza])-[tblScadenzeConsulente.Mesi
anticipo],Day([DataScadenza])-[tblScadenzeConsulente.Giorni anticipo])<=date()
UNION SELECT tblScadenzeConsulente.IdScadenza, format([tblScadenzeConsulente.DataScadenza],"dddd dd mmmm yyyy") as DataScadenza2,
tblScadenzeConsulente.Tipo,  IIf(DateDiff("d",Date(),[DataScadenza])<=0,"Scaduta!",DateDiff("d",Date(),[DataScadenza])) AS TimeLeft
FROM tblScadenzeConsulente
WHERE tipo='Revisione Mercedes' And DateSerial(Year([DataScadenza]),Month([DataScadenza])-[tblScadenzeConsulente.Mesi
anticipo],Day([DataScadenza])-[tblScadenzeConsulente.Giorni anticipo])<=date()
UNION SELECT tblScadenzeConsulente.IdScadenza, format([tblScadenzeConsulente.DataScadenza],"dddd dd mmmm yyyy") as DataScadenza2,
tblScadenzeConsulente.Tipo,  IIf(DateDiff("d",Date(),[DataScadenza])<=0,"Scaduta!",DateDiff("d",Date(),[DataScadenza])) AS TimeLeft
FROM tblScadenzeConsulente
WHERE tipo='Revisione Spider' And DateSerial(Year([DataScadenza]),Month([DataScadenza])-[tblScadenzeConsulente.Mesi
anticipo],Day([DataScadenza])-[tblScadenzeConsulente.Giorni anticipo])<=date()
UNION SELECT tblScadenzeConsulente.IdScadenza, format([tblScadenzeConsulente.DataScadenza],"dddd dd mmmm yyyy") as DataScadenza2,
tblScadenzeConsulente.Tipo,  IIf(DateDiff("d",Date(),[DataScadenza])<=0,"Scaduta!",DateDiff("d",Date(),[DataScadenza])) AS TimeLeft
FROM tblScadenzeConsulente
WHERE tipo='Revisione Suzuki 250' And DateSerial(Year([DataScadenza]),Month([DataScadenza])-[tblScadenzeConsulente.Mesi
anticipo],Day([DataScadenza])-[tblScadenzeConsulente.Giorni anticipo])<=date()
ORDER BY DataScadenza2;
-------------------------------------------------------------------
Secondo voi si puo' ottimizzare per renderla più rapida?
Io ho un PII 266MHz... forse dipende da quello!
grazie!
    luca



 grazie!


Sono pienamente d'accordo con MA, deve essere proprio questo il tuo
problema: io sto facendo un progetto con query molto più complesse, e sono
arrivato alla conclusione che gli Iif e i Switch fanno perdere davvero tanto
tempo CPU, in particolare se i record in gioco sono migliaia!
ciao
Pibe


Scusami ma sono un po' duretto di comprendonio...
mi stai dicendo di inserire invece della descrizione del tipo di scadenza,
un numero che corrisponda alla scadenza stessa???
Quindi la tabella dei tipi deve avere un campo in più nel qualo stabilisco la corrispondenza...
Secondo te si risolve il problema della velocità?
Comunque il problema non è quello di ordinare... ma semplicemente quello di far uscire le scadenze giuste
nel giorno giusto.
Poi non ho capito il suggerimento dell'if immediato...  :-(

 wrote:

Che strano!!!
Oggi ho riacceso il notebook e la query viene eseguita alla velocità della luce!!!
Evidentemente, ieri avevo diversi task attivi sul pc che hanno determinato un rallentamento
del sistema, probabile causa della lentezza con cui veniva eseguita la query...
che dire... se comunque è possibile ottimizzarla... sono qui pronto a farlo!

 ha scritto nel messaggio
news:2kepkvonf15q34gmd...@4ax.com...

E domani basterà solo pensarlo che già la query è aperta...
Quella che ti indicavo era solo la formattazione del campo calcolato tra la
data di scadenza e data odierna
se la data scadenza è maggiore di oggi metti domani, lui ti dirà 1 inteso
come giorni alla scadenza, altrimenti ti dirà scaduto o infine scade oggi a
seconda se > oppure < o infine = a date()
ciao MAssimiliano



Così come l'hai impostata tu non puo' funzionare...
mi spiego:
iif([scadenza]-oggi=0;"scade oggi";[scadenza]-oggi)
Il problema nasce quando la data della scadenza diventa minore di oggi...
lui non riuscirà a dirti che è SCADUTA.
Ci vorrebbe una iif annidata... se po' fa???


Fermate il NG!!!!
Abbandona l'idea dell'iif
vai nella struttura della query
posiziona il cursore sul campo calcolato date()-datascadenza
premi proprietà
scegli formato
scrivi la stringa che ti ho detto
MAssimiliano