Oracle Linux Server リリース 6.3 で postgresql 9.2.1 を使用しています。
テーブルとインデックスの予想されるストレージ サイズの取得に取り組んでいます。
このサイトからのいくつかのアドバイスのおかげで、私は以下のような表の数式を作成しました...
-- TABLEの場合...
postgres=# \d test
Table "public.test"
Column | Type | Modifiers
---------------+-----------------------+-----------
c1 | integer | not null
c2 | character varying(20) | not null
c3 | character varying(8) | not null
c4 | character varying(6) | not null
c5 | character varying(15) |
c6 | character varying(20) |
c7 | character varying(20) |
c8 | character varying(20) |
Indexes:
"idx_test" PRIMARY KEY, btree (c1, c3, c4, c5)
Tablespace: "test"
postgres=# insert into test values(1,
'11111111111111111111', -- 20(exactly same with max length of each column)
'11111111', -- 8
'111111', -- 6
'111111111111111', -- 15
'11111111111111111111', -- 20
'11111111111111111111', -- 20
'11111111111111111111');-- 20
INSERT 0 1
postgres=# select * from pgstattuple('test');
table_len | tuple_count | tuple_len | tuple_percent | dead_tuple_count | dead_tuple_len | dead_tuple_percent | free_space | free_percent
-----------+-------------+-----------+---------------+------------------+----------------+--------------------+------------+--------------
8192 | 1 | 81 | 0.99 | 0 | 0 | 0 | 8072 | 98.54
postgres=# insert into test values(2,
'11111111111111111111', -- 20(exactly same with max length of each column)
'11111111', -- 8
'111111', -- 6
'111111111111111', -- 15
'11111111111111111111', -- 20
'11111111111111111111', -- 20
'11111111111111111111');-- 20
INSERT 0 1
postgres=# select * from pgstattuple('test');
table_len | tuple_count | tuple_len | tuple_percent | dead_tuple_count | dead_tuple_len | dead_tuple_percent | free_space | free_percent
-----------+-------------+-----------+---------------+------------------+----------------+--------------------+------------+--------------
8192 | 2 | 162 | 1.98 | 0 | 0 | 0 | 7980 | 97.41
したがって、各ページには 88(X) 個のタプルを保持できることがわかりました。
- 実際のストレージのタプル サイズ: 8072(1 回目の挿入後の free_space)-7980(2 回目の挿入後の free_space) = 92
- ページのデフォルト = 8192 - 8072 (最初の挿入後の free_space) - 92 (タプル サイズ) = 28
- 9182 - 28 = 92 * X(各ページのタプルの最大数)
インデックスの場合...
postgres=# \d test_pkey
Index "public.idx_test"
Column | Type | Definition
---------------+-----------------------+---------------
c1 | integer | c1
c2 | character varying(20) | c2
c3 | character varying(8) | c3
c4 | character varying(6) | c4
primary key, btree, for table "public.test"
postgres=# truncate table test;
postgres=# vacuum;
postgres=# analyze;
postgres=# insert into test values(1,
'11111111111111111111', -- 20(exactly same with max length of each column)
'11111111', -- 8
'111111', -- 6
'111111111111111', -- 15
'11111111111111111111', -- 20
'11111111111111111111', -- 20
'11111111111111111111');-- 20
INSERT 0 1
postgres=# select * from pgstattuple('idx_test');
table_len | tuple_count | tuple_len | tuple_percent | dead_tuple_count | dead_tuple_len | dead_tuple_percent | free_space | free_percent
-----------+-------------+-----------+---------------+------------------+----------------+--------------------+------------+--------------
16384 | 1 | 56 | 0.34 | 0 | 0 | 0 | 8088 | 49.37
(1 row)
postgres=# select * from pgstatindex('idx_test');
version | tree_level | index_size | root_block_no | internal_pages | leaf_pages | empty_pages | deleted_pages | avg_leaf_density | leaf_fragmentation
---------+------------+------------+---------------+----------------+------------+-------------+---------------+------------------+--------------------
2 | 0 | 8192 | 1 | 0 | 1 | 0 | 0 | 0.79 | 0
(1 row)
postgres=# insert into test values(1,
'11111111111111111111', -- 20(exactly same with max length of each column)
'11111111', -- 8
'111111', -- 6
'111111111111111', -- 15
'11111111111111111111', -- 20
'11111111111111111111', -- 20
'11111111111111111111');-- 20
INSERT 0 1
postgres=# select * from pgstattuple('idx_test');
table_len | tuple_count | tuple_len | tuple_percent | dead_tuple_count | dead_tuple_len | dead_tuple_percent | free_space | free_percent
-----------+-------------+-----------+---------------+------------------+----------------+--------------------+------------+--------------
16384 | 2 | 112 | 0.68 | 0 | 0 | 0 | 8028 | 49
(1 row)
postgres=# select * from pgstatindex('idx_test');
version | tree_level | index_size | root_block_no | internal_pages | leaf_pages | empty_pages | deleted_pages | avg_leaf_density | leaf_fragmentation
---------+------------+------------+---------------+----------------+------------+-------------+---------------+------------------+--------------------
2 | 0 | 8192 | 1 | 0 | 1 | 0 | 0 | 1.52 | 0
(1 row)
繰り返しますが、各ページには 135(Y) 個のタプルを保持できることがわかりました。
- 実際のストレージのタプル サイズ: 8088(1 回目の挿入後の free_space)-8028(2 回目の挿入後の free_space) = 60
- ページのデフォルト = 8192 - 8088 (最初の挿入後の free_space) - 60 (タプル サイズ) = 44
- 8192 - 44 = 60 * Y (各ページのタプルの最大数)
テーブルに1350行を挿入すると....これが得られました...
postgres=# select * from pgstattuple('test');
table_len | tuple_count | tuple_len | tuple_percent | dead_tuple_count | dead_tuple_len | dead_tuple_percent | free_space | free_percent
-----------+-------------+-----------+---------------+------------------+----------------+--------------------+------------+--------------
131072 | 1350 | 109350 | 83.43 | 0 | 0 | 0 | 6424 | 4.9
(1 row)
postgres=# select * from pgstattuple('idx_test');
table_len | tuple_count | tuple_len | tuple_percent | dead_tuple_count | dead_tuple_len | dead_tuple_percent | free_space | free_percent
-----------+-------------+-----------+---------------+------------------+----------------+--------------------+------------+--------------
90112 | 1350 | 54000 | 59.93 | 0 | 0 | 0 | 13580 | 15.07
(1 row)
postgres=# select * from pgstatindex('idx_test');
version | tree_level | index_size | root_block_no | internal_pages | leaf_pages | empty_pages | deleted_pages | avg_leaf_density | leaf_fragmentation
---------+------------+------------+---------------+----------------+------------+-------------+---------------+------------------+--------------------
2 | 1 | 81920 | 3 | 0 | 9 | 0 | 0 | 81.49 | 0
(1 row)
テーブルのファイルサイズ?
1350(行数) / 88(X) = 15.34 --> これは 16 ページが必要であることを意味し、ファイル サイズは 16*8192 = 131072 になります。
ただ、インデックスのサイズが違う…
1350(行数) / 135(Y) = 10 正確に... 10*8192 のファイル サイズが必要ですが、90112 です。
さらに1行を挿入します。それに加えて、index_sizeを拡張する必要があります(私が正しい場合)ので、試しましたが変更はありませんでした。
postgres=# insert into test values(27108,'sanjuk1052','20121022','233338','172,20,30,177','win7','IE','9,0');
INSERT 0 1
postgres=# select * from pgstattuple('test');
table_len | tuple_count | tuple_len | tuple_percent | dead_tuple_count | dead_tuple_len | dead_tuple_percent | free_space | free_percent
-----------+-------------+-----------+---------------+------------------+----------------+--------------------+------------+--------------
131072 | 1351 | 109431 | 83.49 | 0 | 0 | 0 | 6332 | 4.83
(1 row)
postgres=# select * from pgstattuple('idx_test');
table_len | tuple_count | tuple_len | tuple_percent | dead_tuple_count | dead_tuple_len | dead_tuple_percent | free_space | free_percent
-----------+-------------+-----------+---------------+------------------+----------------+--------------------+------------+--------------
90112 | 1351 | 54040 | 59.97 | 0 | 0 | 0 | 13536 | 15.02
(1 row)
postgres=# select * from pgstatindex('idx_test');
version | tree_level | index_size | root_block_no | internal_pages | leaf_pages | empty_pages | deleted_pages | avg_leaf_density | leaf_fragmentation
---------+------------+------------+---------------+----------------+------------+-------------+---------------+------------------+--------------------
2 | 1 | 81920 | 3 | 0 | 9 | 0 | 0 | 81.55 | 0
(1 row)
この種のアプローチが合理的であるかどうかさえわかりませんが、完璧ではありませんが、仕事をしなければなりません...
特にTOASTによって解決された追加のファイルを含む予想されるインデックスサイズを取得するには、独自の式が必要です...
アドバイスをいただければ幸いです。