Lettura di pagineReading Pages

QUESTO ARGOMENTO SI APPLICA A: sìSQL Server (a partire dalla versione 2008)sìDatabase SQL di AzuresìAzure SQL Data Warehouse sìParallel Data Warehouse THIS TOPIC APPLIES TO: yesSQL Server (starting with 2008)yesAzure SQL DatabaseyesAzure SQL Data Warehouse yesParallel Data Warehouse

L'I/O di un'istanza del Motore di databaseDatabase Engine di SQL Server include letture logiche e fisiche.The I/O from an instance of the SQL Server Motore di databaseDatabase Engine includes logical and physical reads. La lettura logica viene eseguita ogni volta che il Motore di databaseDatabase Engine richiede una pagina dalla cache del buffer.A logical read occurs every time the Motore di databaseDatabase Engine requests a page from the buffer cache. Se la pagina non si trova nella cache buffer, viene prima eseguita una lettura fisica per copiare la pagina dal disco alla cache.If the page is not currently in the buffer cache, a physical read first copies the page from disk into the cache.

Le richieste di lettura generate da un'istanza di Motore di databaseDatabase Engine sono controllate dal motore relazionale e ottimizzate dal motore di archiviazione.The read requests generated by an instance of the Motore di databaseDatabase Engine are controlled by the relational engine and optimized by the storage engine. Il motore relazionale determina il metodo di accesso più efficace, ad esempio analisi di tabella, analisi di indice o lettura basata su chiavi. I metodi di accesso e i componenti di Gestione buffer del motore di archiviazione determinano il modello generale delle letture da eseguire e ottimizzano le letture necessarie per implementare il metodo di accesso.The relational engine determines the most effective access method (such as a table scan, an index scan, or a keyed read); the access methods and buffer manager components of the storage engine determine the general pattern of reads to perform, and optimize the reads required to implement the access method. Il thread che esegue il batch pianifica le operazioni di lettura.The thread executing the batch schedules the reads.

Read-AheadRead-Ahead

Motore di databaseDatabase Engine supporta un meccanismo di ottimizzazione delle prestazioni detto read-ahead.The Motore di databaseDatabase Engine supports a performance optimization mechanism called read-ahead. Questo meccanismo anticipa le pagine di dati e di indice necessarie per soddisfare il piano di esecuzione della query e inserisce le pagine nella cache buffer prima che vengano effettivamente utilizzate dalla query.Read-ahead anticipates the data and index pages needed to fulfill a query execution plan and brings the pages into the buffer cache before they are actually used by the query. In questo modo viene consentita la sovrapposizione di operazioni di calcolo e di I/O ed è possibile utilizzare al meglio sia la CPU che il disco.This allows computation and I/O to overlap, taking full advantage of both the CPU and the disk.

Il meccanismo read-ahead consente la lettura da parte di Motore di databaseDatabase Engine di un massimo di 64 pagine contigue (512 KB) incluse in un unico file.The read-ahead mechanism allows the Motore di databaseDatabase Engine to read up to 64 contiguous pages (512KB) from one file. La lettura viene eseguita come singola lettura non sequenziale nel numero appropriato di buffer, probabilmente non contigui, nella cache buffer.The read is performed as a single scatter-gather read to the appropriate number of (probably non-contiguous) buffers in the buffer cache. Se alcune pagine incluse nell'intervallo sono già presenti nella cache buffer, la pagina corrispondente della lettura verrà scartata dopo il completamento dell'operazione di lettura.If any of the pages in the range are already present in the buffer cache, the corresponding page from the read will be discarded when the read completes. Le pagine alle due estremità dell'intervallo possono inoltre venire rimosse se nella cache sono già presenti le pagine corrispondenti.The range of pages may also be "trimmed" from either end if the corresponding pages are already present in the cache.

Vi sono due tipi di meccanismi read-ahead, uno per le pagine di dati e uno per le pagine di indice.There are two kinds of read-ahead: one for data pages and one for index pages.

Lettura delle pagine di datiReading Data Pages

Le analisi di tabella utilizzate per leggere le pagine di dati sono molto efficaci in Motore di databaseDatabase Engine.Table scans used to read data pages are very efficient in the Motore di databaseDatabase Engine. Nelle pagine IAM (Index Allocation Map, mappa di allocazione degli indici) di un database di SQL Server vengono elencati gli extent usati da una tabella o da un indice.The index allocation map (IAM) pages in a SQL Server database list the extents used by a table or index. Il motore di archiviazione può leggere la pagina IAM per compilare un elenco ordinato degli indirizzi di disco che è necessario leggere.The storage engine can read the IAM to build a sorted list of the disk addresses that must be read. Questo consente al motore di archiviazione di ottimizzare le operazioni di I/O come se si trattasse di letture sequenziali di grandi dimensioni eseguite in sequenza, in base alla relativa posizione nel disco.This allows the storage engine to optimize its I/Os as large sequential reads that are performed in sequence, based on their location on the disk. Per altre informazioni sulle pagine IAM, vedere Gestione dello spazio utilizzato dagli oggetti.For more information about IAM pages, see Managing Space Used by Objects.

Lettura delle pagine di indiceReading Index Pages

Il motore di archiviazione legge le pagine di indice in modo seriale, in base all'ordine delle chiavi.The storage engine reads index pages serially in key order. Nella figura seguente è ad esempio illustrata una rappresentazione semplificata di un set di pagine foglia contenente un set di chiavi e il nodo di indice intermedio che esegue il mapping delle pagine foglia.For example, this illustration shows a simplified representation of a set of leaf pages that contains a set of keys and the intermediate index node mapping the leaf pages. Per altre informazioni sulla struttura delle pagine in un indice, vedere Strutture degli indici cluster.For more information about the structure of pages in an index, see Clustered Index Structures.

Reading_Pages

Il motore di archiviazione utilizza le informazioni della pagina di indice intermedio sopra il livello foglia per pianificare letture seriali per le pagine che contengono le chiavi.The storage engine uses the information in the intermediate index page above the leaf level to schedule serial read-aheads for the pages that contain the keys. Se vengono richieste tutte le chiavi da ABC a DEF, il motore di archiviazione legge innanzitutto la pagina di indice sopra la pagina foglia,If a request is made for all the keys from ABC to DEF, the storage engine first reads the index page above the leaf page. non limitandosi, tuttavia, alla semplice lettura in sequenza di ogni pagina di dati, dalla 504 alla 556, ovvero l'ultima che include chiavi comprese nell'intervallo specificato.However, it does not just read each data page in sequence from page 504 to page 556 (the last page with keys in the specified range). Al contrario, il motore di archiviazione esegue l'analisi della pagina di indice intermedio, compila un elenco delle pagine foglia da leggereInstead, the storage engine scans the intermediate index page and builds a list of the leaf pages that must be read. e pianifica quindi tutte le letture in base all'ordine delle chiavi.The storage engine then schedules all the reads in key order. Il motore di archiviazione riconosce inoltre che le pagine 504/505 e 527/528 sono contigue ed esegue una singola lettura sequenziale per recuperare le pagine adiacenti in una sola operazione.The storage engine also recognizes that pages 504/505 and 527/528 are contiguous and performs a single scatter read to retrieve the adjacent pages in a single operation. Se in un'operazione seriale è necessario recuperare molte pagine, il motore di archiviazione pianifica un blocco di letture per volta.When there are many pages to be retrieved in a serial operation, the storage engine schedules a block of reads at a time. Quando viene completato un subset di letture, il motore di archiviazione pianifica un numero equivalente di nuove letture fino a quando non sono state pianificate tutte le letture necessarie.When a subset of these reads is completed, the storage engine schedules an equal number of new reads until all the required reads have been scheduled.

Il motore di archiviazione utilizza la prelettura per rendere più veloci le ricerche nelle tabelle di base da indici non cluster.The storage engine uses prefetching to speed base table lookups from nonclustered indexes. Le righe foglia di un indice non cluster contengono puntatori alle righe di dati che includono i singoli valori di chiave specifici.The leaf rows of a nonclustered index contain pointers to the data rows that contain each specific key value. Mentre il motore di archiviazione legge le pagine foglia dell'indice non cluster, inizia anche a pianificare le letture asincrone per le righe di dati i cui puntatori sono già stati recuperati.As the storage engine reads through the leaf pages of the nonclustered index, it also starts scheduling asynchronous reads for the data rows whose pointers have already been retrieved. In questo modo, il motore di archiviazione può recuperare le righe di dati dalla tabella sottostante prima di avere completato l'analisi dell'indice non cluster.This allows the storage engine to retrieve data rows from the underlying table before it has completed the scan of the nonclustered index. La prelettura viene utilizzata indipendentemente dal fatto che alla tabella sia associato o meno un indice cluster.Prefetching is used regardless of whether the table has a clustered index. In SQL Server Enterprise Edition la prelettura viene usata con maggiore frequenza rispetto ad altre edizioni di SQL Server, di conseguenza il read-ahead viene effettuato su un numero maggiore di pagine.SQL Server Enterprise uses more prefetching than other editions of SQL Server, allowing more pages to be read ahead. In nessuna edizione è possibile configurare il livello di prelettura.The level of prefetching is not configurable in any edition. Per altre informazioni sugli indici non cluster, vedere Strutture degli indici non cluster.For more information about nonclustered indexes, see Nonclustered Index Structures.

Analisi avanzataAdvanced Scanning

In SQL Server Enterprise Edition la caratteristica di analisi avanzata consente la condivisione di analisi complete di tabella tra più attività.In SQL Server Enterprise, the advanced scan feature allows multiple tasks to share full table scans. Se in base al piano di esecuzione di un'istruzione Transact-SQL è necessaria l'analisi delle pagine di dati di una tabella e il Motore di databaseDatabase Engine rileva che tale tabella è già sottoposta ad analisi da un altro piano di esecuzione, il Motore di databaseDatabase Engine unisce la seconda analisi alla prima nella posizione corrente della seconda analisi.If the execution plan of a Transact-SQL statement requires a scan of the data pages in a table and the Motore di databaseDatabase Engine detects that the table is already being scanned for another execution plan, the Motore di databaseDatabase Engine joins the second scan to the first, at the current location of the second scan. Motore di databaseDatabase Engine legge ogni pagina una sola volta e passa le righe di ognuna a entrambi i piani di esecuzione.The Motore di databaseDatabase Engine reads each page one time and passes the rows from each page to both execution plans. Questa procedura continua fino a quando viene raggiunta la fine della tabella.This continues until the end of the table is reached.

A questo punto, il primo piano di esecuzione dispone dei risultati completi dell'analisi, mentre il secondo piano di esecuzione deve ancora recuperare le pagine di dati lette prima dell'unione all'analisi in corso.At that point, the first execution plan has the complete results of a scan, but the second execution plan must still retrieve the data pages that were read before it joined the in-progress scan. L'analisi del secondo piano di esecuzione riprende quindi dalla prima pagina di dati della tabella e termina in corrispondenza della posizione a partire dalla quale si è unita alla prima analisi.The scan for the second execution plan then wraps back to the first data page of the table and scans forward to where it joined the first scan. È possibile combinare in questo modo un numero qualsiasi di analisi.Any number of scans can be combined like this. Motore di databaseDatabase Engine continua a esaminare in ciclo tutte le pagine di dati fino al completamento di tutte le analisi.The Motore di databaseDatabase Engine will keep looping through the data pages until it has completed all the scans. Questo meccanismo è anche detto "analisi ciclica" ed è il motivo per cui non è possibile garantire l'ordine dei risultati restituiti da un'istruzione SELECT senza una clausola ORDER BY.This mechanism is also called "merry-go-round scanning" and demonstrates why the order of the results returned from a SELECT statement cannot be guaranteed without an ORDER BY clause.

Si supponga, ad esempio, che sia disponibile una tabella con 500.000 pagine.For example, assume that you have a table with 500,000 pages. L'Utente A esegue un'istruzione Transact-SQL che richiede un'analisi della tabella.UserA executes a Transact-SQL statement that requires a scan of the table. Quando tale analisi ha già elaborato 100.000 pagine, l'Utente B esegue un'altra istruzione Transact-SQL che esegue l'analisi della stessa tabella.When that scan has processed 100,000 pages, UserB executes another Transact-SQL statement that scans the same table. Motore di databaseDatabase Engine pianifica un set di richieste di lettura per le pagine successive alla 100.001 e passa le righe di ogni pagina a entrambe le analisi.The Motore di databaseDatabase Engine schedules one set of read requests for pages after 100,001, and passes the rows from each page back to both scans. Quando l'analisi raggiunge la pagina 200.000, l'Utente C esegue un'altra istruzione Transact-SQL che esegue l'analisi della stessa tabella.When the scan reaches the 200,000th page, UserC executes another Transact-SQL statement that scans the same table. A partire dalla pagina 200.001, Motore di databaseDatabase Engine passa a tutte e tre le analisi le righe di ogni pagina che legge.Starting with page 200,001, the Motore di databaseDatabase Engine passes the rows from each page it reads back to all three scans. Al termine della lettura della riga 500.000, l'analisi per l'Utente A è completata e quelle per l'Utente B e l'Utente C ricominciano la lettura a partire dalla pagina 1.After it reads the 500,000th row, the scan for UserA is complete, and the scans for UserB and UserC wrap back and start to read the pages starting with page 1. Quando Motore di databaseDatabase Engine raggiunge la pagina 100.000, l'analisi per l'Utente B è completata.When the Motore di databaseDatabase Engine gets to page 100,000, the scan for UserB is completed. L'analisi per l'UtenteC continua quindi finché non legge la pagina 200.000.The scan for UserC then keeps going alone until it reads page 200,000. A questo punto tutte le analisi risultano completate.At this point, all the scans have been completed.

Senza l'analisi avanzata, gli utenti dovrebbero condividere lo spazio nel buffer, contendendosi il disco.Without advanced scanning, each user would have to compete for buffer space and cause disk arm contention. Le stesse pagine verrebbero inoltre lette una volta per ogni utente, anziché essere lette una sola volta e condivise tra più utenti, provocando un peggioramento delle prestazioni e un sovraccarico delle risorse.The same pages would then be read once for each user, instead of read one time and shared by multiple users, slowing down performance and taxing resources.

Vedere ancheSee Also

Guida sull'architettura di pagina ed extent Pages and Extents Architecture Guide
Scrittura di pagine Writing Pages