SQL入門
インデックスを作成して高速化(CREATE INDEX)

SQLの初心者向け入門解説、VBAからデータベースを扱うためのSQLを解説
公開日:2019-12-09 最終更新日:2019-12-17

インデックスを作成して高速化(CREATE INDEX)


エクセルVBAでデータベースを扱うためのSQL入門です。
前回の、他のテーブルのデータで追加/更新/削除では、UPDATEで多大な時間がかかっていました。

この時間は、テーブルのインデックスを作成することで劇的に速くできます。
次回、「インデックスを作成して高速化(CREATE INDEX)」で紹介します。
インデックスを作成することで、約5分が数秒に短縮されます。

前回このように記載しました。
今回は、このインデックスとは何かの説明と、インデックスを作成するSQLを解説します。


使用するテーブル定義は以下になります。

全テーブル定義とテーブル自動作成VBA
・テーブル:m_customer ・テーブル:m_item ・テーブル:t_sales ・テーブル自動作成

インデックスとは

インデックスとは言葉通りに索引の事です。
テーブルの件数が多くなると、目的のデータを検索するのに時間がかかってきます。
そこで索引を作成しておき、速やかに検索できるようにします。
インデックスはテーブルの検索を高速化する為に作成します。

インデックスを作成するという事は、テーブルとは別にインデックスのデータが作成されるということです。
テーブルとは別に索引データを作成するので、データ容量はその分増えてします。
そして、インデックスはテーブルのデータが追加/変更/削除される都度、当該データに関わるインデックスも追加/変更/削除されます。
結果として、テーブルへの追加/変更/削除はそれだけ遅くなります。
むやみに作成してしまうと、かえって全体のパフォーマンスを落としてしまう事にもなりかねません。
インデックスを作成するときは、このことに注意を払ったうえでインデックスの作成を検討する必要があります。
ただし、インデックスの作成自体はかなり高速に行われるので、余程大量に作成しなければ通常はそれほど問題にはなりません。
多くのデータベースでは、インデックスに B木構造を採用しています。
インデックスの構造について詳しく知りたい場合は別途検索してみてください。

そもそもテーブルには主キー(PRIMARY KEY)を設定します。
(主キー設定しないテーブルもあるにはありますが)
そして、主キーは自動的に主キーとしてのインデックスが作成されます。
これにより、主キーでの検索は高速に行われます。
しかし、他のカラムは特に指定しない限りインデックスは作成されません。
そこでインデックスを作製するカラムを個別に指定する必要があるということです。

インデックスを作成する場合、単独(1つ)のカラムでも作成できますし、複数のカラムを合わせて一つのインデックスとすることもできます。
検索することが多いカラムを調べ、そのカラムでインデックスを作成します。
したがって、どのカラムでインデックス作製したら効率が良くなるかは、そのテーブルの使い方次第になります。
カラムA、カラムB、それぞれで検索することが多い場合は、それぞれでインデックスを作成し、
カラムAとカラムBをあわせ検索することが多い場合は、カラムAとカラムBを合わせたインデックスを作成します。
カラムA、カラムB、さらにカラムAとカラムBをあわせ検索することが多い場合は、カラムAとカラムB、さらにでカラムAとカラムBを合わせたインデックスを作成します。

前回のUPDATEのSQLを速くするには
前回のSQLで時間がかかっているのは、
t_sales_dateの1件ずつに対して、WHERE条件で対応するt_salesを都度々集計しているからです。

SQLの処理方法自体を変更することはできません。
そこで、この検索を速くするには、codeとsales_dateでインデックスを作成することで解決します。

注目すべきはWHERE条件になります。
WHERE t_sales_date.code = T.code AND t_sales_date.sales_date = T.sales_date
Tはt_salesのエイリアス
ここで検索に使用されているt_salesのカラムは、codeとsales_dateです。
したがって、この2つのカラムでインデックスを作成します。
codeとsales_dateで別々にインデックスを作成しても相応に効果はありますが、
このUPDATEに限定した対策としては、この2つのカラムで作成することになります。

インデックスを作成

インデックスを作成するSQL構文
CREATE INDEX インデックス名 ON テーブル名 (カラム名 , カラム名 ・・・);

インデックス名は、このインデックスに付ける名前です。
インデックス名は他と重複出来ません。
データベース全体としてユニークでなければなりません。
()括弧内に、インデックスを作成するカラムを1つ以上指定します。

CREATE INDEX の使用例
t_salesのcodeとsales_dateでインデックスを作成します。

CREATE INDEX ix_code_date ON t_sales (code,sales_date);
このSQLを実行することでインデックスが作成されます。
インデックスが作成されることで、これを条件とした検索が高速に処理されるようになります。

このインデックスを作成すると、前回のUPDATEが劇的に速くなります。
約5分かかっていた処理が約5.5秒に短縮されました。
これほどにインデックスの効果は高いものになります。

UNIQUEインデックスを作成

作製するインデックスがユニークなキーとなる場合は、UNIQUEを指定します。
UNIQUインデックスと、主キー(PRIMARY KEY)は良く似たものになります。

UNIQUEインデックスを作成するSQL構文
CREATE UNIQU INDEX インデックス名 ON テーブル名 (カラム名 , カラム名 ・・・);

インデックス名は、このインデックスに付ける名前です。
インデックス名は他と重複出来ません。
データベース全体としてユニークでなければなりません。
()括弧内に、インデックスを作成するカラムを1つ以上指定します。

インデックスを削除

インデックスを削除するSQL構文
DROP INDEX インデックス名;

インデックス名は、このインデックス作成時に付けられた名前です。
このSQLを実行するとインデックスは完全に削除されます。

DROP INDEX の使用例
DROP INDEX ix_code_date;
ix_code_dateはインデックス作成時に付けた名前です。

インデックスを作製の最後に

他のテーブル情報を使って、INSERT/UPDATE/DELETE、そこからUPDATEを高速化するためにインデックスの作成へと進みました。

次回はトランザクション処理について解説します。
トランザクション処理の記述は極めて簡単ですが、データベースにおいてとても重要なものになります。

UPDATEとDELETEで紹介した中で説明しましたが、そこではサブクエリ(副問合せ)を使用しています。
次々回以降、サブクエリ(副問合せ)について詳しく解説していきます。
サブクエリこそ、SQLの真骨頂と言えるものです。



同じテーマ「SQL入門」の記事

データの更新(UPDATE)

・UPDATATEの構文 ・UPDATEの使用例 ・SELECTで取得→シートで編集→UPDATEで更新 ・データの更新(UPDATE)の最後に
データの削除(DELETE)
・DELETEの構文 ・DELETEの使用例 ・SELECTで取得→シートで削除行を指定→DELETEで削除 ・データの削除(DELETE)の最後に
他のテーブルのデータで追加/更新/削除
・新規テーブルを追加 ・他のテーブルを基にデータを追加 ・他のテーブルを基にデータを更新 ・他のテーブルを基にデータを削除 ・他のテーブルを基にデータを追加/更新/削除の最後に
インデックスを作成して高速化(CREATE INDEX)
トランザクション処理
・トランザクション処理とは ・ADOでのトランザクション処理 ・VBAクラスの全コード ・トランザクション処理の使用例 ・トランザクション処理の最後に
VBAクラスの全コード:トランザクション処理
SQL入門の「トランザクション処理」時点のVBAクラスの全コードです。ADOを使ったDB接続のVBAクラスの全コード クラスモジュール:clsSQLite SQLの初心者向け入門解説、VBAからデータベースを扱うためのSQLを解説。
サブクエリ(副問合せ)
・サブクエリ(副問合せ)とは ・FROM句でサブクエリを使う ・WHERE句でサブクエリを使う ・SELECTのカラムにサブクエリを使う ・UPDATAEでサブクエリを使う ・DELETEでサブクエリを使う ・サブクエリ(副問合せ)の最後に
サブクエリのネストとSQLコメント&整形
・サブクエリのネスト ・サブクエリのネストの組み方 ・SQLのコメントについて ・SQLの整形 ・サブクエリのネストとSQLコメント&整形の最後に
WITH句(共通テーブル式)
・WITH句の構文 ・WITH句の最も簡単な使用例 ・WITH句に複数のサブクエリを使用する例 ・WITH句を使った再帰SQL ・CASE演算子を使ったマトリックス作成のSQL ・WIYH句(共通テーブル式)の最後に
取得行数を限定するLIMIT句
・LIMIT句の構文 ・LIMIT句の使用例 ・LIMIT句、OFFSET句の最後に
分析関数(OVER句,WINDOW句)
・分析関数とは ・OVER句 ・WINDOW句 ・FILTER句 ・分析関数の使用例 ・分析関数の使用例:グループの最大/最小/平均を明細に出力 ・分析関数の使用例:FILTER句で条件指定 ・分析関数の使用例:明細にレコード番号(連番)を振る ・分析関数の使用例:前回販売日を取得 ・RANK関数,DENSE_RANK関数 ・LAG関数,LEAD関数 ・分析関数の最後に


新着記事NEW ・・・新着記事一覧を見る

TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.繰り返し処理(For Next)|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.変数宣言のDimとデータ型|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.セルのクリア(Clear,ClearContents)|VBA入門
8.メッセージボックス(MsgBox関数)|VBA入門
9.条件分岐(Select Case)|VBA入門
10.ブック・シートの選択(Select,Activate)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。


このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ