Come utilizzare l'indice nell'istruzione select?


97

Diciamo che nella tabella dei dipendenti, ho creato un indice (idx_name) sulla emp_namecolonna della tabella.

Devo specificare in modo esplicito il nome dell'indice nella clausola select o verrà automaticamente utilizzato per velocizzare le query.

Se è necessario specificarlo nella clausola select, qual è la sintassi per l'utilizzo dell'indice nella query di selezione?

Risposte:


86

Se vuoi testare l'indice per vedere se funziona, ecco la sintassi:

SELECT *
FROM Table WITH(INDEX(Index_Name))

L'istruzione WITH imporrà l'utilizzo dell'indice.


82
Questo post non risponde alla domanda. La risposta è, in breve: non è necessario specificare index nella query. È usato (o meno) automagicamente. Puoi forzarlo, comunque. Maggiori dettagli (quando e perché farlo) in altri post di seguito.
Rast

34

Buona domanda,

Di solito il motore di database dovrebbe selezionare automaticamente l'indice da utilizzare in base ai piani di esecuzione delle query che crea. Tuttavia, ci sono alcuni casi piuttosto rari in cui si desidera forzare il DB a utilizzare un indice specifico.

Per poter rispondere alla tua domanda specifica devi specificare il DB che stai utilizzando.

Per MySQL, si desidera leggere la documentazione sulla sintassi dei suggerimenti per l' indice su come eseguire questa operazione


30

Come utilizzare l'indice nell'istruzione select?
per di qua:

   SELECT * FROM table1 USE INDEX (col1_index,col2_index)
    WHERE col1=1 AND col2=2 AND col3=3;


SELECT * FROM table1 IGNORE INDEX (col3_index)
WHERE col1=1 AND col2=2 AND col3=3;


SELECT * FROM t1 USE INDEX (i1) IGNORE INDEX (i2) USE INDEX (i2);

E molti altri modi controllano questo

Devo specificare esplicitamente?

  • No, non è necessario specificare esplicitamente.
  • Il motore di database dovrebbe selezionare automaticamente l'indice da utilizzare in base ai piani di esecuzione delle query che crea dalla risposta di @Tudor Constantin.
  • L'ottimizzatore valuterà se l'uso del tuo indice renderà la tua query più veloce e, in tal caso, utilizzerà l'indice. dalla risposta @niktrl

13

In generale , l'indice verrà utilizzato se il costo presunto dell'utilizzo dell'indice e quindi l'eventuale necessità di eseguire ulteriori ricerche di segnalibri è inferiore al costo della sola scansione dell'intera tabella.

Se la tua richiesta è nel formato:

SELECT Name from Table where Name = 'Boris'

E 1 riga su 1000 ha il nome Boris, sarà quasi sicuramente utilizzato. Se tutti si chiamano Boris, probabilmente ricorrerà a una scansione della tabella, poiché è improbabile che l'indice sia una strategia più efficiente per accedere ai dati.

Se è una tabella ampia (lotti di colonne) e lo fai:

SELECT * from Table where Name = 'Boris'

Quindi può ancora scegliere di eseguire la scansione della tabella, se è ragionevole presumere che ci vorrà più tempo per recuperare le altre colonne dalla tabella di quanto non lo farà per cercare il nome, o di nuovo, se è probabile che recuperi un comunque molte righe.


9

L'ottimizzatore valuterà se l'uso del tuo indice renderà la tua query più veloce e, in tal caso, utilizzerà l'indice.

A seconda del tuo RDBMS puoi forzare l'uso di un indice, sebbene non sia consigliato a meno che tu non sappia cosa stai facendo.

In generale dovresti indicizzare le colonne che usi nelle istruzioni di join di tabella e where


5

Utilizzando la colonna a cui è applicato l'indice all'interno delle tue condizioni, verrà incluso automaticamente. Non è necessario utilizzarlo, ma velocizzerà le query quando viene utilizzato.

SELECT * FROM TABLE WHERE attribute = 'value'

Utilizzerà l'indice appropriato.


5

In genere, quando crei un indice su una tabella, il database utilizzerà automaticamente quell'indice durante la ricerca dei dati in quella tabella. Non devi fare niente al riguardo.

Tuttavia, in MSSQL, è possibile specificare un index hintche può specificare che un particolare indice deve essere utilizzato per eseguire questa query. Maggiori informazioni su questo possono essere trovate qui .

Index hintsembra essere disponibile anche per MySQL . Grazie a Tudor Constantine.


1

Il suggerimento per l'indice è disponibile solo per i server di database Microsoft Dynamics. Per SQL Server tradizionale, i filtri definiti nella clausola 'Where' dovrebbero persuadere il motore a utilizzare qualsiasi indice pertinente ... a condizione che il piano di esecuzione del motore possa identificare in modo efficiente come leggere le informazioni (che si tratti di una scansione completa della tabella o di una scansione indicizzata ) - deve confrontare i due prima di eseguire l'istruzione corretta, come parte del suo ottimizzatore di prestazioni integrato.

Tuttavia, puoi forzare l'ottimizzatore a eseguire la scansione utilizzando qualcosa di simile

    Select  *
    From    [yourtable] With (Index(0))
    Where   ...

O per cercare un particolare indice usando qualcosa di simile

    Select  *
    From    [yourtable] With (Index(1))
    Where   ...

La scelta è tua. Guarda le proprietà dell'indice della tabella nel pannello degli oggetti per avere un'idea di quale indice vuoi usare. Dovrebbe corrispondere ai tuoi filtri.

Per risultati migliori, elenca per primi i filtri che restituiscono il minor numero di risultati. Non so se ho ragione nel dirlo, ma sembra che i filtri di query siano sequenziali; se ottieni la sequenza corretta, l'ottimizzatore non dovrebbe doverlo fare per te confrontando tutte le combinazioni, o almeno non iniziare il confronto con le query più costose.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.