株式会社コーソル

コーソルDatabaseエンジニアのブログ

技術ブログ

ビットマップ索引 – Oracle,MySQL,PostgreSQLの比較

Oracle ACE Proの渡部です。 主要なRDBMS製品を比較します。

  • 大枠を整理することが最大の目的です。細かい例外事項は適宜記載を割愛しています。
  • この記事の対象製品およびバージョンは以下のとおりですが、バージョン依存性は比較的少ないはずです。
    • Oracle 19c (19.22以降)
    • MySQL 8.0.37以降
    • PostgreSQL 16以降
  • 諸所の事情により、2023年以前の記事とは異なり、一旦SQL Serverを記載対象外としました。
    • SQL Serverについての記載をご要望される場合は、https://x.com/wrcsus4 にリクエストくださいませ。
  • 時間ができた時に随時追記予定です。
  • もし誤りを見つけた場合は、優しく教えていただけると嬉しいです。→ https://x.com/wrcsus4 or ryota.watabe at cosol dot jp

「主要RDBMS製品の比較」ページ一覧

立場の表明

  • コーソルはデータベース関連製品の販売およびプロフェッショナルサービス提供を行っている営利企業です。
  • https://cosol.jp にある全てのコンテンツは、情報提供に加えて、コーソルの認知度向上、コーソルの営利活動の促進を目的としています。

Database Performance Analyzer DPA

コーソルのDbvisitサービス

著者について

Bツリー以外の索引

リレーショナルデータベースで索引(インデックス)というと、たいていBツリー索引(Bツリーインデックス)のことですが、Bツリー以外の索引も存在します。

各RDBMS製品の、Bツリー以外の索引の対応状況をまとめました。

Bツリー索引については、以下の記事を参照してください。

主要RDBMS製品の比較 – インデックスの仕組みと物理構造

ビットマップ索引 / ビットマップ インデックス

ビットマップ索引は主にデータウェアハウス環境で使われます。

Oracleにおけるビットマップ索引は以下の特徴を持ちます。

  • 以下の状況に向く
    • 列の個別値の数(NDV)が少ない
    • 列値が頻繁に変更されない (Bツリー索引と異なり、ロック範囲が行単位でないため)
  • 以下のクエリを効率的に処理可能
    • 論理条件(AND、ORおよびNOT)を用いた複合条件
    • COUNT()
    • IS NULL (Bツリー索引と異なり、索引内にNULLを保持するため)
  • Bツリー索引よりもサイズが小さい

ビットマップ索引の構造

Oracleのビットマップ索引の構造を示します。

  • 索引列の値をビットマップに変換し、索引に保持します。
  • ビットマップ索引の構造はBツリー索引の構造と同等で、ツリー構造をしています。ただし、キーとデータにどの値を使うかが異なります。

ビットマップ索引の実行計画

以下にビットマップ索引を用いるSQLと実行計画を示します。

SELECT * FROM SALES
  WHERE cust_id = 3608
    AND prod_id = 119
    AND time_id = TO_DATE('01/12/31 00:00:00', 'YY/MM/DD HH24:MI:SS');

---------------------------------------------------------------
| Id  | Operation                           | Name           | 
---------------------------------------------------------------
|   0 | SELECT STATEMENT                    |                | 
|   1 |  TABLE ACCESS BY INDEX ROWID BATCHED| SALES          | 
|   2 |   BITMAP CONVERSION TO ROWIDS       |                | 
|   3 |    BITMAP AND                       |                | 
|*  4 |     BITMAP INDEX SINGLE VALUE       | SALES_CUST_BIX | 
|*  5 |     BITMAP INDEX SINGLE VALUE       | SALES_PROD_BIX | 
|*  6 |     BITMAP INDEX SINGLE VALUE       | SALES_TIME_BIX | 
---------------------------------------------------------------

   4 - access("CUST_ID"=3608)
   5 - access("PROD_ID"=119)
   6 - access("TIME_ID"=TO_DATE('01/12/31 00:00:00','YY/MM/DD HH24:MI:SS'))

SELECT * FROM SALES
  WHERE cust_id = 3608
     OR prod_id = 119
     OR time_id = TO_DATE('01/12/31 00:00:00', 'YY/MM/DD HH24:MI:SS');

---------------------------------------------------------------
| Id  | Operation                           | Name           | 
---------------------------------------------------------------
|   0 | SELECT STATEMENT                    |                | 
|   1 |  TABLE ACCESS BY INDEX ROWID BATCHED| SALES          | 
|   2 |   BITMAP CONVERSION TO ROWIDS       |                | 
|   3 |    BITMAP OR                        |                | 
|*  4 |     BITMAP INDEX SINGLE VALUE       | SALES_PROD_BIX | 
|*  5 |     BITMAP INDEX SINGLE VALUE       | SALES_CUST_BIX | 
|*  6 |     BITMAP INDEX SINGLE VALUE       | SALES_TIME_BIX | 
---------------------------------------------------------------

   4 - access("PROD_ID"=119)
   5 - access("CUST_ID"=3608)
   6 - access("TIME_ID"=TO_DATE('01/12/31 00:00:00','YY/MM/DD HH24:MI:SS'))

SELECT count(*) FROM SALES
  WHERE cust_id = 3608
    AND prod_id = 119
    AND time_id = TO_DATE('01/12/31 00:00:00', 'YY/MM/DD HH24:MI:SS');

--------------------------------------------------------
| Id  | Operation                    | Name           | 
--------------------------------------------------------
|   0 | SELECT STATEMENT             |                | 
|   1 |  SORT AGGREGATE              |                | 
|   2 |   BITMAP CONVERSION COUNT    |                | 
|   3 |    BITMAP AND                |                | 
|*  4 |     BITMAP INDEX SINGLE VALUE| SALES_CUST_BIX | 
|*  5 |     BITMAP INDEX SINGLE VALUE| SALES_TIME_BIX | 
|*  6 |     BITMAP INDEX SINGLE VALUE| SALES_PROD_BIX | 
--------------------------------------------------------

   4 - access("CUST_ID"=3608)
   5 - access("TIME_ID"=TO_DATE('01/12/31 00:00:00','YY/MM/DD HH24:MI:SS'))
   6 - access("PROD_ID"=119)

SELECT cust_last_name, cust_first_name
  FROM customers
 WHERE cust_year_of_birth < 1918;

------------------------------------------------------------------
| Id  | Operation                           | Name              | 
------------------------------------------------------------------
|   0 | SELECT STATEMENT                    |                   | 
|   1 |  TABLE ACCESS BY INDEX ROWID BATCHED| CUSTOMERS         | 
|   2 |   BITMAP CONVERSION TO ROWIDS       |                   | 
|*  3 |    BITMAP INDEX RANGE SCAN          | CUSTOMERS_YOB_BIX | 
------------------------------------------------------------------

   3 - access("CUST_YEAR_OF_BIRTH"<1918)
       filter("CUST_YEAR_OF_BIRTH"<1918)

SELECT count(*) FROM CUSTOMERS
 WHERE CUST_MARITAL_STATUS IS NULL;

--------------------------------------------------------------
| Id  | Operation                   | Name                  | 
--------------------------------------------------------------
|   0 | SELECT STATEMENT            |                       | 
|   1 |  SORT AGGREGATE             |                       | 
|   2 |   BITMAP CONVERSION COUNT   |                       | 
|*  3 |    BITMAP INDEX SINGLE VALUE| CUSTOMERS_MARITAL_BIX | 
--------------------------------------------------------------

   3 - access("CUST_MARITAL_STATUS" IS NULL)

MySQL, PostgreSQLにはビットマップ索引はない

MySQL, PostgreSQLにはビットマップ索引はありません。 しかし、PostgreSQLは、メモリ上でBツリー索引をビットマップに変換して、行の絞り込みを行う機能があります。

EXPLAIN (COSTS OFF)
SELECT * FROM person
 WHERE age = 20 ;

                        QUERY PLAN
-------------------------------------------------------
 Bitmap Heap Scan on person
   Recheck Cond: (age = 20)
   ->  Bitmap Index Scan on idx
         Index Cond: (age = 20)

「主要RDBMS製品の比較」ページ一覧

[PR] オンプレミス&クラウドのマルチDB製品に対応した性能管理ツールDPA

Database Performance Analyzer (DPA) は、オンプレミス&クラウドに対応するデータベース性能監視/分析ツールです。

Database Performance Analyzer DPA

この記事で取り上げたRDBMS製品を含む、非常に多くのデータベース製品/サービスに対応しています。

  • Oracle Database
  • MS SQL Server
  • Sybase SAP ASE
  • IBM Db2
  • MySQL / MariaDB / Percona Server for MySQL
  • PostgreSQL / Enterprise DB
  • AWS
    • Amazon RDS for Oracle Database / SQL Server / MySQL / MariaDB / PostgreSQL
    • Amazon Aurora for MySQL / PostgreSQL
  • Azure
    • Azure SQL Database
    • Azure SQL Managed Instance
    • Azure SQL for PostgreSQL
    • Azure Database for MySQL / MariaDB
  • Google Cloud
    • Google Cloud SQL for MySQL / PostgreSQL / SQL Server

以下の特徴があり、導入しやすく有用な製品です。

  • 非常に低価格。課金単位は監視インスタンスの数で、1インスタンス14.7万円/年から(2023年1月時点)。
  • インストールが容易。DBサーバへのエージェント導入は不要。
  • オンラインデモサイトですぐに使用感を確認可能 → https://cosol.jp/techdb/2022/08/dpa_online_demo/
  • 待機時間を基礎とする性能分析(近年主流の性能分析メソッド)
  • 機械学習アルゴリズムに基づく異常検知機能(Anomaly Detection)

なぜコーソルからDatabase Performance Analyzer (DPA)を購入すべきなのか

コーソルはDatabase Performance Analyzer (DPA)の一次代理店で、Database Performance Analyzer (DPA)の製品販売を行います。 SIer様、販社様がDatabase Performance Analyzer (DPA)を販売および導入することも可能です。

Database Performance Analyzer DPA

コーソルはデータベースの技術力を強みとしています。なかでもOracle Database技術力は日本随一です。MySQL、PostgreSQL、MS SQL Serverの資格や実績を持つエンジニアも多数在籍しております。

独自のDPAナレッジを公開

DPAの導入や監視設定に関する手順をナレッジとして公開しています。評価版をご利用される際の参考にしていただけると幸いです。

多数のOracle関連書籍を執筆

ORACLE MASTER Platinum取得者数 No.1

  • 単年度ORACLE MASTER Platinum取得者数7年連続No.1

7年連続ORACLE MASTER Platinum取得者数No.1! Oracle Certification Award 2020

[PR] コーソルのデータベース運用関連製品とサービス

コーソルでは、データベース運用を製品とサービスでご支援します。

Database Performance Analyzer (DPA)

Database Performance Analyzer (DPA)は、オンプレミスとクラウド上の多くのデータベース製品に対応したデータベース性能管理製品です。低価格であるため、非常に導入しやすいです。

自動SQLチューニング機能を持つToad

Database Performance Analyzer (DPA)で検出された問題SQLをチューニングする際に、Toad for Oracle / Toad for SQL Serverの SQL Optimizer機能を使用できます。

リモートDBAサービス

リモートDBAサービスはDB・運用の専門家がお客様のデータベースに対して 必要な時に必要な対応を行うリモート接続型運用保守サービスです。

データベース運用・保守なら常駐しないリモートDBA

時間制コンサルティングサービス

時間制コンサルティングサービスは”必要な時に” ”必要な時間だけ”契約できる 時間契約型のコンサルティングサービスです。

データベース コンサルティングなら時間制コンサルティング

プロフィール

On7tWW6m1Ul4

渡部 亮太

・Oracle ACE
・AWS Certified Solutions Architect - Associate
・ORACLE MASTER Platinum Oracle Database 11g, 12c 他多数

カテゴリー

アーカイブ