2009-12-28 4 views
5

Ho creato uno script per trovare la selettività di ogni colonna per tutte le tabelle. In alcune tabelle con meno di 100 righe, la selettività di una colonna è superiore al 50%. Dove selettività = valori distinti/numero totale di righe. Queste colonne sono idonee per un indice? Oppure, puoi dirmi il requisito minimo per il numero di righe per creare un indice?Qual è il numero minimo di righe richieste per creare un indice?

risposta

5

È possibile indicizzare su qualsiasi colonna - la questione è se ha un senso e se verrà utilizzato tale indice ....

Tipicamente, una selettività inferiore al 1-5% potrebbe funzionare - il più piccolo quella percentuale, meglio è. Il migliore sono i singoli valori di una grande popolazione, ad es. un singolo ID cliente su centinaia di migliaia: quegli indici saranno sicuramente utilizzati.

Cose come il genere (solo 2 valori) o altre cose che hanno solo un numero molto limitato di valori possibili in genere non funzionano bene su un indice. Almeno da sole - queste colonne potrebbero essere ok per essere incluse in un altro indice come seconda o terza colonna.

Ma in realtà, l'unico modo per scoprire se un indice di senso è quello di

  • misura le vostre domande prima di
  • creare l'indice
  • eseguire di nuovo le vostre domande, controllare i loro piani di esecuzione , misurare i loro tempi

Non c'è una regola d'oro per quando un indice sarà usato (o ignorato) - troppe variabili giocano in quella decisione.

Per alcuni consigli di esperti su come trattare con gli indici, e come scoprire quali indici potrebbero non abituarsi, e quando ha senso per creare un indice, vedere i post sul blog di Kimberly Tripp:

+0

Ho tabella con 3 valori di interger e tutti sono dostinct. La selettività di questo è superiore al 95%. E questa tabella è usata principalmente con la sola istruzione select. Quindi è possibile creare un indice su questo? – Paresh

+0

significato selettivo del 95%? Tipicamente, si desidera una selettività molto bassa: si desidera che un singolo valore (ID = 55) selezioni solo una quantità minima di righe. Se la tua selettività in tale scenario (percentuale di quante righe del totale saranno selezionate per un dato valore del tuo campo) è inferiore al 5% o anche inferiore all'1%, allora ha sicuramente senso indicizzare. –

+0

"Cose come genere (solo 2 valori)" ora che è il 2018, questa parte della tua risposta è obsoleta. Il genere dovrebbe essere VARCHAR (255) da ora in poi. Personalmente mi identifico come un elicottero d'attacco apache. –

0

io non sono sicuro di sql server, ma la maggior parte DBMS non utilizzare un indice per il recupero i f può recuperare tutte le righe della tabella in un singolo I/O. Lo vedrai nelle spiegazioni PLAN, alcune tabelle sono sempre scansionate al tablespace.

IMHO, qualsiasi tabella con meno di 5000 righe non vale la pena analizzare per la cardinalità se il DBMS è in esecuzione su un server.

2

La maggior parte dei DBMS utilizza una cache per dati e codice (stored procedure, piano di esecuzione, ecc.). In SQL Server mi pare si chiami i dati e procedura di cache, e in Oracle, si chiama la cache del buffer e la SGA. I dati della tabella e/o l'indice possono essere nella cache.

La tabella piccola a cui si accede frequentemente si adatta molto probabilmente alla cache. Ma la tabella può essere sfrattata dalla cache, ad esempio, se una query carica nuovi dati dal disco. Esistono opzioni per indicare che si desidera che una tabella sia permanentemente nella cache (Vedere PINTABLE).Forse è una strategia migliore quella di usare un indice se il tuo tavolo è molto piccolo (che è il tuo caso). Aggiungere un indice (che sarebbe anche sempre nella cache) potrebbe aiutare ulteriormente, ma non so quale sarebbe il guadagno.

Le grandi differenze nelle prestazioni sono l'accesso al disco e l'accesso alla memoria. Scopo dell'indice è ridurre la quantità di dati da leggere dal disco, ma se è già in memoria, il guadagno è probabilmente piccolo.

Problemi correlati