0

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によって解決された追加のファイルを含む予想されるインデックスサイズを取得するには、独自の式が必要です...

アドバイスをいただければ幸いです。

4

1 に答える 1

0

ここでの実際の問題の 1 つは、varchar が一定量のスペースを使用しないことです。これにより、時間の経過とともにページの見積もりがずれてしまう可能性があります (見積もりは基本的に最大値であり、それ以下になる場合もあります)。あなたのテーブル構造では、何もトーストされることはないと思います。

可変長フィールドがあるため、これはインデックスにも影響します。したがって、見積もりは正確な金額ではなく、最大のものであると予想できます。実際のサイズは、スキーマと行数だけでなく、実際のデータによって異なります。

于 2013-04-15T15:21:04.933 に答える