• ベストアンサー

データベース(エンジン)のディスクI/O

通常のアプリケーションがディスクI/Oを行う時はOSまかせで、ファイル単位のI/Oしか行わないと考えます。 しかしデータベースとなればファイル単位ではやっていられないはずで、ここら辺はどのような仕組みになっているのでしょうか? かなり低レベルのディスクI/Oを自前で(エンジンが)やるのでしょうか。

noname#182251
noname#182251

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.4

>かなり低レベルのディスクI/Oを自前で(エンジンが)やるのでしょうか。 なんとなくわかってきました。 fuuten_no_nekoさんの低レベルI/Oといっているところが。 通常は低レベルIOというと、ディスクのセクタ単位のリード、ライトをさします。なので、fuuten_no_nekoさんが思っている低レベルIOは、プログラマーなどから見ればぜんぜん低レベルIOではありません。 本来の意味の低レベルI/Oを直接DBエンジンが行うという例が、Oracleですとrawデバイスになります。 >しかしこれ単位ではDBのI/Oはやっていられないだろう、というのが元質問です。 OSのファイルシステムを介す時点でI/Oはファイル単位です。ファイル単位でオープンしてクローズします。 ただし、 >その中で更新の必要な箇所だけを随時ディスクに書いていく(フラッシュする)ようになっています。 なので、ファイルのどこに書き込むか?というレベルまでをDBエンジンは行っています。通常のファイルアクセスです。 ただし、もちろん効率化は行われてますよ。 たとえば、あるレコードを更新したら、データ量が増えたときなんてのは、そこに無理矢理データを挿入するのではなくDBのファイルの後ろにくっつけます。元のレコードにはくっつけたデータの位置だけを書きこみます。 こうすることで、書き込むデータ量を減らせます。 もし実際にファイルにデータを挿入しるとなると、書き込み位置より後ろのデータをすべてずらすようなIOを行うことになり非常に非効率となります。 同様に、レコードの削除も通常は削除フラグを立てるだけです。

noname#182251
質問者

お礼

繰り返しお付き合い頂き有り難うございます。

その他の回答 (3)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

>しかしDBはほとんどリアルタイムで書き込みを行います。複数ユーザーの間でのデータ整合性を保つために。 複数ユーザーの間でというよりは、データベースとしての整合性ですね。整合性が取れないデータベースはDBじゃないですから。 複数のユーザというか複数セッションからの整合性はロックという考え方になります。 >で、このときファイル単位ではやっていられないと。 もしかして、勘違いされているのはデータ1つずつがばらばらのファイルという感覚なんでしょうか? 実際のDBのファイルでは、大きなひとつまたは複数のファイルの中で、どこにどんなデータを書くというのはあらかじめ決められています。その中で更新の必要な箇所だけを随時ディスクに書いていく(フラッシュする)ようになっています。これはOSの機能ですよ。 なので、 >通常のアプリケーション(例えばワード)では終了時または >ユーザーが指定した時以外(自動バックアップは除く)ディスクI/Oを行いません。 こんなことは行いません。DBではリアルタイムに行われます。 特に、WordやExcelのファイルの保存というのは、新たにファイルを作り直しているようなものです。保存中に一旦一時ファイルが作成されていますよね。 G単位にもなるDBのファイルをこんなやり方で保存してたらやってられません。

noname#182251
質問者

補足

益々噛み合わなくなっているようです。 ファイル http://yougo.ascii24.com/gh/73/007354.html 「一般的に、記録ディスクに保存されたデータやプログラムの個々のまとまりを「ファイル」という。ファイル名のあとに「.txt」「.exe」「.xls」などといった「拡張子」を付けることでファイルの種類が見分けられる。」 ということで例えばアクセスでいえば xxx.mdb しかしこれ単位ではDBのI/Oはやっていられないだろう、というのが元質問です。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

>しかしデータベースとなればファイル単位ではやっていられないはずで、ここら辺はどのような仕組みになっているのでしょうか? 通常は巨大なファイル単位ですけど。 なぜやっていられないとお考えなのでしょうか? ただ、そのファイルの内部でDBエンジンがどのように内部的にファイルを使用しているかはディスクI/Oとは別問題です。 ただし、確かにディスクI/Oまで制御するものも存在します。Oracleはrawデバイスを使用して構築可能です。これはディスクI/Oまで制御して高速化を図っていますが、逆にOSによるファイル保護の恩恵が受けられないため信頼性が落ちます。

noname#182251
質問者

補足

どうも議論が噛み合わないようで(^^; 認識に間違いがあればご指摘下さい。 通常のアプリケーション(例えばワード)では終了時またはユーザーが指定した時以外(自動バックアップは除く)ディスクI/Oを行いません。しかしDBはほとんどリアルタイムで書き込みを行います。複数ユーザーの間でのデータ整合性を保つために。 で、このときファイル単位ではやっていられないと。

回答No.1

ファイルシステムを介さないものがあったと 記憶しています。 例えば、UNIXのディスクは/dev/rsd?(BSD系)で直接 アクセスできますが、これをファイルシステムとして マウントせずにデータベースのストレージとして使っ たりということです。 したがって、自前でやることになりますが、それでも OSが介在するので、ヘッドをどこに動かすとかでは なく、ソフト的にはバイト単位でアクセスできる大 きなファイルという感じに近いでしょう。 Windows系は知りません。どなたかフォローを。

noname#182251
質問者

お礼

早速のご回答有り難うございます。 想像していたことが的外れではなかったと思っています。 Windows系も基本は同じことかもしれませんが、さらなるレスを期待しています。→皆様へ

noname#182251
質問者

補足

「低レベルのディスクI/O」がヘッドの移動などを意味するとすれば的外れでした(^^; その辺りは曖昧に考えていました。

関連するQ&A

  • WindosのDisk I/Oのデータをグラフ化したい

    Windowsから5分間隔でDisk I/Oに関する情報をデータを採取し、 グラフ化を行いたいと思っております。 Disk I/O情報をグラフ化するにあたって、そこに指定するデータ値の値がわかりません。 (CPUであれば、%単位でグラフ化、メモリであればM単位でグラフ化など) Windows標準であるパフォーマンスログから以下のデータを設定しています。 PhysicalDisk\DiskReadBytes/sec PhysicalDisk\DiskWriteBytes/sec 上記2項目より採取したデータをグラフ化できますでしょうか? ちなみに採取して取ったデータは以下の様なデータ値で取れました。 ===================== PhysicalDisk\DiskReadBytes/sec 0:00 15173.15951 0:05 882,9013072 0:10 0 0:15 15205.01857 0:20 851.044008 PhysicalDisk\DiskWriteBytes/sec 0:00 21380.20598 0:05 27048.52349 0:10 19770.84513 0:15 23598.59576 0:20 21654.97407 ===================== どうか、ご指摘お願いします。

  • I/Oアクセス

    windows9x系はIOポートに直接アクセスできるが NT系は直接アクセスできない。と聞きました そしてwindows9xのことをしらべてみて、腑に落ちないことがありました。 windows9x系はi386をつかっていたので特権レベルというのがあったはずです。 だからI/Oアクセスなどシステムに重大な影響を与えることは特権レベルによって制限して、 安全性が保たれてたのではないのでしょうか? 色々なサイトをみてたら9X系はハードに直接アクセスできるとあったり、 禁止されてるとあったり、どっちなのでしょうか? どうぞよろしくおねがいします。

  • CGIで、ファイルI/Oをしたい!

    インターネットプログラミングにおいて、以下のことを教えてください。 Webサーバ:WinNT4.0 IIS CGI :VCで作成(Cです) HTMLのサブミットより、EXEをコールし、そのEXEの中でDLLをコールして 処理を行っているのですが、DLLの中でファイルOPENを行ったところ、アプリケーションエラーが出てしまいます。 このような、EXEからDLLコール・DLL内でファイルのI/Oなんてことはしては いけないのでしょうか? このやり方が、おかしいのであれば正しいやり方を教えて頂ければ助かります。

    • 締切済み
    • CGI
  • EInOutError 0010CAE6 I/Oエラー

    フリーソフトの『しばやん日記』というものを使っています。 1週間前くらいまで普通に使えていたのですが、急に使えなくなりました。 開こうとすると、『問題が発生したため、しばやん日記.exe を終了します。 ご不便をおかけして申し訳ありません。』となり、 別のウィンドウで、『アプリケーションエラー EInOutError 0010CAE6 I/Oエラー』と表示されます。 ソフト制作者のしばやんさんにもメールで問い合わせたのですが、「パソコン側のエラーだと思います」とのことでした。 『Date2』というファイルが残っているので、今までの日記のデータは消えていないはずなんです。 解決方法を教えてください。 お願いします。

  • I/Oデバイスエラー

    パソコンのデータをバックアップする為、Memorex製のDVD-R25枚セットを購入しました。 さっそく書き込もうとしたところ、「I/Oデバイスエラーが発生したため、要求を実行出来ませんでした」または「ディスクを挿入してください」といったメッセージが表示され、25枚とも全て認識しません。 TDK製DVD-R、PRINCO製DVD-Rでも試してみたのですが、それらは通常通り認識するみたいです。 相性などの問題でしょうか…?

  • フロッピーディスクドライブの I/Oデバイスエラー

    友人から、Word2003で作ったファイルをフロッピー(2HD)でもらいました。 フロッピーディスクドライブをUSBでつないで、開こうとしましたら、 「A:\アクセスできません。I/Oデバイスエラーが発生して要求を実行できません」というメッセージが出ます。 どのようにしたら解決できるでしょうか。 パソコンは Windows7。Word2003が入っています。 フロッピーデスクドライブのプロパティを見ますと、NEC USB UF00X Device とあり、「このデバイスは正常に作動しています」と表示されています。

  • I/O DATA HGPG-SU160の修理について

    2週間前にI/O DATAのHDPG-SU160(以下「HDD」)を購入しました。 I/O DATAからのメルマガでサポートソフトとファームウェアのバージョンが 更新されたとのことで、早速アップデートファイルをダウンロードして 手順に沿って実行し、更新の対象であるとのメッセージが出たため進めたところ、 「更新に失敗しました」のようなメッセージが出ました。 そのため、一度パソコンとともに再起動をかけたところ、HDDは作動しているのに 「POWER/ACCESS」ランプが点灯しなくなってしまいました。 また、マイコンピュータから見てみると、HDDは「ローカルディスク」として 認識され中も見ることができますが、サポートソフトが入っている「仮想CD領域」が 認識されなくなってしまいました。HDDのディスクモードスイッチも確認しましたが ノーマルモードになっています。 またPOWER/ACCESSランプも通常は緑が点灯するはずが アイドル中は何も点灯せず、アクセス時は赤のランプが点灯するようになってしまいました。 購入したばかりで特に重要なデータもなかったので、一度出荷時状態に戻してみましたが 改善されませんでした。 自分では修復不可能と思い修理に出そうかと思うのですが、 このような事象の場合、無料保証の対象になるのでしょうか? 長くなってしまって申し訳ありませんが、よろしくお願いします。

  • I/O デバイスエラー

    マイクロSDカードをPCにセットしてPC内に保存してある音楽ファイルを転送させると 【I/O デバイスエラー】と出て転送出来ません。検索で調べてみても原因がわかりません。 この場合どう対処すればいいんでしょうか? 現状としましては、マイクロSDをアダプターに入れてPCにセットします。アダプターのロックは入れてません。 リムーバブルディスクがマイコンピュータ内に現れ8個のフォルダが存在します。 その中の一つに音楽というフォルダがあるのでそこにPC内に保存してあるWMA形式の 音楽ファイルを送ってます。送り方や送るファイルが間違ってるのでしょうか? この状態で考えられる原因や対処法わかりますか?

  • Oracle9i データベースの作成方法

    Oracle9iを使っていますが、もう1つデータベースを追加したいと思っています。 (テーブルスペースやユーザは、DB作成後に作成します) Database Configuration Assistantを使いたいのですが、方法が良く分かりません。 (1)データベース:テンプレート ここでは[New Database]を選択すれば良いのでしょうか? (2)データベース識別情報 グローバルデータベース名とは、Oracle9iをインストールした時に設定したものを入力するのでしょうか? グローバルデータベース名を入力すると、SIDにも同じものが同時に入力されますが、ということは新しいデータベースに対する[SID]と同じものを入力して良いのでしょうか? (3)データベース:オプション Webでオプションのチェックは全てはずしてOKという記述を見たのですが、チェックをはずそうとすると[このデータベースの関連した表領域"xxxx"があります、この表領域も削除しますか?]というような注意が出されるオプションもあるのですが、全て削除として良いのでしょうか? (4)データベース接続オプション 通常(特に大規模なシステムとかでない場合)は専用サーバーモードで良いのでしょうか? (5)初期化パラメータ メモリはカスタムで設定するのでしょうか? その際、Javaを使わないのが確実だったりすると、[Javaプール]は[0]にしても大丈夫でしょうか? その他は初期値で問題ないでしょうか? (6)データベース記憶域 テーブルスペースは、何だか色々あるのですがそのままで良いのでしょうか? またデータファイルというのは、サイズも大きくてあんなにたくさんあるものなんでしょうか? 今あるデータベースは、インストール時に作ったものだったので、こんな細かい?設定などした記憶もなく、方法が分かりません・・・ よろしくお願い致します。

  • DISK I/Oを行っているプロセスの確認

    DISK I/Oを行っているプロセスの確認 社用のノートPCについて質問です。 先日社の要件でoutlook cxchange serverが変更になるということでクライアントもoutlook 2003 から outlook 2007へのアップグレードをしなさい、というのがありました。 実施しなければならないことなので実施したところ、PCの起動がとてつもなく遅くなってしまいました。 以前は3分もあれば立ち上がったところ、現在は20分以上かかることもあります。 # ここでの立ち上がりとはHDDアクセスランプが点灯から点滅レベルに落ち着くこととします いったい何がそんなにガリガリやっているのか。 これでは10分前に電源を入れても業務開始に間に合いません。 タスクマネージャーで確認しても特にCPUを食っているわけでもない。 PF使用量も物理メモリ内に収まっているのでswapが大量に発生しているようにも見えないし。 ということで、調査したいので、ディスクにアクセスしているプロセスを調査できるようなフリーのツールとかを教えて頂けないでしょうか。 たぶん、OUTLOOK.EXEだと思うのですが。 宜しくお願い致します OS 名: Microsoft Windows XP Professional OS バージョン: 5.1.2600 Service Pack 3 ビルド 2600 システム製造元: LENOVO システム モデル: 7658A2I プロセッサ: 1 プロセッサインストール済みです。 [01]: x86 Family 6 Model 15 Stepping 10 GenuineIntel ~2194 Mhz 物理メモリの合計: 998 MB 利用できる物理メモリ: 120 MB 仮想メモリ: 最大サイズ: 2,048 MB 仮想メモリ: 利用可能: 1,999 MB 仮想メモリ: 使用中: 49 MB