このページの本文へ

前へ 1 2 次へ

【特別企画】データベースプラットフォームとしてのLinux(第3回)

2003年12月01日 00時47分更新

  • この記事をはてなブックマークに追加
  • 本文印刷

■SQLの基本動作

 さて、ここでSQLについてもう少し述べてみよう。SQL文の基本は検索用のSELECT文である(図6)。
 このSELECT文は2つのテーブルを結合し、その検索結果を得ている。簡単な人事テーブルで、ある組織に属する社員の名前とその組織名を表示している。Oracleのサンプルデータベースに付いてくる構造を利用している。
 from句で参照するテーブルを選択し、where句で条件を絞り込んでいる。これは集合論では、集合間の結合と部分集合の組み合わせと言えるだろう。
 SQLの記述でこの結合やwhere句による条件指定はよく使われるが、注意しなければならないのは、範囲指定と言っても基本的にはテーブルの全件検索が行われることだ。このサンプルに使われている程度の件数ならともかく、数万件のデータベースをいちいち全件検索しながら、大量のWebからのリクエストを処理することを想像したら、誰もが寒気を憶えるだろう。

RDBのテーブル構造
【図6】RDBのテーブル構造

 そこで、実際には検索条件に指定し得るものは、インデックスを作成しておくと、RDBMSのSQL実行解析エンジンはまず、インデックスを使って検索するようになるので、テーブルへのアクセス頻度は大幅に減ることになる。
 だがこれにも限界はあり、たとえば図7のような部分一致検索の指定方法で、前方一致ならインデックスを使用するが、中間一致や後方一致はインデックスというものの性質上、テーブルを全件検索することになる。このあたりはユーザーインターフェイスを工夫したり、どうしてもその種の検索を多用せざるをえない状況ならば、全文検索エンジンの導入など別の手段を考慮に入れる必要も出てくるだろう。
 また、インデックスを多用しすぎると、データのインサート時や、インデックスを定義した列のデータを更新したときなどに、余計なディスクアクセスが1回から2回発生し、追加したデータの内容によっては、インデックスの再編成プロセスの実行が必要になるケースもある。つまり挿入更新時にはレスポンス悪化をもたらすので、定義のしすぎにも注意が必要だ。

 検索以外によく使う文としては、INSERT(挿入)、UPDATE(更新)、DELETE(削除)が挙げられる。IN SERTは、新たに行を追加する文であり、UPDATEは、行の中身を変更する文である。DELETEは行の削除を行う。
 今日のたいていのデータベースは可変長のデータ形式をサポートしているので、UPDATEを行うと行の格納サイズが変わる場合がある。Oracleではそのような状態に備えて、最初からある程度の余裕を持たせた形で行を格納し、その余裕の下限値や上限値を設定できるようになっている。その余裕を超えたサイズの行が格納されると、その行の内容はデータベースファイル中の別の場所に格納されることになる。このような行の存在が多発すると検索更新時のディスクアクセス負荷が増えパフォーマンス悪化の原因になるので、なるべくこのような事象が起こらないようにするのが、データベースの物理設計の際のひとつの勘所となる。

 また、UPDATEでインデックスの張ってある列の値が更新されたり、DELETEでインデックスの列の値や、プライマリキーの値が消去されると、これらのインデックスの再作成処理が実行される場合がありレスポンスが悪化する。特にDELETE処理はコストの高い処理なので、通常運用時はDELETE文を発行しないような運用にしているところもある。このような運用では削除対象として処理対象外の行にはフラグを立てておき、通常の検索範囲などからは外したうえで、夜間バッチ処理などでこのフラグが立った行をDELETEするという処理を実行する場合がある。

 さて、SQLは、大別するとDML(データ操作言語)とDDL(データ定義言語)の2種類に分けられる。
 先ほどのSELECTのほか、INSERT文やUPDATE文など、データベース内部のデータそのものを操作するのがDMLである
 DDLは、CREATE TABLE文、CREATE VIEW文、GRANT/REVOKE文などの文からなり、RDBにおけるテーブルの作成、削除や定義変更、ビューの作成、削除、定義変更、アクセス権限の設定削除などができるようになっている。インデックスの定義や削除などもDDLの一種として実行される。
 DDL実行時には、RDBMSによっては自動的に他のトランザクションにはコミットかロールバックが発生する場合もあるので、このようなメンテ作業は比較的負荷が小さいときに実行すべきであろう。
 つまりRDBMSは、その情報の操作のみならず、基本的なメンテナンス、運用操作をSQLで行うデータベースということもできる。

また、SQLの動作のイメージがはっきりしないまま、漫然とSQL文を記述すると、パフォーマンスの悪いSQLを書くことになりがちだ。SQLの実行計画やパフォーマンスをチェックするEXPLAINという文が、OracleでもPostgreSQLでも用意されているので、それでレスポンスやインデックス使用の有無などをチェックすることが望ましい。  データベースチューニングは極論すれば、RDBMSの仕組みをうまく動かし、必要とするデータがオンメモリにあるようにして、ディスクアクセスをいかに減らすかということになる。このようなチューニングを施す際には、RDBMSの内部動作にもある程度通じていなければならず、アプリケーションの目的にもよって選択すべき手法は異なってくるので、それらを把握しないと適切な設定はできない。

*6 UML(Unified Modeling Language)
オブジェクト指向によるシステム開発で、オブジェクトの構造やその間のメッセージを表すモデルを記述するために統一された表記法。

*7 ERP(Enterprise Resource Planning)
財務会計、人事、在庫管理、物流、販売などで企業が蓄積する情報を統一的に管理し、業務活動の効率を最大限に高めるシステムとソフトウェア。

*8 ISAM(Indexed Sequential Access Method)
ディスクファイルアクセスの手法の1つ。各レコードのキーフィールドを指すインデックスを使用して、特定のレコードをダイレクトにアクセスすることができる。

前へ 1 2 次へ

カテゴリートップへ

  • 角川アスキー総合研究所
  • アスキーカード