Qual è la differenza tra una scansione della tabella e una scansione dell'indice cluster?

StackOverflow https://stackoverflow.com/questions/18764

  •  09-06-2019
  •  | 
  •  

Domanda

Poiché entrambi a Table Scan e un Clustered Index Scan essenzialmente scansiona tutti i record nella tabella, perché una scansione dell'indice cluster è presumibilmente migliore?

Ad esempio: qual è la differenza di prestazioni tra quanto segue quando sono presenti molti record?:

declare @temp table(
    SomeColumn varchar(50)
)

insert into @temp
select 'SomeVal'

select * from @temp

-----------------------------

declare @temp table(
    RowID int not null identity(1,1) primary key,
    SomeColumn varchar(50)
)

insert into @temp
select 'SomeVal'

select * from @temp
È stato utile?

Soluzione

In una tabella senza un indice cluster (una tabella heap), le pagine di dati non sono collegate tra loro, quindi l'attraversamento delle pagine richiede un cercare nella mappa di allocazione dell'indice.

Una tabella in cluster, tuttavia, ce l'ha pagine di dati collegate in un elenco doppiamente collegato - rendere le scansioni sequenziali un po' più veloci.Naturalmente, in cambio, hai l'onere di occuparti di mantenere in ordine le pagine dei dati INSERT, UPDATE, E DELETE.Una tabella heap, tuttavia, richiede una seconda scrittura su IAM.

Se la tua query ha un file RANGE operatore (es.: SELECT * FROM TABLE WHERE Id BETWEEN 1 AND 100), allora una tabella in cluster (essendo in un ordine garantito) sarebbe più efficiente, poiché potrebbe utilizzare le pagine dell'indice per trovare le pagine di dati rilevanti.Un heap dovrebbe scansionare tutte le righe, poiché non può fare affidamento sull'ordinamento.

E, naturalmente, un indice cluster ti consente di eseguire una RICERCA DI INDICE CLUSTERED, che è praticamente ottimale per le prestazioni... un heap senza indici comporterebbe sempre una scansione della tabella.

COSÌ:

  • Per la query di esempio in cui selezioni tutte le righe, l'unica differenza è l'elenco doppiamente collegato mantenuto da un indice cluster.Ciò dovrebbe rendere la tabella in cluster leggermente più veloce di un heap con un numero elevato di righe.

  • Per una query con a WHERE clausola che può essere (almeno parzialmente) soddisfatta dall'indice cluster, sarai in vantaggio a causa dell'ordinamento, quindi non dovrai scansionare l'intera tabella.

  • Per una query che non è soddisfatta dall'indice cluster, sei praticamente alla pari... ancora una volta, l'unica differenza è l'elenco doppiamente collegato per la scansione sequenziale.In entrambi i casi, non sei ottimale.

  • Per INSERT, UPDATE, E DELETE un mucchio può o meno vincere.L'heap non deve mantenere l'ordine, ma richiede una seconda scrittura su IAM.Penso che la differenza di prestazioni relativa sarebbe trascurabile, ma dipenderebbe anche dai dati.

Microsoft ha un carta bianca che confronta un indice cluster con un indice non cluster equivalente su un heap (non esattamente lo stesso di cui ho discusso sopra, ma vicino).La loro conclusione è sostanzialmente quella di inserire un indice cluster su tutte le tabelle.Farò del mio meglio per riassumere i loro risultati (di nuovo, nota che stanno davvero confrontando un indice non cluster con un indice cluster qui, ma penso che sia relativamente comparabile):

  • INSERT prestazione:l'indice cluster vince di circa il 3% a causa della seconda scrittura necessaria per un heap.
  • UPDATE prestazione:l'indice cluster vince di circa l'8% a causa della seconda ricerca necessaria per un heap.
  • DELETE prestazione:l'indice cluster vince di circa il 18% a causa della seconda ricerca necessaria e della seconda eliminazione necessaria dall'IAM per un heap.
  • separare SELECT prestazione:l'indice cluster vince di circa il 16% a causa della seconda ricerca necessaria per un heap.
  • allineare SELECT prestazione:l'indice cluster vince di circa il 29% a causa dell'ordinamento casuale di un heap.
  • concorrente INSERT:la tabella heap vince del 30% sotto carico a causa delle suddivisioni delle pagine per l'indice cluster.

Altri suggerimenti

http://msdn.microsoft.com/en-us/library/aa216840(SQL.80).aspx

L'operatore logico e fisico Clustered Index Scan esegue la scansione dell'indice cluster specificato nella colonna Argomento.Quando è presente un predicato WHERE:() facoltativo, vengono restituite solo le righe che soddisfano il predicato.Se la colonna Argument contiene la clausola ORDERED, Query Processor ha richiesto che l'output delle righe venga restituito nell'ordine in cui le ha ordinate l'indice cluster.Se la clausola ORDERED non è presente, lo storage engine scansionerà l'indice in modo ottimale (non garantendo l'ordinamento dell'output).

http://msdn.microsoft.com/en-us/library/aa178416(SQL.80).aspx

L'operatore logico e fisico Scansione tabella recupera tutte le righe dalla tabella specificata nella colonna Argomento.Se nella colonna Argomento viene visualizzato un predicato WHERE:(), vengono restituite solo le righe che soddisfano il predicato.

Una scansione della tabella deve esaminare ogni singola riga della tabella.La scansione dell'indice cluster richiede solo la scansione dell'indice.Non esegue la scansione di tutti i record nella tabella.Questo è, in realtà, il punto degli indici.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top