SQL Server Indexes Under-the-Hood · 2013-05-26 · PAGE HEADER (96 bytes) Row Offset 400 bytes/row...
Transcript of SQL Server Indexes Under-the-Hood · 2013-05-26 · PAGE HEADER (96 bytes) Row Offset 400 bytes/row...
Index Internals
http://[email protected]@EdwinMSarmientohttp://ca.linkedin.com/in/EdwinMSarmiento
Microsoft MVP - SQL Server
indexesHow do
work?
the better question to ask is
How is
?storeddata
PAGE HEADER (96 bytes)
Row Offset
Stored inpages
Row Offset
PAGE HEADER (96 bytes)
8 Pages = (64K)
Stored in either
or
(hobt)
unordered data
PAGE HEADER (96 bytes)
Row Offset
400 bytes/row80,000 rows
(1024 x 8) – 96 bytes
**
8096 bytes/page400 bytes/row
80,000 rows20 rows/page
=
=
finding rows in
IAM
HeapExtent 127 Extent 128 Extent 129
010203……
SmithOwenJones…...
………......
01020304…
AkersFunkSmithMartin...
………......
010203……
RussoWoodsBarr......
………......
010203……
ConFunkWoods......
………......
010203……
SmithOwenJones…...
………......
01020304…
AkersFunkSmithMartin...
………......
010203……
RussoWoodsBarr......
………......
0102030405
ConFunkWoodsDurrerLang
………......
010203……
SmithOwenJones…...
………......
01020304…
AkersFunkSmithMartin...
………......
010203……
RussoWoodsBarr......
………......
010203……
ConFunkWoods......
………......
010203……
SmithOwenJones…...
………......
01020304…
AkersFunkSmithMartin...
………......
010203……
RussoWoodsBarr......
………......
0102030405
DunnRandallOwenSleppyLaMee
………......
010203……
SmithOwenJones…...
………......
01020304…
AkersFunkSmithMartin...
………......
010203……
RussoWoodsBarr......
………......
010203……
ConFunkWoods......
………......
010203……
SmithOwenJones…...
………......
01020304…
AkersFunkSmithMartin...
………......
010203……
RussoWoodsBarr......
………......
010203……
SmithOwenJones…...
………......
01020304…
AkersFunkSmithMartin...
………......
010203……
RussoWoodsBarr......
………......
010203……
ConFunkWoods......
………......
010203……
SmithOwenJones…...
………......
01020304…
AkersFunkSmithMartin...
………......
010203……
RussoWoodsBarr......
………......
010203……
GraffBaconKoch......
………......
Extent 13001020304…
SeattleParisTokyoAtlanta...
………......
…
127 1
128 1
129 0
130 1
…
Extent Bit Map
ordered data
finding rows in
Page 140 - Root
Page 100 Page 120 Page 130
Page 141 Page 145
AkersBarrConFunkFunk...
23345678253413341534...
...
...
...
...
...
...
MartinMartinOwenPicaRusso...
12347778587878786078...
...
...
...
...
...
...
Martin
Page 110
Owen 5878 ...
SmithSmithSmithWoodsWoods...
14345778797822341634...
...
...
...
...
...
...
GanioHallJonesJonesJones...
76788078243459782634...
...
...
...
...
...
...
AkersGanio…
Smith…
Martin
Akers…MartinMartin
SELECT lastname, firstnameFROM memberWHERE lastname = 'Owen'
... ...
...
...
...
...
...
... ... ...
...
...
...
...
...
... ... ...
...
...
...
...
...
...... ...
...
...
...
...
...
...
…
How do I find rows
?non-clustered
in a heapwith a
index
NonClustered
Index
Non-LeafLevel
Page 12 - Root
Page 37 Page 28
Leaf Level(Key Value)
Page 41 Page 51 Page 61 Page 71
Akers
Barr
Con
Funk
Funk
4:706:01
4:705:03
4:704:01
4:706:02
4:704:02
Martin
Smith
...
Smith
Smith
Smith
Woods
Woods
4:706:03
4:708:04
4:707:01
4:704:03
4:705:02
Ganio
Hall
Jones
Jones
Jones
4:709:01
4:709:03
4:709:02
4:708:03
4:707:03
HeapPage 707 Page 708 Page 709
01
02
03
04
...
...
...
...
...
...
Akers
Funk
Smith
Mather
...
Page 704 Page 705 Page 706
01
02
03
...
...
...
...
...
...
...
Con
Funk
Woods
...
...
01
02
03
...
...
...
...
...
...
...
Russo
Woods
Barr
...
...
01
02
03
...
...
...
...
...
...
...
Smith
Owen
Jones
...
...
01
02
03
04
...
...
...
...
...
...
Martin
Pica
Jones
Smith
...
01
02
03
...
...
...
...
...
...
...
Ganio
Jones
Hall
...
...
Martin
Mather
Owen
Pica
Russo
4:708:01
4:706:04
4:707:02
4:708:02
4:705:01
Martin
02 ... Pica
Pica 4:708:02
01 ... Russo
02 ... Owen
Akers
Ganio
...
Akers
…
MartinMartin
Owen 4:707:02
04 ... Mather
Russo 4:705:01
Mather 4:706:04
SELECT lastname, firstname
FROM member
WHERE lastname
BETWEEN 'Masters' AND 'Russo'
NonClustered
Index
Non-LeafLevel
Page 12 - Root
Page 37 Page 28
Leaf Level(Key Value)
Page 41 Page 51 Page 61 Page 71
Akers
Barr
Con
Funk
Funk
4:706:01
4:705:03
4:704:01
4:706:02
4:704:02
Martin
Smith
...
Smith
Smith
Smith
Woods
Woods
4:706:03
4:708:04
4:707:01
4:704:03
4:705:02
Ganio
Hall
Jones
Jones
Jones
4:709:01
4:709:03
4:709:02
4:708:03
HeapPage 707 Page 708 Page 709
01
02
03
04
...
...
...
...
...
...
Akers
Funk
Smith
Mather
...
Page 704 Page 705 Page 706
01
02
03
...
...
...
...
...
...
...
Con
Funk
Woods
...
...
01
02
03
...
...
...
...
...
...
...
Russo
Woods
Barr
...
...
01
02
03
...
...
...
...
...
...
...
Smith
Owen
Jones
...
...
01
02
03
04
...
...
...
...
...
...
Martin
Pica
Jones
Smith
...
01
02
03
...
...
...
...
...
...
...
Ganio
Jones
Hall
...
...
Martin
Mather
Owen
Pica
Russo
4:708:01
4:706:04
4:707:02
4:708:02
4:705:01
Martin
02 ... Pica
Pica 4:708:02
01 ... Russo
02 ... Owen
Akers
Ganio
...
Akers
…
MartinMartin
Owen 4:707:02
04 ... Mather
Russo 4:705:01
Mather 4:706:04
Page 904 Page 4890 Page 4901
41
42
43
…
50
...
...
...
...
...
Akers
Funk
Smith
Maters
Page 901 Page 902 Page 903
01
02
03
...
20
...
...
...
...
...
Con
Funk
Woods
...
Crest
21
22
23
...
40
...
...
...
...
...
Russo
Woods
Barr
...
...
51
52
53
...
60
...
...
...
...
...
Smith
Owen
Jones
...
Ale
7991
799
799
799
7999
...
...
...
...
...
Martin
Pica
Jones
Smith
Marks
799
799
799
...
800
...
...
...
...
...
Ganio
Jones
Hall
...
Yu. . . . .
clusterWhat happens when you
a table?
Clustered Index
Page 100 Page 120 Page 130
Akers
Barr
Con
Funk
Funk
...
2334
5678
2534
1334
1534
...
...
...
...
...
...
...
Martin
Martin
Owen
Pica
Russo
...
1234
7778
5878
7878
6078
...
...
...
...
...
...
...
Page 110
Smith
Smith
Smith
Woods
Woods
...
1434
5778
7978
2234
1634
...
...
...
...
...
...
...
Ganio
Hall
Jones
Jones
Jones
...
7678
8078
2434
5978
2634
...
...
...
...
...
...
...
How do I find rows
?clustered
in a tablewith a
index
Clustered Index
Page 140 - Root
Page 100 Page 120 Page 130
Page 141 Page 145
Akers
Barr
Con
Funk
Funk
...
2334
5678
2534
1334
1534
...
...
...
...
...
...
...
Martin
Martin
Owen
Pica
Russo
...
1234
7778
5878
7878
6078
...
...
...
...
...
...
...
Akers
…
Martin
Martin
Page 110
Owen 5878 ...
Smith
Smith
Smith
Woods
Woods
...
1434
5778
7978
2234
1634
...
...
...
...
...
...
...
Ganio
Hall
Jones
Jones
Jones
...
7678
8078
2434
5978
2634
...
...
...
...
...
...
...
Akers
Ganio
…
Smith
…
MartinMartin
How do I find rows
?non-clustered
in aclustered indexwith a
index
Clustered IndexOn Last Name
NonclusteredIndex on
First Name
Non-LeafLevel
Leaf Level(ClusteredKey Value)
Diane
Don
Douglas
Glimp
Hall
Groncki
… …
Jose
Judy
Mike
Lugo
Lew
Nash
… …Mike Nash
Barr Adam
Cox
Dawson
Brian
Matt
… …
…
…
…
…
Kim
Kocak
LaMee
Shane
Haluk
Brian
… …
…
…
…
…
Aaron
Diane
…
Narp
Nash
Nicholls
Sylvie
Mike
Aaron
… …
…
…
…
…
Barr
Kim
Narp
O’DonnellNarp
Nash Mike …
Jose
Nina
…
Aaron
...
Jose
Aaron
Adam
Amy
Nicholls
Barr
Strande
… …
SELECT lastname, firstname, phoneFROM memberWHERE firstname = 'Mike'
Clustered IndexOn Last Name
NonclusteredIndex on
First Name
Non-LeafLevel
Leaf Level(ClusteredKey Value)
Diane
Don
Douglas
Glimp
Hall
Groncki
… …
Jose
Judy
Mike
Lugo
Lew
Nash
… …Mike Nash
Barr Adam
Cox
Dawson
Brian
Matt
… …
…
…
…
…
Kim
Kocak
LaMee
Shane
Haluk
Brian
… …
…
…
…
…
Aaron
Diane
…
Narp
Nash
Nicholls
Sylvie
Mike
Aaron
… …
…
…
…
…
Barr
Kim
Narp
O’DonnellNarp
Nash Mike …
Jose
Nina
…
Aaron
...
Jose
Aaron
Adam
Amy
Nicholls
Barr
Strande
… …
clustered index
primary keys
clustered index
http://[email protected]@EdwinMSarmientohttp://ca.linkedin.com/in/EdwinMSarmiento
Microsoft MVP - SQL Server