Improving Query Performance in SQL Server
Dean Smith
Founder, Atamai Analytics
Clustered Index
Clustered Index
Non-clustered Index
ROOT NODE:
A G O W
BRANCH NODES:
A B E F G H J K O P S T
PAGE NODES:
Page 1 Page 2 Page 3 Page 4
Index Column |... Index Column |... Index Column | ... Index Column | ...
A | ... E | ... I | ... M | ...
B | ... F | ... J | ... N | ...
C | ... G | ... K | ... O | ...
D | ... H | ... L | ... P | ...
... ... ... ...
SELECT *
FROM Customers
WHERE CustomerID = "PARIS"
PAGE NODES:
Page 1
CustomerID |...
ALFKI | ...
ANATR | ...
BLONP | ...
BSBEV | ...
...
SELECT *
FROM Customers
WHERE CustomerID = "PARIS"
PAGE NODES:
Page 1 Page 2
CustomerID |... CustomerID|...
ALFKI | ... FOLIG | ...
ANATR | ... FRANK | ...
BLONP | ... GALED | ...
BSBEV | ... GREAL | ...
... ...
SELECT *
FROM Customers
WHERE CustomerID = "PARIS"
PAGE NODES:
Page 1 Page 2 Page 3
CustomerID |... CustomerID|... CustomerID | ...
ALFKI | ... FOLIG | ... LILAS | ...
ANATR | ... FRANK | ... LINOD | ...
BLONP | ... GALED | ... MEREP | ...
BSBEV | ... GREAL | ... MORGK | ...
... ... ...
SELECT *
FROM Customers
WHERE CustomerID = "PARIS"
PAGE NODES:
Page 1 Page 2 Page 3 Page 4
CustomerID |... CustomerID|... CustomerID | ... CustomerID | ...
ALFKI | ... FOLIG | ... LILAS | ... OCEAN | ...
ANATR | ... FRANK | ... LINOD | ... PARIS | ...
BLONP | ... GALED | ... MEREP | ...
BSBEV | ... GREAL | ... MORGK | ...
... ... ... ...
SELECT *
FROM Customers
WHERE CustomerID = "PARIS"
ROOT NODE:
ALFKI FOLIG OLDWO WOLZA
BRANCH NODES:
ALFKI BONAP DRACD FISSA FOLIG GALED LILAS NORTS OCEAN OLDWO QUICK WOLZA
PAGE NODES:
Page 1 Page 2 Page 3 Page 4
CustomerID |... CustomerID|... CustomerID | ... CustomerID | ...
ALFKI | ... FOLIG | ... LILAS | ... OCEAN | ...
ANATR | ... FRANK | ... LINOD | ... PARIS | ...
BLONP | ... GALED | ... MEREP | ... PICCO | ...
BSBEV | ... GREAL | ... MORGK | ... QUICK | ...
... ... ... ...
SELECT *
FROM Customers
WHERE CustomerID = "PARIS"
ROOT NODE:
OLDWO WOLZA
BRANCH NODES:
ALFKI BONAP DRACD FISSA FOLIG GALED LILAS NORTS OCEAN OLDWO QUICK WOLZA
PAGE NODES:
Page 1 Page 2 Page 3 Page 4
CustomerID |... CustomerID|... CustomerID | ... CustomerID | ...
ALFKI | ... FOLIG | ... LILAS | ... OCEAN | ...
ANATR | ... FRANK | ... LINOD | ... PARIS | ...
BLONP | ... GALED | ... MEREP | ... PICCO | ...
BSBEV | ... GREAL | ... MORGK | ... QUICK | ...
... ... ... ...
SELECT *
FROM Customers
WHERE CustomerID = "PARIS"
ROOT NODE:
OLDWO WOLZA
BRANCH NODES:
OLDWO QUICK
PAGE NODES:
Page 1 Page 2 Page 3 Page 4
CustomerID |... CustomerID|... CustomerID | ... CustomerID | ...
ALFKI | ... FOLIG | ... LILAS | ... OCEAN | ...
ANATR | ... FRANK | ... LINOD | ... PARIS | ...
BLONP | ... GALED | ... MEREP | ... PICCO | ...
BSBEV | ... GREAL | ... MORGK | ... QUICK | ...
... ... ... ...
SELECT *
FROM Customers
WHERE CustomerID = "PARIS"
ROOT NODE:
OLDWO WOLZA
BRANCH NODES:
OLDWO QUICK
PAGE NODES:
Page 4
CustomerID | ...
OCEAN | ...
PARIS | ...
PICCO | ...
QUICK | ...
...
SELECT *
FROM Customers
WHERE CustomerID = "PARIS"
ROOT NODE:
OLDWO WOLZA
BRANCH NODES:
OLDWO QUICK
PAGE NODES:
Page 4
CustomerID | ...
PARIS | ...
SET STATISTICS IO ON
SELECT *
FROM PlayerStats
WHERE Team = 'OKC'
PlayerStats
table with no index
Table 'PlayerStats'. ..., logical reads 12, ...
PlayerStats
table with clustered index on Team
Table 'PlayerStats'. ..., logical reads 2, ...
Improving Query Performance in SQL Server