La mia conoscenza di livello inferiore di SQL (Server 2008) è limitata e ora viene messa alla prova dai nostri DBA. Lascia che ti spieghi (ho menzionato affermazioni ovvie nella speranza di avere ragione, ma se vedi qualcosa che non va, per favore dimmelo) lo scenario:
Abbiamo un tavolo che contiene le "ordinanze del tribunale" per le persone. Quando ho creato la tabella, (Name: CourtOrder), l'ho creata in questo modo:
CREATE TABLE dbo.CourtOrder
(
CourtOrderID INT NOT NULL IDENTITY(1,1), (Primary Key)
PersonId INT NOT NULL,
+ around 20 other fields of different types.
)
Ho quindi applicato un indice non cluster alla chiave primaria (per efficienza). Le mie ragioni sono che si tratta di un campo unico (chiave primaria) e dovrebbe essere indicizzato, principalmente per scopi di selezione, come spessoSelect from table where primary key = ...
Ho quindi applicato un indice CLUSTER su PersonId. Il motivo era raggruppare fisicamente gli ordini per una determinata persona, poiché la stragrande maggioranza del lavoro consiste nel ricevere ordini per una persona. Così,select from mytable where personId = ...
Sono stato tirato su su questo ora. Mi è stato detto che dovremmo mettere l'indice cluster sulla chiave primaria e l'indice normale su personId. Mi sembra molto strano. Prima di tutto, perché dovresti inserire un indice cluster su una colonna univoca? cos'è il clustering? Sicuramente è uno spreco dell'indice cluster? Avrei creduto che un indice normale sarebbe stato utilizzato su una colonna unica. Inoltre, raggruppare l'indice significherebbe che non possiamo raggruppare una colonna diversa (una per tabella, giusto?).
Il motivo per cui mi è stato detto che ho commesso un errore è che credono che l'inserimento di un indice cluster su PersonId rallenterebbe gli inserimenti. Per il guadagno del 5% in velocità di una selezione, avremmo una riduzione del 95% della velocità su inserimenti e aggiornamenti. È corretto e valido?
Dicono che, poiché raggruppiamo il personId, SQL Server deve riorganizzare i dati ogni volta che inseriamo o apportiamo una modifica a PersonId.
Allora ho chiesto, perché SQL dovrebbe avere il concetto di un INDICE A CLUSTER, se è così lento? È lento come dicono? Come devo impostare i miei indici per ottenere prestazioni ottimali? Avrei pensato che SELECT fosse usato più di INSERT ... ma dicono che abbiamo problemi di blocco su INSERTS ...
Spero che qualcuno possa aiutarmi.