Domanda

Per amor di argomenti, diciamo che è per SQL 2005/8. Capisco che quando si posiziona gli indici su un tavolo per le dichiarazioni sintonia SELECT, questi indici hanno bisogno di mantenere durante le azioni INSERT / UPDATE / DELETE.

La mia domanda principale è questa:

Quando sarà SQL Server mantenere gli indici di una tabella?

Ho molte domande successive:

I ingenuamente presumo che lo farà dopo un comando è stato eseguito. Diciamo che sta inserendo 20 righe, manterrà l'indice dopo 20 righe sono state inserite e impegnati.

  • Che cosa succede nel caso in cui un sceneggiatura caratteristiche più istruzioni contro un tavolo, ma sono comunque dichiarazioni distinte?

  • Il server ha l'intelligenza per mantenere l'indice, dopo tutto istruzioni vengono eseguite o lo fa fare che secondo il prospetto?

Ho visto situazioni in cui gli indici sono eliminate e ricreate dopo le grandi molte azioni / INSERT / UPDATE.

  • Questo comporta presumibilmente la ricostruzione del gli indici della tabella intera, anche se si cambiare solo una manciata di righe?

  • Ci sarebbe un miglioramento delle prestazioni nel tentativo di raccogliere e INSERT azioni UPDATE in un lotto più grande, dice raccogliendo righe da inserire in un tabella temporanea, al contrario di fare molti inserti più piccoli?

  • Come sarebbe collazione le righe sopra stack contro cadere un indice contro prendendo il colpo di manutenzione?

Ci scusiamo per la proliferazione di domande -. E 'qualcosa che ho sempre saputo di essere consapevoli di, ma quando si cerca di sintonizzarsi uno script per ottenere un equilibrio, trovo io in realtà non so quando si verifica la manutenzione degli indici

Modifica Mi rendo conto che le domande di prestazioni dipendono in larga misura dalla quantità di dati durante l'inserimento / aggiornamento e il numero di indici. Sempre per amor di argomenti, mi piacerebbe avere due situazioni:

  • Una tabella di indice pesante sintonizzati per seleziona.
  • Un tavolo luminoso indice (PK).

Entrambe le situazioni avrebbe una grande serie di inserimento / aggiornamento, dire, 10k + righe.

Modifica 2: Sono consapevole di essere in grado di profilare un determinato script su un insieme di dati. Tuttavia, il profiling non dirmi perché un determinato approccio è più veloce di un altro. Sono più interessato alla teoria che sta dietro gli indici, e dove nascono i problemi di prestazioni, non un definitivo "questo è più veloce di quella" risposta.

Grazie.

È stato utile?

Soluzione

Quando la sua dichiarazione (nemmeno transazione) è completato, tutti gli indici sono up-to-date. Quando si impegnano, tutte le modifiche diventano permanenti, e tutti i blocchi vengono rilasciati. Fare altrimenti non sarebbe "intelligenza", violerebbe l'integrità e causare errori.

Modifica: da "integrità" intendo questo: una volta commesso, i dati devono essere immediatamente disponibili a chiunque. Se gli indici non sono up-to-date in quel momento, qualcuno potrebbe ottenere risultati non corretti.

Come si stanno aumentando la dimensione del lotto, le prestazioni migliora in origine, poi rallenterà. È necessario eseguire i propri parametri di riferimento e determinare la taglia ottimale batch. Allo stesso modo, è necessario punto di riferimento per determinare se è più veloce a goccia / indici ricreare o meno.

Edit: se si inserisce / aggiornamento / lotti cancellazione di righe in una dichiarazione, gli indici vengono modificati una volta per ogni dichiarazione. Lo script che segue dimostra che:

CREATE TABLE dbo.Num(n INT NOT NULL PRIMARY KEY);
GO
INSERT INTO dbo.Num(n)
SELECT 0
UNION ALL
SELECT 1;
GO
-- 0 updates to 1, 1 updates to 0
UPDATE dbo.Num SET n = 1-n;
GO
-- doing it row by row would fail no matter how you do it
UPDATE dbo.Num SET n = 1-n WHERE n=0;
UPDATE dbo.Num SET n = 1-n WHERE n=1;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top