こんにちは、KiYOです。
システムエンジニア歴20年オーバー。製造現場に特化したシステム開発を主にやってます。
新しい物好きで色々なIT技術を勉強しては、仕事に使って行ってます。

今回は、Microsoft SQL Serverのデータベースファイルの配置について解説していきます。
データベースファイルの配置

データベースには、データファイルと、ログファイルの少なくとも2つのファイルがあります。
データベースを構成する物理ファイル
ファイル | 内容 | |
1 | プライマリデータファイル | データベースの起動情報が含まれています。 ユーザデータおよびオブジェクトは、このファイルまたはセカンダリデータファイルに格納できます。各データベースには1つのプライマリデータファイルがあります。プライマリデータファイルに推奨されるファイルの拡張子は「.mdf」です。 |
2 | セカンダリデータファイル | セカンダリデータファイルは省略可能です。 各ファイルを異なるディスクドライブに配置して、データを分散することができます。 推奨されるファイルの拡張子は「.ndf」です。 |
3 | トランザクションログファイル | データベースの復旧に使用されるログ情報が格納されます。 推奨されるファイル名の拡張子は「.ldf」です。 |
規定では、データファイルとトランザクションログファイルは同一のドライブおよびパス上に配置されます。
ディスクの書き込み分散でおすすめは、データファイルとトランザクションログファイルを異なる物理ディスクボリューム上に配置することをおすすめします。
論理ボリュームではダメです。物理ディスクを分けることが重要。
SQLServerのデータストレージの基本単位はページです。データベースのデータファイルに割り当てられたディスク領域には、0からnの連番がつけられたページに論理的に分割されます。
ディスクI/O操作はこのページレベルで実行されます。
- 8KBの固定帳のブロック
- 入出力の最小単位
- データはテーブルの行単位で格納される
- 実データが格納されているページ全体を「ヒープ」と呼ぶ
SQLServerデータベースには1MBあたりに128ページが存在します。例えば、同一ページ内に存在する1行と100行を取得する場合のI/O数は同じになります。
そのため、取得するデータをなるべく同じページ内に含めることで、必要なI/O数を減らすことが可能になります。
物理的に連続する8ページをまとめたもので、ページを効率的に管理するために使用されます。全てのページは、エクステントに格納されます。
データファイルとログファイルの分散配置
ログファイルとデータファイルのディスクへのアクセス仕様は大きく異なります。ログファイルのI/Oは、主にシーケンシャルな書き込み操作で、ランダムなディスクアクセスはほとんど発生しません。
逆に、データファイルのI/Oは、非同期に実行される読み取りまたは、書き込み操作でランダムなディスクアクセスが多いです。
そのため、以下がベストプラクティスになります。
- ログファイルとデータファイルを分離する
パフォーマンスと生涯復旧の観点から、分離することが重要です。
各ファイルは物理ディスクレベルで分離する必要があります。 - 同じサイズの複数のデータファイルを、可能な限り多くの物理ディスクに分散する
複数のデータファイル間で、I/Oの並列処理数を増やすことができる - 複数のログファイルを使用してもあまり意味がない
トランザクションログは常に単一ログファイルに書き込まれます。そのため、パフォーマンスの観点からは、複数のログファイルを構成しても意味がありません。
RAID概要
RAID(Redundant Array of Independent Disks)はアレイと呼ばれる複数のディスクドライブから構成されるディスクシステムです。RAIDを使用することで、高性能で信頼性が高いシステムを構築できるようになります。
RAIDはSQLServerの一部ではないですが、パフォーマンスやフォールトトレランスに影響します。
- RAID0(ストライピング)
データはブロックに分割され、アレイ内の全てのディスク間で決まった順序で分散されます。読み取り/書き込みのパフォーマンスが向上します。フォールトトレランスは準備されていません。 - RAID1(ミラーリング)
プライマリディスクに書き込まれたデータは全て、ミラーディスクに書き込まれます。
フォールトトレランスを実現し、読み取りパフォーマンスが向上しますが、逆に書き込みパフォーマンスは低下することもあります。 - RAID5(パリティ付きストライピング)
- RAID10(ストライピング付きミラー化)
Udemyというオンライン講座でもデータベースの学習はできます。 再生速度を早めてみたり、何度も見返すことができるのでおすすめです! 私も色々なデータベースをここで学習しています。
インデックスについて詳しく解説してくれて、理解しやすいと思います。
SQLServerのインデックスを理解して検索を速くする方法
その他のパフォーマンスチューニングはこちらをご覧ください。

コメント