-----------------------------------
SQLServerデータベース サイズの見積もり
https://docs.microsoft.com/ja-jp/sql/relational-databases/databases/estimate-the-size-of-a-database?view=sql-server-2017
-----------------------------------
●なぜ、データベースサイズの見積もるか
・アプリケーションが必要とするパフォーマンスの実現。
・データとインデックスの格納に必要となる適切な量の物理ディスク領域の確保。
●データベースサイズ見積方法
各テーブルのサイズを個別に見積もり、それぞれの値を合計します。
テーブルのサイズは、テーブルにインデックスが含まれているかどうかにより異なり、
インデックスが含まれている場合はそのインデックスの種類によって異なります。
-----------------------------------
◆テーブルサイズ見積方法(自己流)
前提条件:新規に作成するDBと似た構成の既存DBがある。
見積方法概要:
①.既存DBのテーブルサイズを確認
→1件あたりのデータサイズを確認
②新DBのテーブルサイズを計算
①の1件当たりのデータサイズ×②の件数
③さらに、どのくらいの期間でどのくらいの件数が増えるか予測する
何年後まで予測するか?
・ハード交換目安にあわせ5年まで
・データの保管期間にあわせた年数まで など
今回は5年後まで計算
・1年分の件数は、昨年分と同じ件数で計算
・年々増加している場合は、増加率を加算
1年後
2年後
3年後
5年後
-----------------------------------
(関連知識)
★既存テーブルサイズの確認方法
-----------------------------------
--SQLで確認する方法
--<参考:テーブルごとのデータ容量を確認する方法>
--https://www.projectgroup.info/tips/SQLServer/MSSQL_00000033.html
-----------------------------------
--テーブル名を保持する変数
DECLARE @TAB_NAME varchar(50);
--ストアドからの結果を一時的に保持するテーブル変数
declare @temp table (
[Rows] decimal(18,0)
,[DataSpaceUsed] decimal(18,0)
,[IndexSpaceUsed] decimal(18,0)
)
--2回目以降の実行時はこれを有効にする
--DROP TABLE #WORK
--テーブル名付きで保持するワークテーブル
CREATE TABLE #WORK(
[TableName] varchar(50)
,[Rows] decimal(18,0)
,[DataSpaceUsed] decimal(18,0)
,[IndexSpaceUsed] decimal(18,0)
)
--テーブルの一覧を取得するカーソルを定義
DECLARE CurTabList CURSOR LOCAL FOR
SELECT name
FROM sys.tables
--カーソルオープン
OPEN CurTabList;
--最初の行データを取得
FETCH NEXT FROM CurTabList
INTO @TAB_NAME;
--データを取得できなくなるまでループ
WHILE @@FETCH_STATUS = 0
BEGIN
--一時テーブル変数をクリア
DELETE @temp;
--「sp_MStablespace」を実行してテーブル情報を取得
INSERT INTO @temp EXEC sp_MStablespace @TAB_NAME;
--テーブル名を付加してWORKへデータ追加
INSERT INTO #WORK
SELECT @TAB_NAME
,[Rows]
,[DataSpaceUsed]
,[IndexSpaceUsed]
FROM @temp
--次の行のデータを取得する
FETCH NEXT FROM CurTabList
INTO @TAB_NAME;
END
--カーソルを閉じる
CLOSE CurTabList;
DEALLOCATE CurTabList;
--データを取得
SELECT
-- *
[Rows] AS Rows
,[DataSpaceUsed] AS DataSpaceUsed_KB
,[IndexSpaceUsed] AS IndexSpaceUsed_KB
FROM #WORK
ORDER BY TableName
-----------------------------------
-----------------------------------
(基礎知識)
・インデックス(=索引)
データ検索を高速化するために、ある列の値を
あらかじめ取り出し検索しやすいようにしておいたもの。
本に例えると、索引。
インデックスがない場合、フルテーブルスキャン
(=全表検索)となる。
・クラスター化インデックス
テーブル内に1個まで。データ自体が並び替えられる。
主キーを設定した場合、暗黙でデフォルト作成される。
・非クラスター化インデックス
テーブル内い複数作成可。
主に、行識別子でデータにアクセスする。
・インデックスの構造
インデックスの構造は、クラスター化インデックス、非クラスター化インデックスともに
"Bツリー"。木をひっくり返した構造で、検索されると、ルートノードから中間ノードを経て、
最終はリーフノードに到達する。
リーフノードには、方式の違いにより、データ、行識別子、クラスターインデックスキーが
格納されている。
-----------------------------------