web-dev-qa-db-ja.com

テーブルスペースサイズの見積もり

次の手順を使用してテーブルスペースのサイズを推定しようとしています: スキーマオブジェクトのスペース推定

そして、私はいくつかのステップについて少し混乱しました。行サイズを計算するためのステップ3では、最初に列サイズを計算してから、テーブル内のすべての列サイズの合計を計算する必要があります。実際にテーブルを作成せずに列サイズ値を取得する方法を考えていましたデータ、次にvsize()を使用しますか?または、列のサイズが何であるかを誤解しています。

また、リンクのこれらの手順は、テーブルのサイズを推定するためのものですか?

2
joe

Oracle 7を使用していますか?そうでない場合は、常に最新バージョンのドキュメントを必ず使用してください。 Oracleはすでに12Cを採用しており、一部の概念は同じですが、機能の大部分が変更されています。

実際には列のサイズは取得されません。これが単なる「推定」である理由です。必要なものを把握しておく必要があります。次に、dbms_spaceパッケージをcreate_table_costプロシージャと一緒に使用して、必要なスペースを把握できます。

例えば:

3つの列(val1、val2、val3)を持つテーブルを作成する必要があり、それぞれが4バイト(abcのような3つのリテラルとvarchar2が先行するバイト)を占めることを知っています。また、このテーブルには約1000行あると推定しています。次に、デカルトグラフについて考えてみます。

row_count
^
|
|
|
|-----------> avg_row_len

次を使用してサイズを推定します。

 set serveroutputon
    DECLARE
      estimated_used_size   NUMBER;
      allocated  NUMBER;
    BEGIN
        DBMS_SPACE.create_table_cost (
        tablespace_name => 'USERS',
        avg_row_size    => 12,
        row_count       => 1000,
        pct_free        => 10,
        used_bytes      => estimated_used_size,
        alloc_bytes     => allocated);

      DBMS_OUTPUT.put_line ('the table (TS=USERS): will use =' || estimated_used_size ||' bytes  to be allocated =' ||  allocated);
end;
/

最後の質問については、既存のテーブルのサイズを見積もるには、ビューdba_segmentsをチェックします(インデックスや他のオブジェクトのサイズをクエリするためにも)。

例:

SQL> SELECT bytes/1024/1024 "Size in MB" FROM dba_segments WHERE segment_name = 'TABLE_NAME_HERE' AND segment_type = 'TABLE';
1