RDBMSのインデックスの概略的なまとめ

5年前に、RDBMSのインデックスについて、個人的に簡単にまとめていましたので、そのまとめを展開します。

今回の記事では、情報処理技術者試験の出題範囲内で、要点を箇条書きしています。
実務で使うには+αの知識(主にRDBMS固有の知識)が必要になりますが、情報処理技術者試験の知識はその+αの知識を身に付ける上での土台になります。


【インデックス全般の知識】

  • インデックスは、テーブルの検索を高速化する目的で用いる。
  • インデックスは、検索条件として指定するカラムに対して設定する。
  • テーブルのレコード数が少ない場合は、インデックスの効力が落ちる。(インデックスを使わずに順番に走査した方が早い場合もある)
  • インデックスには、レコードの挿入や更新や削除が遅くなるデメリットがある。(それらの操作を行う度にインデックスの再構成が発生するため)

【インデックスの種類と特徴】

①B+木インデックス

  • RDBMSで一般的に用いられるインデックスである。(情報処理技術者試験で「インデックス」と出たら、指定がない限りこのインデックスだと思って良い)
  • 検索キー値を用いて二分検索を行うインデックスである。
  • BETWEEN句等の範囲検索で後述のビットマップインデックスより優れる。
  • ORDER BY等のソートが必要な場合に優れる。
  • NULL検索やNOT検索では効果を発揮できない。
  • 少ない件数に絞り込めるカラムに設定すると効果が高い。例えば、一意な値が格納されるカラムに設定すると、1件のみに絞ることができ、効果が高い。逆に、二値しか持たない「性別」のようなカラムに設定しても効果は低い。
  • 検索値が等しく分布している時に効果が高い。

効果が高い例

カラムの値件数
a200
b200
c200
d200
e200
f200

効果が低い例

カラムの値件数
a1200
b200
c0
d0
e0
f0

②ビットマップインデックス

  • 検索キー値が持ち得る値をビットで保持し、それをレコード毎に保持する。
  • AND/OR条件のみの検索ではB+木インデックスより効果が高い。
  • NOT検索ではB+木インデックスより効果が高い。
  • 持ち得る値が少ないカラムに設定するとB+木インデックスより効果が高い。(例えばカラム「性別」等)

③ハッシュインデックス

  • 検索キー値をハッシュ化したものをインデックスとして用いる。(ハッシュ化…特定のアルゴリズムにより不可逆の固定長の値にすること)
  • 一意な値を検索するのに向いている。
  • データ量が増えても検索にかかる時間が変わらないと言われている。(正確には、データ量が増えるとハッシュ値の衝突が増え、時間が微増する)
  • BETWEEN句等の範囲検索には適用できない。
  • ORDER BY等のソートが必要な場合には適用できない。
  • ワイルドカードを用いて検索する場合はB+木インデックスの方が良い。

繰り返しになりますが、今回のまとめは一般論であり、RDBMS固有の知識は別途必要です。
また、今回のまとめは5年前のものなので、現在のトレンドを捉えたものではありません。

例えば、私が実務を通して知った範囲で言うと、現在では「関数インデックス」と呼ばれるインデックスを備えたRDBMSが増えています。
これは、カラムを関数で計算した結果、例えばカラム1とカラム2の合計値をインデックスとして持たせることができる、というものです。
MySQLでは、バージョン8.0.13(リリース日:2018/10/22)から導入されました。
https://blogs.oracle.com/mysql-jp/post/functional-indexes-in-mysql-jp

私も、基礎を大事にしつつも、知識のアップデートを怠らないようにしていきたいと思います。

BIツール「Amazon QuickSight」の紹介

実務でBIツール「Amazon QuickSight」の導入を支援する機会がありましたので、ツールの紹介をします。

【BIツールとは】

BIとは「ビジネスインテリジェンス」の略であり、事業上の意思決定のために、情報を収集・加工し、分析し、知見を得ることを指します。

ここで言う「情報」とは、売上や費用等の自社の利益に関するデータ、及びそれを左右する競合他社や経営環境に関するデータのことを指します。
データの形式としては、CSVファイルやリレーショナルデータベース等の表形式を思い浮かべるとわかりやすいでしょう。

上記のデータに対し、集計を行い、グラフや表や図の形式に加工することで、「どの地域でどの商品の売れ行きが良いのか」「自社の製品と競合他社の製品の価格差は自社の利益にどのような影響を及ぼすのか」「猛暑の年と冷夏の年で自社製品の売上がどの程度変わるのか」といった有益な知見を得ることができます。
その知見は、「どの分野に集中的に投資すれば良いのか」「自社の製品の価格はどのように決めれば良いのか」「毎年の生産量はどのように決めれば良いのか」といった、経営上の意思決定を行う上で役に立ちます。

BIツールは、上記の活動を支援するための各種ツールのことを指します。
身近な所で言うと、表形式のデータの取り扱いと関数を用いた集計、グラフの表示をサポートする「Microsoft Excel」はBIツールとみなすことができるでしょう。

【Amazon QuickSightとは】

「Amazon QuickSight」(以下「QuickSight」)はBIツールの一種です。
BIツールには様々な種類がありますが、QuickSightは、グラフや表や図を一画面で一覧できる「ダッシュボード」を作成するツールに分類されます。

QuickSightで作成できるダッシュボードは強力なものであり、例えば以下のような機能を備えています。

  • 表示のドリルダウンとドリルアップ(表示されるデータの粒度の細分化・集約化)
  • データのフィルタリング(プルダウンやチェックボックスを用いたデータの抽出)
  • マップビジュアル(地図の上にデータの大小を視覚的に表現する機能)

QuickSightはローコードで上記の機能を備えたダッシュボードを作成することができ、アプリケーション開発の専門的な知識が無くとも少ない工数でBIを実現できます。

【Amazon QuickSightで扱うデータ】

QuickSightはダッシュボード作成を支援するツールですので、その元となるデータは自分で用意する必要があります。

QuickSightは様々な形式のデータに対応しており、例えば以下のような形式のデータに対応しています。

  • CSV形式やTSV形式等のファイル
  • 各種リレーショナルデータベース(Amazon RDS、Oracle、SQL Server、MySQL、PostgreSQL等)
  • Amazon S3(オンラインストレージ)や、S3へのSQLでのクエリをサポートするAmazon Athena

QuickSightでは、SQLの集計関数で実現できる集計機能は一通りサポートしており、集計元のデータと集計後のデータを連動させた形で表示(例えば、各店舗のデータの一覧表と、一覧表上の全店舗の平均売上高を同時に表示)させることが多いので、用意するデータは集計する前のものとし、集計はQuickSight上で行うとスムーズに実装が進みます。
例えば、以下のようなデータを用意すると良いです。

チュートリアル_ 準備完了済みの Amazon QuickSight データセットを作成する – Amazon QuickSight
 web-and-social-analytics.csv.zip

【Amazon QuickSightのデモ】

QuickSightのデモが公式に公開されています。
このデモを操作することで、QuickSightがどのようなツールなのかイメージがつくと思います。

DemoCentral

【Amazon QuickSightのチュートリアル】

QuickSightのチュートリアルが公式に公開されています。

このチュートリアルをこなすことで、QuickSightを使用した簡単なダッシュボード作成を行えるようになります。
チュートリアルで基礎を学んだ後に、高度な機能を調べたり、QuickSightを実際に使用しながら学ぶことで、より難しいダッシュボードも作成できるようになります。

Amazon QuickSight – Visualization Basics (Japanese)


今回は、実務で導入を支援したツールの紹介をしてみました。
なお、実際に導入した際は、データベース上のデータが日々更新されるようにシステムを構築し、それをQuickSightから参照することで、ダッシュボードが自動的に更新されるようにしていました。

これからも、実務で学んだことを記事にして共有したいと思います!

C#:ファイルのデータを置換する簡易ツールの作成

文字列置換はサクラエディタを使用すると楽ですが、サクラエディタを使用した場合は大量データの処理ができないという問題があります。

そこで、C#をプログラムにより置換を行うというのが有効になります。
プログラムでのファイルのストリーム読み込みであれば、高速に処理することができ、大量データにも対応することができます。
また、C#のコンパイラはWindowsOSに標準で搭載されているので、環境設定が不要なのも便利な点です。

サンプルコードは以下です。
サンプルコードでは文字列の”hoge”を”fuga”に変換しているだけですが、バイナリファイルとして読み書きしている上に変換する文字は16進コードで指定しているため、ASCII文字以外の置換にも対応可能です。
また、ロジックを書き変えれば、より複雑な条件での置換も可能になります。

また、この記事に限りませんが、ソースコードをコピペする場合は、「[」を「[」、「]」を「]」、「<」を「<」、「&」を「&」に変換するようにお願いします。

【フォルダ構成】

【ソースコード】

・execute.bat

・replace.cs

【入力ファイル】

・input.txt

【出力ファイル】

・output.txt


今回も小ネタの紹介でした。
C#のプログラムはサクラエディタのマクロよりも複雑なことができる上、Windiows OSであれば環境構築不要ですぐに使用でき、文法もJavaプログラマーであればとっつきやすいものです。
ちょっとした作業自動化で用いると便利だと思います。

C#:自ユーザーのダウンロードフォルダーのパスの取得方法

C#(正確に書くと.Net)では、以下のように、WindowsOSで定められる特殊なフォルダのパスがEnumで定義されています。
https://learn.microsoft.com/ja-jp/dotnet/api/system.environment.specialfolder?view=net-8.0&viewFallbackFrom=windowsdesktop-8.0

自ユーザーのダウンロードフォルダの直接のパスはEnumに登録されていないようです。
しかし、ユーザーのプロファイルフォルダ(C:\Users\(自ユーザー名))のパスは登録されていますので、そのパスを起点にダウンロードフォルダのパスを定義することができます。

試しに、ダウンロードフォルダ上のファイルのパスを定義し、そのファイルを読み込んで出力するサンプルコードを書きました。
具体的な使用例は以下のコードを参照してください。
(ソースコードをコピペする場合は、「[」を「[」、「]」を「]」に変換するようにお願いします。)

【サンプルコード】

・Program.cs

【用意するファイル】

・C:\Users\(自ユーザー名)\Downloads\test.txt

【実行結果】


今回はちょっとした小ネタの紹介でした。
ダウンロードしたファイルに対して加工を行うツールを作る際に便利だと思います。

n対nマッチングのロジック(C#のサンプルコード付き)

以前に、以下の記事にて、マッチング処理のロジックについて書かせていただきました。
マッチング処理のロジック – サイゼントの技術ブログ

以前の記事では1対1マッチングと1対nマッチングについて説明しました。
今回の記事では、より複雑なn対nマッチングについて補足します。

1対1マッチングは、マスタデータの1つのキー項目に対して、トランザクションデータの0~1つのレコードが対応するものでした。
1対nマッチングは、マスタデータの1つのキー項目に対して、トランザクションデータの0~複数のレコードが対応するものでした。
n対nマッチングは、マスタデータ側も1つであるとは限らず、トランザクションデータの1つのキー項目に対して、マスタデータの0~複数のレコードが対応するケースもある、というものを指します。

n対nマッチングでは、以前に参照したトランザクションデータのレコードが、再び参照される可能性があります。
ファイルに対してランダムにアクセスすることでこれを実現できますが、処理が複雑になるため、今回はファイルは順次読み込みのままで、読み込んだトランザクションデータのレコードを一時的に退避するロジックを提示します。

フローチャートと例は以下の通りとなります。
また、この記事に限りませんが、ソースコードをコピペする場合は、「[」を「[」、「]」を「]」、「>」を「>」、「<」を「<」、「&」を「&」に変換するようにお願いします。

【フローチャート】

【例】

・要件

商品名が管理されている商品マスタと、商品の販売履歴(トランザクション)をファイル形式で読み込み、商品名と販売日を別ファイルで出力したい。

・商品マスタのフォーマット

カンマ区切りの固定長ファイル。
商品コードと商品副コードでレコードを一意に特定できるようにデータをセットする。

・販売履歴のフォーマット

カンマ区切りの固定長ファイル。
商品コード・販売日でレコードを一意に特定できるようにデータをセットする。

・出力ファイルのフォーマット

・プログラムのフォルダ構成

・ソースコード(execute.bat)

・ソースコード(matching.cs)

・商品マスタのレコード(files\master.csv)

・販売履歴のレコード(files\transaction.csv)

・バッチ実行結果(標準出力)

・バッチ実行結果(files\matched.csv)


あけましておめでとうございます!
お久しぶりです。

去年は慌ただしかったので記事を書けずにいましたが、要望があり、再びブログを更新することにしました。
ブログ以外の執筆活動もあるため不定期の更新になりそうですが、折を見て更新を続けていきたいと思います。

改めまして、よろしくお願いします。