Inserto indice non cluster


10

Di 'che ho un tavolo come questo:

create table SomeTable
(
    id int identity(1, 1) not null primary key clustered,
    SomeString1 varchar(50) not null,
    SomeString2 varchar(50) not null
)
go

create nonclustered index IX_SomeString1
on SomeTable(SomeString1)
go

Se dovessi fare questo:

insert into SomeTable(SomeString1, SomeString2)
values('foo', 'bar')
go

E visualizzare il piano di esecuzione effettivo, vedo solo un inserto di indice cluster . Perché non vedo un inserto di indice non cluster nel piano di esecuzione?


Immagino perché fino a quando non raggiungi una certa soglia di cardinalità e numero di righe, non vale la pena mantenere le statistiche sull'indice non cluster. Se hai una singola riga in una tabella, l'ottimizzatore sa che non utilizzerà quell'indice, quindi non lo mantiene.
JNK

@JNK Ma se faccio un select * from SomeTable where String1 = 'foo', allora vedo che Query Optimizer sceglie di fatto l'indice IX_SomeString1per una ricerca dell'indice. Quindi deve aggiornare quell'indice, no?

1
Puoi vedere le statistiche e vederlo. Potrebbe anche essere un difetto nella visualizzazione del piano di esecuzione. Hai controllato l'xml?
JNK

1
SQL Server può utilizzare un piano ampio o stretto a seconda del numero di righe interessate. Questo controlla se le operazioni di manutenzione dell'indice avvengono separatamente e vengono visualizzate nel piano come operazioni separate o insieme e visualizzate come parte dell'operazione CI.
Martin Smith

1
@MartinSmith Grande spiegazione e non lo sapevo. Grazie per il link e il commento. Dovrebbe essere una risposta, credo.

Risposte:


9

Per un inserto a riga singola si ottiene un piano stretto / per riga

INSERT INTO SomeTable(SomeString1, SomeString2)
SELECT TOP 1 type, type
FROM master..spt_values

Piano stretto

Se si seleziona l'operatore Inserisci indice cluster e si visualizza la finestra delle proprietà, è possibile visualizzare le stesse informazioni mostrate nell'XML.

Finestra delle proprietà

Se provi per 1.000 righe

INSERT INTO SomeTable(SomeString1, SomeString2)
SELECT TOP 1000 type, type
FROM master..spt_values

Si ottiene un piano wide / per-index diverso con le operazioni suddivise separatamente

Piano ampio

Vedi Wide vs. Narrow Plans o il blog di Craig Freedman per maggiori informazioni sui due


6

Non fidarti mai della visualizzazione del piano grafico, è solo per i neofiti. I professionisti guardano sempre all'XML. L'operazione NC è proprio lì:

<Update DMLRequestSort="false">
  <Object Database="[testdb]" Schema="[dbo]" Table="[SomeTable]" Index="[PK__SomeTabl__3213E83F4AAF1C98]" IndexKind="Clustered" />
  <Object Database="[testdb]" Schema="[dbo]" Table="[SomeTable]" Index="[IX_SomeString1]" IndexKind="NonClustered" />

5
Non direi che è "solo per i neofiti" per un lungo tratto.
Dave Markle

Il mio commento "newb" non riguarda l'abilità dello spettatore, riguarda l'esperienza: coloro che erano stati bruciati dalle "omissioni" liberali dei piani grafici sanno meglio che fidarsi. Questo vale ancora di più per i grafici deadlock .
Remus Rusanu,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.