sql indice e chiave primaria

Dire che ho un ID riga (int) in un database impostato come chiave primaria. Se ho query disattivare l’ID spesso ho anche bisogno di indice? O non vuol essere una chiave primaria dire, è già indicizzata?

Motivo che mi chiedo è perché in MS SQL Server è possibile creare un indice su questo ID, che come ho detto è la mia chiave primaria.

Edit: un’altra domanda – non male anche l’indice di chiave primaria?

InformationsquelleAutor danifo | 2009-01-20

 

11 Replies
  1. 67

    Hai ragione, è confuso che SQL Server consente di creare indici duplicati sullo stesso campo(s). Ma il fatto che si può creare un altro non indica che il PK indice non esiste già.

    Indice aggiuntivo non fa bene, ma l’unico danno (molto piccola) è l’ulteriore dimensione del file e la riga di creazione di overhead.

    • Il danno di indici inutilizzati, sono molto dannosi, anzi. Per una cosa, gli indici di mangiare di archiviazione. Per un’altra cosa, rallenta scrive e gli aggiornamenti. Sempre eliminare gli indici che non stanno andando per essere utilizzato.
  2. 44

    Come tutti gli altri hanno già detto, le chiavi primarie sono indicizzate automaticamente.

    Creazione di più indici della colonna di chiave primaria senso solo quando è necessario ottimizzare una query che utilizza la chiave primaria e alcune altre colonne specifiche. Con la creazione di un altro indice sulla chiave primaria e a colonna, comprese alcune altre colonne con esso, si può raggiungere il livello desiderato di ottimizzazione per una query.

    Per esempio, si dispone di una tabella con un numero di colonne, ma si sta solo eseguendo la query ID, Nome e Indirizzo colonne. Prendendo ID come chiave primaria, è possibile creare la seguente indice basato su ID, ma include il Nome e l’Indirizzo colonne.

    CREATE NONCLUSTERED INDEX MyIndex
    ON MyTable(ID)
    INCLUDE (Name, Address)

    Così, quando si utilizza questa query:

    SELECT ID, Name, Address FROM MyTable WHERE ID > 1000

    SQL Server vi darà il risultato usando solo l’indice che hai creato e non leggere nulla dal tavolo stesso.

  3. 28

    NOTA: Questa risposta indirizzi di classe enterprise, sviluppo in-the-large.

    Questo è un RDBMS problema, non solo SQL Server, e il comportamento può essere molto interessante. Per uno, mentre è comune per le chiavi primarie per essere automaticamente (unicamente) indicizzata, NON è assoluto. Ci sono momenti in cui è essenziale che una chiave primaria NON essere indicizzati in modo univoco.

    Nella maggior parte dei Rdbms, un indice univoco verrà creata automaticamente una chiave primaria se non esiste già. Pertanto, è possibile creare il proprio indice sulla colonna di chiave primaria, prima di dichiarare come chiave primaria, quindi tale indice viene utilizzato (se possibile) da parte del motore di database quando si applica la chiave primaria della dichiarazione. Spesso, è possibile creare la chiave primaria e consentire il suo default unico indice per essere creato, poi crea la tua alternativo indice colonna, quindi trascinare l’indice di default.

    Ora la parte divertente, quando NON vuoi un unico indice di chiave primaria? Tu non lo vuoi, e non è possibile tollerare uno, quando la tabella acquisisce abbastanza dati (righe) per rendere la manutenzione dell’indice è troppo costoso. Questo varia in base all’hardware, RDBMS motore, le caratteristiche della tabella e il database, e il carico di sistema. Tuttavia, di solito comincia a manifestarsi una volta una tabella raggiunge un paio di milioni di righe.

    La questione essenziale è che ogni inserimento di una riga o di aggiornamento della colonna di chiave primaria traduce in un indice di scansione per garantire l’unicità. Che unico indice di scansione (o il suo equivalente in qualsiasi RDBMS) diventa molto più costosi, come la tabella cresce, fino a che domina le prestazioni della tabella.

    Ho affrontato questo problema molte volte con tavoli grandi come due miliardi di righe, 8 tb di storage e i quaranta milioni di fila inserti al giorno. Mi è stato affidato il compito di ridisegnare il sistema coinvolte, incluso cadere la chiave primaria univoca indice praticamente come un passaggio. Infatti, cadere questo indice è stato necessario in produzione semplicemente per recuperare da un’interruzione, prima abbiamo avuto anche vicino a una riprogettazione. Che riprogettazione incluso trovare altri modi per garantire l’unicità della chiave primaria e per fornire un rapido accesso ai dati.

    • Che cosa succede se la chiave è un int o bigint key autoincrement? SQL Server è abbastanza intelligente per non fare un unico indice di scansione in questo caso?
    • un IDENTITY campo non è garantito per essere unico. Dopo tutto, gli utenti possono inserire i valori duplicati se non IDENTITY_INSERT.
    • So che questo è un antico argomento, ma non riesco a capire come una unicità di scansione di un indice sarebbe un carico sul sistema. Un B+tree scansione deve essere O(log n) * v, dove v è vincolata overhead per indice di frammentazione, imperfetta albero di bilanciamento, ecc.. Quindi 2 miliardi di righe sarebbe log base 2 di 2,000,000,000 (a circa 31 cerca) volte, per esempio, 2 o 3 o anche 10. 40M inserti al giorno è di circa 462/sec, ~100 IO per inserire… Ahh… Oh. Vedo. E questo era prima della diffusione Ssd.
    • A meno che non ti è caduto il vincolo di unicità, non l’overhead di controllo di ciascuna delle righe per unicità essere molto maggiore?
  4. 8

    Qui il passaggio dal MSDN:

    Quando si specifica un vincolo di CHIAVE PRIMARIA per una tabella, il Motore di Database assicura l’univocità dei dati mediante la creazione di un indice univoco per le colonne chiave primaria. Questo indice consente inoltre un rapido accesso ai dati quando la chiave primaria viene utilizzata nella query. Pertanto, le chiavi primarie che vengono scelti devono seguire le regole per la creazione di indici univoci.

  5. 1

    Anche in SQL Server, in genere, la chiave primaria è indicizzato automaticamente.
    Questo è vero, ma non è garantito il più veloce delle query.
    La chiave primaria vi darà le migliori prestazioni se c’è solo 1 campo come chiave primaria.
    Ma, quando ci sono più campo come chiave primaria, quindi l’indice è basato su questi campi.

    Per esempio:
    Campo A, B, C sono la chiave primaria, quindi quando si esegue una query in base a quei 3 campi nella CLAUSOLA WHERE, la prestazione è buona,
    MA quando si desidera eseguire la query con Solo C campo nella CLAUSOLA WHERE, di solito ottenere buone prestazioni. Così, per ottenere le vostre prestazioni fino e in esecuzione, è necessario indice di C campo manualmente.

    La maggior parte del tempo, si suole vedere il problema fino a che colpisce più di 1 milione di record.

  6. 1

    Dichiarazione di un PRIMARY KEY o UNIQUE a causa del vincolo di SQL Server per creare automaticamente un indice.

    Un indice univoco possono essere creati senza il corrispondente di un vincolo, ma un vincolo primary key o unique) non può esistere senza la presenza di un unico indice.

    Da qui, la creazione di un vincolo:

    • causare un indice con lo stesso nome creato
    • negare cadere il creato indice di vincolo non è consentito esiste senza di esso

    e, allo stesso tempo lasciando cadere il vincolo calo l’indice associato.

    Così, c’è differenza tra una PRIMARY KEY o UNIQUE INDEX:

    • NULL valori non sono ammessi in PRIMARY KEY, ma ha permesso UNIQUE indice; e, come operatori di insiemi (UNIONE, TRANNE che si INTERSECANO), qui NULL = NULL il che significa che si può avere solo un valore, come due NULLs sono trovare duplicati di ogni altro;
    • solo PRIMARY KEY possono esiste al tavolo mentre Nove cento novanta nove unica possibile creare indici
    • quando PRIMARY KEY vincolo è creato, si è creato come cluster a meno che non ci sia già un indice cluster su un tavolo o NONCLUSTERED viene utilizzato nella sua definizione; quando UNIQUE indice è stato creato, si è creato come NONCLUSTERED a meno che non è specifico per essere CLUSTERED e già non esiste;
  7. 0

    Ho un enorme database con no (separato) indice.

    Ogni volta che ho query con la chiave primaria i risultati sono, per tutti intensivi, immediata.

    • Che è perché il PK è un indice cluster, guardare il vostro piano di query
    • Prenderò in esame il piano di query, se qualcosa va storto.
  8. 0

    le chiavi primarie sono indicizzate automaticamente

    è possibile creare ulteriori indici utilizzando il pk a seconda dell’utilizzo

    • indice zip_code, id può essere utile se vi capita spesso di selezionare da zip_code e id

Lascia un commento