Frage

Während die Schätzung der geraden Reihe und der Tabellengrößen ziemlich einfach ist, ist es schwierig, zu erraten, wie viel Platz jeder Index belegt (für eine bestimmte Tabellengröße). Welche Bereiche können wir lernen, eine bessere Schätz- und Wachstumsrate für Indizes zu berechnen?

War es hilfreich?

Lösung

Ein Indexblatt verfügt über eine Präambel, die die Datenseite (7 Bytes plus einige Verzeichnisinformationen für Spalten variabler Länge) sowie eine Kopie des Schlüsselwerts (n) identifiziert, die die gleiche Größe wie die Tabellendaten für diese Spalten haben. Es gibt eine für jede Zeile in der Tabelle. Die höheren Niveaus des Index sind viel kleiner, normalerweise weniger als 1% der Blätter, es sei denn, Sie indizieren einen sehr breiten Schlüssel.

Der Füllfaktor lässt Platz frei, damit Aktualisierungen und Einsätze keinen übermäßigen Verkehr aufblättern.

BEARBEITEN: Dieser MSDN -Link Beschreibt die Strukturen auf Seitenebene, obwohl es im Format der einzelnen Indexreihen ein bisschen Licht ist. Diese Präsentation Geht in das physische Format von Festplattenprotokolleinträgen und Datenseiten in gewissem Maße. Dieses Weitere Details und enthält die Indexdatenstrukturen. Numerische und feste Längenspalten haben die Größe, die sie auf der Box besagt. Sie müssten die durchschnittliche Größe der Varchar -Spalten schätzen.

Als Referenz finden Sie einige Dokumente im Blockformat von Oracle Hier und Hier.

Andere Tipps

Wenn möglich, nehme ich im Allgemeinen 1000 Datensätze aus der Originaltabelle, füge sie in meine eigene Tabelle ein und habe mit dem folgenden Skript ein Beispiel zum Spielen.

Ok, es ist nicht genau, kann mir aber einen Ausgangspunkt geben.

--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
--========================================================================================
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top