Domanda

Mentre stimare le dimensioni di una riga e di una tabella sono matematica abbastanza semplice, troviamo difficile indovinare quanto spazio occuperà ogni indice (per una data dimensione della tabella). Quali aree possiamo imparare per calcolare una stima e un tasso di crescita migliori per gli indici?

È stato utile?

Soluzione

Una foglia indice ha un preambolo che identifica la pagina di dati (7 byte più alcune informazioni di directory per eventuali colonne di lunghezza variabile) più una copia dei valori chiave che avranno le stesse dimensioni dei dati della tabella per quelli colonne. Ce n'è uno per ogni riga nella tabella. I livelli più alti dell'indice sono molto più piccoli, di solito meno dell'1% delle foglie a meno che tu non stia indicizzando una chiave molto ampia.

Il fattore di riempimento lascia un po 'di spazio libero in modo che gli aggiornamenti e gli inserti non generino un traffico di suddivisione foglia eccessivo.

EDIT: Questo collegamento MSDN descrive le strutture a livello di pagina, anche se è un po 'leggero sul formato delle singole righe dell'indice. Questa presentazione va nel formato fisico delle voci del registro del disco e delle pagine di dati in una certa misura. Questo più dettagli e include l'indice strutture di dati. Le colonne numeriche e a lunghezza fissa hanno le dimensioni indicate sulla scatola; dovresti stimare la dimensione media delle colonne varchar.

Per riferimento, alcuni documenti sul formato a blocchi di Oracle sono disponibili Qui e Qui .

Altri suggerimenti

quando possibile, in genere prendo 1000 record dalla tabella originale, inseriscili nel mio tavolo, e con lo script qui sotto ho un campione con cui giocare.

Ok, non è preciso, ma può darmi un punto di partenza.

--Find out the disk size of an index:
--USE [DB NAME HERE]
go
SELECT
OBJECT_NAME(I.OBJECT_ID) AS TableName,
I.name AS IndexName,   
8 * SUM(AU.used_pages) AS 'Index size (KB)',
CAST(8 * SUM(AU.used_pages) / 1024.0 AS DECIMAL(18,2)) AS 'Index size (MB)'
FROM
sys.indexes I
JOIN sys.partitions P ON P.OBJECT_ID = I.OBJECT_ID AND P.index_id = I.index_id
JOIN sys.allocation_units AU ON AU.container_id = P.partition_id
--WHERE 
--    OBJECT_NAME(I.OBJECT_ID) = '<TableName>'    
GROUP BY
I.OBJECT_ID,    
I.name
ORDER BY
TableName

--========================================================================================

--http://msdn.microsoft.com/en-us/library/fooec9de780-68fd-4551-b70b-2d3ab3709b3e.aspx

--I believe that keeping the GROUP BY 
--is the best option in this case
--because of sys.allocation_units
--can have 4 types of data inside
--as below:

--type tinyint
--Type of allocation unit.
--0 = Dropped
--1 = In-row data (all data types, except LOB data types)
--2 = Large object (LOB) data (text, ntext, image, xml, large value types, and CLR     user-defined types)
--3 = Row-overflow data

--marcelo miorelli 8-NOV-2013
--========================================================================================
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top