ホーム » 2012 » 12月 » 14

日別アーカイブ: 2012年12月14日

2012年12月
« 11月   1月 »
 1
2345678
9101112131415
16171819202122
23242526272829
3031  

最近の投稿(電子情報)

アーカイブ

カテゴリー

データベースの設計と実際の設計

データベースの設計は、トップダウン法・ボトムアップ法などを交えながら、 部分従属をとりのぞいた第2正規形、推移従属をとりのぞいた第3正規形にして、 不整合の発生しないデータベースを設計する。

ただし、データベースを運用する場合は、単なる設計だけではなく、 どのように使われるのかを分析する必要がある。

  • 例えば、トランザクションの発生する時期や時間がいつ発生するのか?
  • トランザクションの処理がどの程度の時間で終えなければいけないのか?
  • データベースの属性に対して、型以外にも間違った値が保存しないための 制約はどういったものか?
  • 実際にデータベースがどの程度の容量を必要とするのか?

しかし実際には、複数のテーブルを対応づける SELECT * FROM A,B … と いった結合(直積)をとる処理が多発すると、処理速度の低下が目立つように なる場合がある。この場合は、データの状況によっては、多少の不整合の 対応が面倒になるかもしれないが、あえて従属性を残す場合もある。

一方、データベースは並行処理が行われる際に、ロックなどが必要となる。 この際に、レコード単位のロックが行われるデータで、 一部の属性に書き込みが集中し、一方で変化の少なくかつ利用頻度の高い 属性部分が存在すると、処理性能の低下が懸念される。 この場合には、あえてデータベースを分割し、ロックによる性能低下を 分散する場合もある。

PCTFREEとPCTUSED

データベースの使用する容量については、PCTFREE,PCTUSEDという パラメータにも関連する。

データが格納されるページ(B木のノードと一般的に同じ) の中で、テーブルの中にVARCHAR型のような、不定長のデータが含まれる場合、 1レコードのデータが大きくなった場合、本来ならばそれに合わせて後続データの 移動を伴う。これらの移動は、データ処理の効率を下げるため、 1レコード間に ''PCTFREE''で示す隙間をあらかじめ空けておく。 こうすれば、多少のレコードのデータが変化しても、データの移動は行わなくて済む。

一方、ページ内のデータの削除などが発生した場合、ノードの再構成を頻繁に 行うのを避けるため、PCTUSEDに示す値を下回らない間は、ノードの再構成を 実行しない。この値を下回った場合には、ノードへのデータの追加が行われる。

このPCTFREE,PCTUSEDは、CREATE TABLE命令といっしょに、比率を自分で設定しても良い。特に、レコードが固定長であれば、PCTFREEは不要であるし、 データの追加削除の頻度が低い場合、PCTUSEDの値は高めに設定すれば、 データベース全体の容量のなかの(処理効率を上げるための)記憶領域の無駄を 減らすこともできる。

データベースの排他処理

データベースでは、前にも述べたように、ACIDの特性を満たすために、 排他制御(ロック)が必要となる。ロック処理も、テーブルの属性単位・ テーブルのレコード単位・テーブル全体・データベース全体といったように、 様々なロックがとられる。これらのロックの粒度は、規模が大きくなるほど 処理待ちとなるトランザクションが多発し性能が低下することになる。

データベースのシステムでは、これらのロックはうまく制御され、 ロックの影響が少なくなるような工夫がとられる。

ロック処理には、 データの読み出し操作による共有ロック/Readロック (読み出し処理同士は同時に利用してもOK)と、 書き込み操作を伴う占有ロック/Writeロック (書き込みを伴うために、他の処理はすべてNG)がある。

複数のロックがかかる場合の対応は、以下のようなテーブルに沿って 行われる。

アンロックを待たない〇 ロック前の状態
R W
今からかける
ロック
R ×
W × ×