Nota: Questa risposta è stata tradotta automaticamente. Di conseguenza, può contenere errori grammaticali o espressioni strane.
Ciao Antonio Tanzillo
Posso immaginare che questo accada in una tabella abbastanza grande con molti dati, giusto? Tuttavia, non ho accesso allo stesso ambiente o al tuo dataset esatto, quindi non sono in grado di riprodurlo direttamente. Tuttavia, basandomi su ciò che ho esaminato, la spiegazione più probabile per questo comportamento è legata alla selettività dell'indice. In termini semplici, ecco cosa sta probabilmente accadendo nel tuo database:
Se il valore WEB = 1 appare in una grande percentuale di righe, l'indice su WEB diventa a bassa selettività. Invece di restringere efficacemente il set di risultati, Access recupera una grande parte della tabella tramite l'indice.
Internamente, il motore:
- Utilizza l'indice su WEB per individuare le righe corrispondenti
- Poi torna ripetutamente alla tabella principale (ricerca per segnalibro) per valutare PREZZO_4
Quando questo accade milioni di volte, si verifica un intenso I/O casuale, che è significativamente più lento di una semplice scansione sequenziale della tabella.
Questo spiega perché la query diventa quasi istantanea quando si rimuove l'indice - Access è costretto a eseguire una scansione completa, che in questo caso specifico è effettivamente più efficiente.
Quindi potresti considerare 2 approcci:
- Crea un indice composito (indice multi-colonna) su entrambi i campi insieme. Questo permette al motore di soddisfare entrambe le condizioni direttamente dall'indice senza dover tornare alla tabella. Esegui questo SQL (in una nuova query, Visualizzazione SQL):
CREATE INDEX idx_WEB_PREZZO4 ON ARTICOLI (WEB, PREZZO_4) Dopo aver creato l'indice, compatta e ripara il database.
- If you want to keep the existing index but avoid its usage, you can use a small expression trick: SELECT CODICE FROM ARTICOLI WHERE (WEB + 0) = 1 AND PREZZO_4 = 0
Spero che queste informazioni siano utili e ti diano un quadro più chiaro della situazione. Se hai altre domande, non esitare a chiedere.
Se la risposta è utile, clicca su "Accetta risposta"" e vota favorevolmente la risposta positivamente. Se hai domande extra su questa risposta, clicca su "Commento".
Nota: Segui i passaggi in la nostra documentazione per abilitare le notifiche via e-mail se desideri ricevere la notifica correlata per questa discussione.