本連載は、企業の成長に不可欠な「データ活用」を推進していくために必要なデータ基盤の基礎を“あらためて”解説していきます。今回は、SQLのチューニングを行う上で最も重要な基礎知識を解説します。【更新版】
ユーザーによりよいサービスを提供していくために、データベースのパフォーマンスチューニングは欠かせません。これを実現していくには、最低限「データアクセスの仕組み」を理解しておく必要があります。
第2回「リレーショナルデータベースの3大構成要素とは?」で解説した通り、SQL(Structured Query Language:リレーショナルデータベースのデータを操作するための言語)でのデータアクセスは、ディスクにある表のデータをメモリにロードしてから実行されます。そのため、非効率なデータアクセスはディスクI/Oの多発を招き、パフォーマンスに影響を及ぼします。データアクセス方法の効率とデータベースのパフォーマンスは密接に関係しています。
従って、パフォーマンス問題を抱えているシステムの多くはSQLによるデータアクセス方法に問題があるといえます。これを改善するのがSQLチューニングです。
今回は、SQLチューニングを実践していくための基礎知識として、データベース内部で行われる基本的なデータアクセス方法を説解します。
SQLは、表や列の名前を指定すれば簡単にデータへアクセスできる便利な言語です。それゆえに、Oracle Databaseをはじめとするリレーショナルデータベース管理システム(RDBMS)には、そのSQLをどのように処理するか(どのようにデータへアクセスするか)を内部的に決定する機能が備わっています。その機能は「オプティマイザー」と呼ばれます。
オプティマイザーが選択するデータアクセス方法はさまざまな種類がありますが、その中でも代表的なデータアクセス方法として、「全表スキャン」と「索引スキャン」があります。
全表スキャン(フルテーブルスキャン)は、SQLで指定された表の全てのデータにアクセスして、検索条件を満たす行を1行ずつチェックする方法です。
例えば、以下のSQL文で全表スキャンが行われると、「社員表(EMP表)」の全行にアクセスして、社員名(ENAME列)が「BLAKE」である行を探します(図1)。
SELECT ENAME FROM EMP WHERE ENAME = 'BLAKE';
全表スキャンは、表を構成しているデータブロックを1回のディスクI/Oでまとめて読み込みます。少ないディスクI/Oで多くのデータにアクセスできる特徴から、データ集計やバッチ処理のように表の大部分のデータにアクセスする操作が中心となるDWH(Data WareHouse)系システムでの利用に適しています(図2)。
その一方で、前述したSQLのように、「BLAKE」さん1人だけの社員データを検索する場合、全表スキャンが行われると効率が悪くなります。EMP表に格納された全社員のデータにアクセスしなければならず、無駄なデータアクセスが発生するためです。書籍で例えるならば、何かを調べるときに全てのページを読んで探すようなものです。このため、「社員検索」などのように、表の一部のデータにアクセスする操作が中心となるOLTP(OnLine Transaction Processing)系システムには、全表スキャンは適しません。
このような場合には、目的のデータにピンポイントでアクセスできる「索引スキャン」が有効です。
Copyright © ITmedia, Inc. All Rights Reserved.