2016-11-18 8 views
3

Ich versuche zu verstehen, wie Seiten in SQL Server erstellt werden. Ich habe sehr einfaches Beispiel:Anzahl der physischen Seiten in SQL Server

-- 0 pages 
CREATE TABLE TMP_1(
    id int) 

-- 2 pages 
INSERT INTO TMP_1 
VALUES(1) 

-- 3 pages 
SELECT * 
INTO TMP_2 
FROM TMP_1 

Auf dem erste Tabelle tmp_1 hat keine Seiten, die eher intuitiv ist, weil es keine Daten gibt. Nachdem eine Zeile eingefügt wurde, gibt es zwei Seiten. Natürlich speichert man Daten, aber was ist der zweite?

Tabelle TMP_2 sollte identisch mit TMP_1 sein, aber es hat 3 Seiten, warum?

Ich überprüfe Anzahl der Seiten mit folgenden Code:

SELECT 
    t.NAME AS TableName, 
    p.rows AS RowCounts, 
    SUM(a.total_pages) AS TotalPages, 
    SUM(a.used_pages) AS UsedPages, 
    (SUM(a.total_pages) - SUM(a.used_pages)) AS UnusedPages 
FROM 
    sys.tables t 
INNER JOIN  
    sys.indexes i ON t.OBJECT_ID = i.object_id 
INNER JOIN 
    sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id 
INNER JOIN 
    sys.allocation_units a ON p.partition_id = a.container_id 
WHERE 
    t.NAME NOT LIKE 'dt%' 
    AND t.is_ms_shipped = 0 
    AND i.OBJECT_ID > 255 
    AND t.name LIKE 'TMP%' 
GROUP BY 
    t.Name, p.Rows 
ORDER BY 
    t.Name 
+0

Aber ich konnte nicht replizieren ..Ich habe dasselbe Ergebnis für "TMP_1" und "TMP_2" –

+0

Ist es möglich, dass es auf Einstellungen in SQL Server abhängt? –

+0

Dies ist Version os SQL SERVER, die ich verwende: Microsoft SQL Server 2008 R2 (SP2) - 10.50.4297.0 (X 64) 22. November 2013 17.24.14 Copyright (c) Microsoft Corporation Enterprise Edition (64-Bit) auf Windows NT 6.1 (Build 7600:) –

Antwort

4

Auf den ersten Tabelle tmp_1 hat keine Seiten, die eher intuitiv, da keine Daten

ist

SQL Server Seiten nur beim ersten Einfügen zuweisen

Nachdem eine Zeile eingefügt wurde, gibt es zwei Seiten. Natürlich speichert man Daten, aber was ist der zweite?

Diese IAM Seite aufgerufen wird ..

SQL Server verwendet Karten Index Zuordnung zu verfolgen, welche Seiten zugeteilt wurden Einheit, auf die Zuteilung. Sie werden auf speziellen IAM-Seiten gespeichert.

Jede IAM-Seite deckt einen Bereich von 64.000 Extents in einer Datei ab, ein sogenanntes GAM-Intervall. Wenn mehrere IAM-Seiten für eine einzelne Zuordnungseinheit benötigt werden, bilden Sie eine doppelt verkettete Liste, die IAM-Kette.

Siehe Demo unten ..

create table t1 
(
id int 
) 

drop table t1 
insert into t1 
values(1) 

DBCC TRACEON (3604); 

DBCC IND('PerformanceV3','t1',-1) 

Ausgabe gestrippt:

iam_chain_type PartitionID PageType 
In-row data 72057594048217088 10 
In-row data 72057594048217088 1 

für die dritte Frage:

Tabelle tmp_2 sollte tmp_1 identisch sein, aber es hat drei Seiten, Warum ?

dies eine Datenseite ist, wäre meine beste Vermutung unter der Annahme, dies ist die Art und Weise wird intern in Werke wählen , wenn Sie einfügen, SQL immer Seite dynamisch bei Bedarf erstellen können, aber mit select into, erstellt es ein zusätzlich weitere Datenseite ..

wie, warum, wählen Sie in zeigt alle drei Seiten wie verwendet:
I Zuteilung DMV glauben alle Seite Zuweisungen erfassen, aber wir reden verwendet here..which sein kann gesehen von unten DBCC Befehle genauer ..

dbcc traceon(3604) 
dbcc ind('performancev3','t2',-1) 

dbcc page(0,1,36639,3) 

Referenzen:
http://sqlity.net/en/2315/index-allocation-map/
http://www.sqlskills.com/blogs/paul/inside-the-storage-engine-using-dbcc-page-and-dbcc-ind-to-find-out-if-page-splits-ever-roll-back/

+0

Danke! Es beantwortet die erste meiner beiden Fragen. –

+0

@TomekTarczynski: meine Vermutung hinzugefügt, würde aber offen für neue Antworten bleiben – TheGameiswar

+0

Wenn ich richtig verstehe, dann sollte diese Seite leer (unbenutzt) sein, aber laut SQL Server werden alle 3 Seiten verwendet. –

Verwandte Themen