Почему размер моей таблицы почти в 10 раз больше, чем ожидалось от avg_row_len? - PullRequest
5 голосов
/ 02 марта 2012

В моей базе данных Oracle у меня есть таблица размером 3,44 ГБ. Это 1784486 строк и 450146, что соответствует размеру блока 8 кБ и в среднем 4 строки на блок, или 2 кБ на строку. Но AVG_ROW_LEN составляет всего 369 байт. Что вызывает неуверенность?

Подробнее:

PCT_FREE только 10, так что не стоит за это отвечать. Сжатие в настоящее время отключено. Расположение таблицы (имена столбцов обобщены)

KEY            NUMBER(38)           NOT NULL,
DATE1          DATE                 NOT NULL,
DATE2          DATE                 NOT NULL,
POINT          NUMBER(4)            NOT NULL,
NAME           VARCHAR2(200 BYTE)   NOT NULL,
BLOB_SIZE      NUMBER(38)           NOT NULL,
BLOB_TYPE      VARCHAR2(8 BYTE)     NOT NULL,
BLOB_FILTERS   VARCHAR2(64 BYTE)    NOT NULL,
BLOB_DATA      BLOB                 NOT NULL,
PRECOMPUTED    RAW(2000)    -- currently no more than ~200 bytes
                            -- (15 doubles, plus some headers)

1 Ответ

4 голосов
/ 02 марта 2012

OK.Давайте начнем с выяснения, откуда TOAD получает числа, на которые вы смотрите

Что

SELECT sum(bytes)/1024/1024/1024 size_in_gb,
       sum(blocks) size_in_blocks
  FROM dba_segments
 WHERE owner = <<owner of table>>
   AND segment_name = <<name of table>>

возвращает для размера таблицы?

Что означает

SELECT num_rows, blocks, empty_blocks, avg_row_len, last_analyzed
  FROM all_tables
 WHERE owner = <<owner of table>>
   AND table_name = <<name of table>>

возвращает статистику в таблице?

Что

SELECT COUNT(*)
  FROM <<owner of table>>.<<name of table>>

возвращает для фактического количества строк в таблице?

Что

DECLARE
  l_unformatted_blocks number;
  l_unformatted_bytes number;
  l_fs1_blocks number;
  l_fs1_bytes number;
  l_fs2_blocks number;
  l_fs2_bytes number;
  l_fs3_blocks number;
  l_fs3_bytes number;
  l_fs4_blocks number;
  l_fs4_bytes number;
  l_full_blocks number;
  l_full_bytes number;
BEGIN
  dbms_space.space_usage (<<table owner>>, <<table name>>, 'TABLE',
                          l_unformatted_blocks, l_unformatted_bytes,
                          l_fs1_blocks, l_fs1_bytes, l_fs2_blocks, l_fs2_bytes,
                          l_fs3_blocks, l_fs3_bytes, l_fs4_blocks, l_fs4_bytes,
                          l_full_blocks, l_full_bytes);
  dbms_output.put_line('Unformatted Blocks = '||l_unformatted_blocks);
  dbms_output.put_line('FS1 Blocks = '||l_fs1_blocks);
  dbms_output.put_line('FS2 Blocks = '||l_fs2_blocks);
  dbms_output.put_line('FS3 Blocks = '||l_fs3_blocks);
  dbms_output.put_line('FS4 Blocks = '||l_fs4_blocks);
  dbms_output.put_line('Full Blocks = '||l_full_blocks);
END;

показывает, как используются блоки в таблице?

Были ли строки обновлены после 14 января в 14:02:29?В частности, возможно ли, что было вставлено несколько строк, которые были относительно небольшими, но затем были обновлены, чтобы иметь гораздо больший размер?Изменится ли что-нибудь, если вы повторно соберете статистику для таблицы

BEGIN
  dbms_stats.gather_table_stats( ownname          => <<owner of table>>,
                                 tabname          => <<name of table>>,
                                 estimate_percent => null,
                                 granularity      => 'ALL' );
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...