I campi "fuori dalla fila" vengono letti quando si utilizza un indice cluster?


10

So che quando VARCHAR(MAX)/NVARCHAR(MAX)vengono utilizzate le colonne i dati vengono archiviati out of the row: la riga di dati avrà un puntatore a un'altra posizione in cui è memorizzato il "valore elevato".

Ho le seguenti domande:

  1. Ogni campo è memorizzato out of the rowo solo maxquelli?
  2. Se si sta utilizzando la clustered indextabella per leggere l'intero record, vengono letti anche i campi memorizzati fuori dalla riga?

VARCHAR (MAX) o NVARCHAR (MAX) è considerato un "tipo di valore elevato". I tipi di valore elevato vengono generalmente archiviati "fuori riga". Significa che il ...


2
Da dove viene l'ultimo bit citato? Non è corretto.
Paul White 9


3
Il testo completo nel thread MSDN originale (di Jacob Sebastian) è corretto. La "citazione" di Stack Overflow ne perde parecchio. La piccola parte di cui hai citato sopra omette tutti i bit importanti :)
Paul White 9

Risposte:


13

So che quando VARCHAR(MAX)/NVARCHAR(MAX)vengono utilizzate le colonne i dati vengono archiviati fuori dalla riga ...

In realtà, ciò dipende dall'impostazione large value types out of rowdell'opzione, che può essere impostata utilizzando sp_tableoption. Dalla documentazione :

Estratto di BOL

L' impostazione predefinita prevede che i MAXvalori vengano archiviati in fila , fino a 8000 byte, se adatti. A meno che non sia stato utilizzato sp_tableoptionper modificare l'impostazione predefinita, MAXmolto probabilmente i dati verranno archiviati in riga.

Detto questo, è una cattiva pratica usare MAXtipi di dati per valori che non supereranno mai 8000 byte - utilizzare invece un tipo non MAX. A parte qualsiasi altra cosa, le prestazioni sono spesso significativamente inferiori quando si tratta di MAXtipi, poiché SQL Server deve essere pronto a far fronte a dati che potrebbero avere dimensioni massime di 2 GB.

Ogni campo è memorizzato fuori dalla riga o solo quelli max?

Solo MAXquelli. Inoltre, se una MAXcolonna precedentemente in riga viene spostata fuori riga, viene interessata solo quella colonna in quella riga. Viene sostituito in riga da un puntatore alla LOBstruttura fuori riga . Ci sono anche circostanze in cui le colonne non MAX possono essere spostate fuori riga.

Se si utilizza l'indice cluster della tabella per leggere l'intero record, vengono letti anche i campi memorizzati fuori dalla riga?

La scansione dell'indice cluster attraversa solo i dati in riga. Se per la query sono necessari dati fuori riga, vengono cercati utilizzando il puntatore in riga.


È sempre vero - Scanning the clustered index traverses only in-row data.? Ad esempio, se si desidera visualizzare i NVARCHAR(MAX)valori dei campi come è possibile lavorare solo con in-row-data(se i valori sono memorizzati fuori dalla riga)? O quando si utilizza l'indice cluster (perché non c'è nessun indice di copertura), ma non si ha intenzione di workcon il NVARCHAR(MAX)campo di SQL Server è abbastanza intelligente per capire che e saltare l'aspetto fino a out-of-rowdati?
gotqn

Grazie per la risposta. Quindi, infine, se hai due colonne - inte nvarchar(max)stai selezionando solo la intcolonna, SQL Server non spreca risorse per readi out-of-rowdati poiché sa che non lo userai?
gotqn

Molte grazie. È molto carino. Sembra che l'uso di sp_tableoptionte sia in grado di mettere fuori dal tavolo tutto ciò che non viene spesso utilizzato per ridurre le dimensioni della riga, quando vengono effettuate molte ricerche / scansioni di indici cluster.
gotqn

3
@gotqn Sì. Off-fila è stato il default per i vecchi tipi LOB text, ntexte image. Ovviamente, puoi anche archiviare i tipi più grandi in una tabella separata.
Paul White 9

4

Questo comportamento per l'archiviazione di oggetti di grandi dimensioni può essere controllato dall'impostazione della tabella:

exec sp_tableoption N'MyTable', 'large value types out of row', <'ON' or 'OFF'>

Il riferimento nella documentazione di SQL Server 2012 è disponibile all'indirizzo: http://msdn.microsoft.com/en-us/library/ms173530.aspx

Pertanto è possibile controllare dove viene utilizzato lo spazio, nella riga o memorizzato fuori dalla riga.


Grazie, davvero non sapevo che tu fossi in grado di controllarlo.
gotqn
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.