インデックス

SQL Serverでクエリ性能を改善する

Dean Smith

Founder, Atamai Analytics

インデックスとは

  • テーブルからのデータアクセスを高速化する仕組み
  • 全表走査せずにデータを素早く特定
  • フィルタ条件のあるクエリの性能向上に有効
  • テーブル列に適用
  • 通常はデータベース管理者が追加
SQL Serverでクエリ性能を改善する

クラスタ化/非クラスタ化インデックス

クラスタ化インデックス

  • たとえ: 辞書
  • インデックス列でテーブルのデータページが並ぶ
  • テーブルにつき1つのみ
  • 検索を高速化
SQL Serverでクエリ性能を改善する

クラスタ化/非クラスタ化インデックス

クラスタ化インデックス

  • たとえ: 辞書
  • インデックス列でテーブルのデータページが並ぶ
  • テーブルにつき1つのみ
  • 検索を高速化

非クラスタ化インデックス

  • たとえ: 教科書の巻末索引
  • 構造は、無秩序なデータページへの索引ポインタの整列層
  • 複数作成可能
  • 挿入・更新を改善
SQL Serverでクエリ性能を改善する

クラスタ化インデックス: B-tree 構造

 

  • ルートノード

 

  • 分岐ノード

 

  • ページノード
SQL Serverでクエリ性能を改善する

クラスタ化インデックス: B-tree 構造

ルートノード:                          
                                    A G O W
分岐ノード:
                A B E F             G H J K             O P S T
ページノード:
          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 | ...
       ...                ...                ...                 ...
SQL Serverでクエリ性能を改善する

クラスタ化インデックスなしの Customers テーブル

SELECT *
FROM Customers
WHERE CustomerID = "PARIS"
ページノード:
            Page 1
         CustomerID |...
         ALFKI | ... 
         ANATR | ...
         BLONP | ... 
         BSBEV | ...
         ...                 
SQL Serverでクエリ性能を改善する

クラスタ化インデックスなしの Customers テーブル

SELECT *
FROM Customers
WHERE CustomerID = "PARIS"
ページノード:
            Page 1              Page 2
         CustomerID |...     CustomerID|...
         ALFKI | ...         FOLIG | ...
         ANATR | ...         FRANK | ...
         BLONP | ...         GALED | ...
         BSBEV | ...         GREAL | ...
         ...                 ...
SQL Serverでクエリ性能を改善する

クラスタ化インデックスなしの Customers テーブル

SELECT *
FROM Customers
WHERE CustomerID = "PARIS"
ページノード:
            Page 1              Page 2              Page 3
         CustomerID |...     CustomerID|...      CustomerID | ... 
         ALFKI | ...         FOLIG | ...         LILAS | ...  
         ANATR | ...         FRANK | ...         LINOD | ...  
         BLONP | ...         GALED | ...         MEREP | ...  
         BSBEV | ...         GREAL | ...         MORGK | ...   
         ...                 ...                 ...          
SQL Serverでクエリ性能を改善する

クラスタ化インデックスなしの Customers テーブル

SELECT *
FROM Customers
WHERE CustomerID = "PARIS"
ページノード:
            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 | ...          
         ...                 ...                 ...                  ...
SQL Serverでクエリ性能を改善する

クラスタ化インデックスありの Customers テーブル

SELECT *
FROM Customers
WHERE CustomerID = "PARIS"
ルートノード:                          
                                         ALFKI FOLIG OLDWO WOLZA
分岐ノード:
              ALFKI BONAP DRACD FISSA    FOLIG GALED LILAS NORTS    OCEAN OLDWO QUICK WOLZA
ページノード:
                    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 | ...
                 ...                 ...                 ...                  ...
SQL Serverでクエリ性能を改善する

クラスタ化インデックスありの Customers テーブル

SELECT *
FROM Customers
WHERE CustomerID = "PARIS"
ルートノード:                          
                                                     OLDWO WOLZA
分岐ノード:
              ALFKI BONAP DRACD FISSA    FOLIG GALED LILAS NORTS    OCEAN OLDWO QUICK WOLZA
ページノード:
                    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 | ...
                 ...                 ...                 ...                  ...
SQL Serverでクエリ性能を改善する

クラスタ化インデックスありの Customers テーブル

SELECT *
FROM Customers
WHERE CustomerID = "PARIS"
ルートノード:                          
                                                     OLDWO WOLZA
分岐ノード:
                                                                          OLDWO QUICK 
ページノード:
                    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 | ...
                 ...                 ...                 ...                  ...
SQL Serverでクエリ性能を改善する

クラスタ化インデックスありの Customers テーブル

SELECT *
FROM Customers
WHERE CustomerID = "PARIS"
ルートノード:                          
                                                     OLDWO WOLZA
分岐ノード:
                                                                          OLDWO QUICK 
ページノード:
                                                                                 Page 4
                                                                              CustomerID | ...
                                                                              OCEAN | ...
                                                                              PARIS | ...
                                                                              PICCO | ...
                                                                              QUICK | ...
                                                                              ...
SQL Serverでクエリ性能を改善する

クラスタ化インデックスありの Customers テーブル

SELECT *
FROM Customers
WHERE CustomerID = "PARIS"
ルートノード:                          
                                                     OLDWO WOLZA
分岐ノード:
                                                                          OLDWO QUICK 
ページノード:
                                                                                 Page 4
                                                                              CustomerID | ...



                                                                             PARIS | ...


SQL Serverでクエリ性能を改善する

クラスタ化インデックス: 例

SET STATISTICS IO ON
SELECT * 
FROM PlayerStats 
WHERE Team = 'OKC'

PlayerStats テーブル(インデックスなし)

Table 'PlayerStats'. ..., logical reads 12, ...

 

Teamクラスタ化インデックスありの PlayerStats テーブル

Table 'PlayerStats'. ..., logical reads 2, ...
SQL Serverでクエリ性能を改善する

練習に進みましょう!

SQL Serverでクエリ性能を改善する

Preparing Video For Download...