Che cosa significa ' bussing tabelle ' significa?


La migliore risposta

Prendere i tavoli è un lavoro in un ristorante. Significa pulire la tavola tra i clienti. Ciò include la rimozione di tutti gli oggetti sporchi o usati (piatti, posate, tovaglioli) e poi pulire il tavolo.

Il titolo di lavoro tradizionale per questo è “cameriere”, ma non tutti quelli che fanno questo lavoro sono ragazzi . Potrebbe esserci un termine più neutro rispetto al genere adesso.

Risposta

Nello scenario che descrivi, dichiari che i campi più comunemente usati nella tabella sono la chiave primaria (CompanyId ), un singolo campo dati (CompanyName) e una chiave esterna (IndustryId). Se ci sono indici su questi campi, che è garantito per la chiave primaria, ed estremamente probabile per la chiave esterna, poiché altrimenti le prestazioni del database farebbero schifo, le query che fanno riferimento solo a questi campi, in molti casi, saranno soddisfatte interamente dagli indici . Le pagine del database stesse non verranno lette. Puoi verificarlo da solo richiedendo un piano di esecuzione della query dallanalizzatore di query. Se il piano di esecuzione utilizza un “index seek” o “index spool”, allora utilizza un indice per creare i risultati della query. Se lindice della chiave primaria è in cluster, la situazione è leggermente diversa, ma la lascerò a per ricercare cosè un indice cluster in SQL Server e come cambia il modo in cui il database viene archiviato e utilizzato. In generale, se SQL Server può costruire un set di risultati utilizzando i dati di un indice, lo farà invece di utilizzare le pagine della tabella del database, perché ciò significa leggere meno dati. Un indice è strutturato in modo identico a una tabella, tranne per il fatto che ha solo le colonne specificate nellindice, più un campo del localizzatore di riga che è un puntatore a dove è memorizzata la riga; quel puntatore (24 byte) è in genere più piccolo dei dati della riga stessa e quindi quasi invariabilmente più righe della tabella indice rispetto alle righe della tabella si adatteranno a una pagina di database.

La dimensione della pagina del database in SQL Server è fissata a 8192 byte. 96 byte della pagina vengono utilizzati per unintestazione; questo più altri overhead lascia una dimensione massima di riga di 8060 byte. Tuttavia, SQL Server 2008 consentirà alle colonne varchar, nvarchar, varbinary e sql\_variant di superare questo limite e sposterà questi campi nelle pagine di overflow quando la loro inclusione in una riga comporterebbe il superamento del limite di dimensione di una riga. Inoltre, le colonne text, ntext, image, nvarchar (max), varchar (max), varbinary (max) e xml vengono sempre archiviate in pagine separate, indipendentemente dalla quantità di dati effettivamente archiviata nella colonna. La definizione di tabella che hai pubblicato mostra le larghezze totali delle colonne che superano di gran lunga il limite di 8060 byte, ma la maggior parte di queste è nei campi varchar (n), quindi ti ritroverai con pagine di overflow delle righe per le righe in cui la dimensione effettiva della variabile colonne di larghezza è sufficientemente grande. Il numero di pagine che una riga utilizzerà in questa tabella varierà pertanto, a seconda della lunghezza dei dati effettivamente memorizzati nelle colonne a larghezza variabile per ciascuna riga.

In termini di miglioramento delle prestazioni, se hai solo pochi campi comunemente usati, probabilmente puoi ottenere lo stesso miglioramento semplicemente assicurandoti che i campi e le combinazioni di campi che usi comunemente siano disponibili come indici. Ciò significa che la maggior parte dei set di righe può essere popolata dai dati dellindice anziché dai dati della tabella, il che eviterà problemi con il caricamento di righe di grandi dimensioni dal database. Soprattutto, questo può essere fatto interamente a livello DBA; lapplicazione non deve essere riscritta per riflettere la modifica allo schema causata dallaggiunta (o dalla rimozione) di indici. E ovviamente qualsiasi colonna che utilizzerai come parte di un join dovrebbe essere indicizzata; altrimenti, farai la tabella esegue la scansione per quei join che sono davvero piuttosto lenti.

Potrei suggerire di considerare ntext invece di grandi campi nvarchar per alcuni di quei campi più grandi, sebbene ciò possa richiedere modifiche al codice dellapplicazione perché la semantica del testo / ntext sono diversi da quelli di varchar / nvarchar. Le colonne di testo / ntesto sono sempre archiviate nelle pagine LOB, invece di essere archiviate in modo condizionale nella pagina dei dati della riga e se queste colonne sono spesso presenti e di dimensioni moderate (ad esempio , 1000-2000 byte), la memorizzazione come testo / ntext manterrà il resto delle pagine di dati delle righe più piccole e potrebbe consentire più righe per pagina, il che velocizzerà le scansioni delle tabelle che non devono effettivamente fare riferimento a queste colonne.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *