Quali sono le considerazioni sulle prestazioni tra l'utilizzo di una vasta PK vs una chiave sintetica separata e UQ?

dba.stackexchange https://dba.stackexchange.com/questions/6468

Domanda

Ho diversi tavoli dove registrazioni possono essere identificati in modo univoco con diversi campi di attività ampio. In passato, ho usato questi campi come PK, con questi vantaggi in mente:

  • La semplicità; non ci sono campi estranei e solo un indice
  • Clustering consente una fusione veloce unisce e filtri gamma basata

Tuttavia, ho sentito un caso fatta per la creazione di un PK IDENTITY INT sintetico, e invece far rispettare la chiave business con un vincolo di UNIQUE separata. Il vantaggio è che il PK stretta rende indici secondari molto più piccoli.

Se una tabella ha non indici diversi dal PK, non vedo alcun motivo per favorire il secondo approccio, anche se in un grande tavolo è probabilmente meglio assumere che gli indici possono essere necessari in il futuro, e quindi favorire la PK sintetico stretto. Mi sto perdendo ogni considerazione?

Per inciso, non sto sostenendo contro utilizzando i tasti di sintesi nei data warehouse, sto solo interessato a quando utilizzare un unico vasto PK e quando utilizzare un PK stretta, più un vasto Regno Unito.

È stato utile?

Soluzione

Non v'è alcun svantaggio significativo utilizzando la chiave naturale come l'indice cluster

  • non ci sono indici non cluster
  • nessuna chiave esterna che fa riferimento questa tabella (si tratta di una riga padre)

Il rovescio della medaglia sarebbe aumentato divisioni di pagina come inserti di dati sarebbero stati distribuiti in tutto i dati, invece che alla fine.

Dove avete FKS o indici NC, il utilizzando una stretta, numerica, aumentando indice cluster ha vantaggi. Hai solo ripetere un paio di byte di dati per NC o FK ingresso, non è il tempo di business chiave / naturale.

Per quanto riguarda il motivo per cui, leggere il anche 5 articoli da Google

Nota ho evitato l'uso di "chiave primaria".

Si può avere l'indice cluster sulla chiave surrogata ma mantenere il PK sulle regole di business, ma come non cluster. Basta assicurarsi che il cluster è unico becauuse SQL aggiungerà un "uniquifier" per fare in modo.

Infine, può essere utile per avere una chiave surrogata, ma non ciecamente su ogni tavolo : molti-molti tavoli non hanno bisogno uno, o in cui una chiave composta dalle tabelle padre basteranno

Altri suggerimenti

Anche se rischierei affermare l'ovvio, un indice in una chiave surrogata (un numero id) è utile se è necessario individuare le cose con il loro numero di identificazione. Gli utenti non stanno andando a che fare con il numero di identificazione; che stanno andando a che fare con il testo leggibile. Quindi devi passare tutto il testo e il suo numero di identificazione molto, quindi l'interfaccia utente può visualizzare il testo e far funzionare sul numero id.

I DBMS userà questo tipo di indice per supportare chiavi esterne, se si definisce in questo modo.

È a volte può migliorare le prestazioni utilizzando i numeri ID come chiavi esterne, ma non è un miglioramento assoluto. Sul nostro sistema OLTP, chiavi esterne utilizzando i tasti naturali hanno sovraperformato le chiavi esterne che utilizzano numeri di identificazione su una suite di test di circa 130 (credo) query rappresentativi. (Poiché le informazioni importanti è spesso effettuato nelle chiavi, utilizzando i tasti naturali evitato un molto di join.) L'aumento di velocità media è stata un fattore di 85 (join utilizzando numeri di ID ha preso 85 volte più tempo per restituire le righe ).

I test hanno dimostrato che unisce su numeri ID non sarebbe eseguire più velocemente di quanto si legge sui tasti naturali nel nostro database fino a quando alcune tabelle hanno raggiunto molti milioni di righe. La larghezza della fila ha molto a che fare con questo - righe più larghe significano meno righe stare su una pagina, in modo da avere di leggere più pagine per ottenere 'n' righe. Quasi tutti i nostri tavoli sono in 5NF; maggior parte dei tavoli sono abbastanza stretti.

Con il tempo si unisce inizio per eseguire fuori semplice legge qui , mettendo le tabelle e gli indici critici su un disco a stato solido potrebbe livellare le prestazioni nelle centinaia di milioni di righe.

Ho un database OLTP intero progettato utilizzando le colonne di identità per il clustering + pk. Funziona piuttosto veloce su inserto / cerca ma ho visto alcuni problemi:
1. l'opzione di riempimento indice è inutile perché gli inserti accadono solo alla fine dell'indice
2. più spazio di archiviazione. Ho le tabelle con decine di milioni di dischi e 1 int occupa spazio da solo. Ogni tabella con una colonna di identità per la sua pk deve avere un altro indice per le imprese cerca, quindi, anche più spazio di archiviazione richiesto.
3. scalabilità. Questo è il problema peggiore. Perché ogni inserto va fino alla fine dell'indice, ogni inserto sottolineerà solo la fine dell'indice (allocazione, io in scrittura, ecc). Usando una chiave di business come una chiave di clustering è possibile distribuire in modo uniforme gli inserti sull'indice. Ciò significa che avete appena eliminato un grande hotspot. Si può facilmente utilizzare più file per un indice, ogni file su un disco separato, ogni unità di lavoro separatamente.

I iniziato a cambiare le mie tabelle da un colonne di identità ai tasti naturali (forse separare per il clustering e pk). Ci si sente proprio meglio ora.

vorrei suggerire quanto segue (almeno per un db OLTP):
1. l'utilizzo come chiave di clustering le colonne di destra nel giusto ordine da ottimizzare le query più frequenti
2. Utilizzare un pk le colonne di destra che hanno senso per te tabella

Se la chiave cluster non è semplice e contiene caratteri (char [], varchar, nvarchar), credo che la risposta è 'dipende', è necessario analizzare singolarmente ogni caso.

Continuo il seguente principio: Ottimizza per la query più comuni, riducendo al minimo lo scenario peggiore

.

Ho quasi dimenticato un esempio. Ho alcune tabelle che fanno riferimento a se stessi. Se tale tabella include una colonna Identity per la chiave primaria esso è, quindi inserendo una riga potrebbe richiedere un aggiornamento e l'inserimento di più di una riga alla volta potrebbe essere difficile se non impossibile (dipende dal disegno della tabella).

Da un punto di vista delle prestazioni la cui scelta fondamentale è la chiave "primaria" non fa alcuna differenza a tutti. Non c'è differenza tra l'utilizzo di una chiave primaria e un vincolo UNIQUE per far rispettare le chiavi.

delle prestazioni è determinato dalla selezione e dal tipo di indici e altre opzioni di archiviazione e dal modo in cui i tasti sono utilizzati nelle query e il codice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top