Как рассчитать размер таблиц в Oracle

Похоже, вы пытаетесь ответить на коллекцию. Для этого вам нужно настроить сериализатор (или получить данные в виде массива).

Посмотрите на страницы этого документа: http://symfony.com/doc/current/components/http_foundation/introduction.html#creating-a-json-response

и

http://symfony.com/doc/current/cookbook/serializer.html .

121
задан e-sushi 2 December 2013 в 12:35
поделиться

6 ответов

Зависит, что Вы подразумеваете "под размером таблицы". Таблица не касается определенного файла в файловой системе. Таблица будет находиться на табличной области (возможно несколько табличных областей, если она будет разделена, и возможно несколько табличных областей, если Вы также хотите принять во внимание индексы на таблице). Табличная область будет часто иметь несколько таблиц в ней и может быть распространена через несколько файлов.

, Если Вы оцениваете, в каком количестве пространства Вы будете нуждаться для будущего роста таблицы, затем avg_row_len умноженный на количество строк в таблице (или количество строк Вы ожидаете в таблице) будет хорошее руководство. Но Oracle оставит некоторое пространство свободным на каждом блоке, частично чтобы позволить, чтобы строки 'выросли', если они будут обновлены, частично потому что не может быть возможно соответствовать другой всей строке на том блоке (например, 8K блок только соответствовал бы 2 строкам 3K, хотя это будет экстремальным примером, поскольку 3K намного больше, чем большинство размеров строки). Таким образом, БЛОКИ (в USER_TABLES) могли бы быть лучшим руководством.

, Но если бы у Вас было 200 000 строк в таблице, удалил половину из них, затем таблица все еще 'владела' бы тем же количеством блоков. Это не выпускает их для других таблиц для использования. Кроме того, блоки не добавляются к таблице индивидуально, но в группах, названных 'степенью'. Таким образом, там обычно будут EMPTY_BLOCKS (также в USER_TABLES) в таблице.

1
ответ дан Gary Myers 2 December 2013 в 12:35
поделиться

Вы могли бы интересоваться этим запросом. Это говорит Вам, сколько места выделено для каждой таблицы, принимающей во внимание индексы и любые СВЕЧИ на таблице. Часто Вам интересно знать, "Сколько пробелов таблица Purchase Order берет, включая любые индексы", а не просто саму таблицу. Можно всегда копаться в деталях. Обратите внимание, что это требует доступа к представлениям DBA_*.

COLUMN TABLE_NAME FORMAT A32
COLUMN OBJECT_NAME FORMAT A32
COLUMN OWNER FORMAT A10

SELECT
   owner, 
   table_name, 
   TRUNC(sum(bytes)/1024/1024) Meg,
   ROUND( ratio_to_report( sum(bytes) ) over () * 100) Percent
FROM
(SELECT segment_name table_name, owner, bytes
 FROM dba_segments
 WHERE segment_type IN ('TABLE', 'TABLE PARTITION', 'TABLE SUBPARTITION')
 UNION ALL
 SELECT i.table_name, i.owner, s.bytes
 FROM dba_indexes i, dba_segments s
 WHERE s.segment_name = i.index_name
 AND   s.owner = i.owner
 AND   s.segment_type IN ('INDEX', 'INDEX PARTITION', 'INDEX SUBPARTITION')
 UNION ALL
 SELECT l.table_name, l.owner, s.bytes
 FROM dba_lobs l, dba_segments s
 WHERE s.segment_name = l.segment_name
 AND   s.owner = l.owner
 AND   s.segment_type IN ('LOBSEGMENT', 'LOB PARTITION')
 UNION ALL
 SELECT l.table_name, l.owner, s.bytes
 FROM dba_lobs l, dba_segments s
 WHERE s.segment_name = l.index_name
 AND   s.owner = l.owner
 AND   s.segment_type = 'LOBINDEX')
WHERE owner in UPPER('&owner')
GROUP BY table_name, owner
HAVING SUM(bytes)/1024/1024 > 10  /* Ignore really small tables */
ORDER BY SUM(bytes) desc
;
196
ответ дан WW. 2 December 2013 в 12:35
поделиться

Во-первых, соберите статистику оптимизатора на таблице (если Вы уже не имеете):

begin
   dbms_stats.gather_table_stats('MYSCHEMA','MYTABLE');
end;
/

ПРЕДУПРЕЖДЕНИЕ: Поскольку Justin говорит в своем ответе, заключая, что статистика оптимизатора влияет на оптимизацию запросов и не должна быть сделана без должного ухода и соображения !

Затем находят количество блоков занятым таблицей из сгенерированной статистики:

select blocks, empty_blocks, num_freelist_blocks
from   all_tables
where  owner = 'MYSCHEMA'
and    table_name = 'MYTABLE';
  • общее количество блоков, выделенных таблице, является блоками + empty_blocks + num_freelist_blocks.

  • блоки являются количеством блоков, которые на самом деле содержат данные.

Умножают количество блоков используемым размером блока (обычно 8 КБ) для использования пространства - например, 17 блоков x 8 КБ = 136 КБ.

, Чтобы сделать это для всех таблиц в схеме сразу:

begin
    dbms_stats.gather_schema_stats ('MYSCHEMA');
end;
/

select table_name, blocks, empty_blocks, num_freelist_blocks
from   user_tables;

Примечание: Изменения, внесенные в вышеупомянутое после чтения этот поток AskTom

8
ответ дан Tony Andrews 2 December 2013 в 12:35
поделиться

Прежде всего я обычно предостерегал бы, что, собирая статистику таблицы, чтобы сделать, анализ пространства является потенциально опасной вещью сделать. Сбор статистики может изменить планы запросов, особенно если DBA настроил сборочное задание статистики, которое использует параметры не по умолчанию, которые Ваш вызов не использует и заставит Oracle повторно анализировать запросы, которые используют рассматриваемую таблицу, которая может быть хитом производительности. Если DBA намеренно встал из-за некоторых столов без статистики (распространенный, если Ваш OPTIMIZER_MODE, ВЫБИРАЮТ), заключая, что статистика может заставить Oracle прекращать использовать основанный на правилах оптимизатор и начинать использовать оптимизатор на основе издержек для ряда запросов, которые могут быть сильной головной болью производительности, если это неожиданно сделано в производстве. Если Ваши статистические данные точны, можно запросить USER_TABLES (или ALL_TABLES или DBA_TABLES) непосредственно, не звоня GATHER_TABLE_STATS. Если Ваши статистические данные не точны, существует, вероятно, причина этого, и Вы не хотите нарушать статус-кво.

1111-секундный, самым близким эквивалентом процедуре SQL Server sp_spaceused является вероятная Oracle DBMS_SPACE пакет. У Tom Kyte есть хорошее show_space процедура , которая предоставляет простой интерфейс этому пакету и распечатывает информацию, подобную тому, что sp_spaceused распечатывает.

29
ответ дан Justin Cave 2 December 2013 в 12:35
поделиться

IIRC таблицы, в которых Вы нуждаетесь, являются DBA_TABLES, DBA_EXTENTS или DBA_SEGMENTS и DBA_DATA_FILES. Существует также USER_ и версии ALL_ их для таблиц, которые Вы видите, нет ли у Вас полномочий администрирования на машине.

5
ответ дан ConcernedOfTunbridgeWells 2 December 2013 в 12:35
поделиться
  • 1
    Шанс, что до н.э. это - просто ГЛАВНЫЙ запрос, можно пойти междоменный? –  13 June 2013 в 09:23

Простой выбор, который возвращает исходные размеры таблиц на основе размера блока, также включает размер с индексом

select table_name, (nvl (( выбрать сумму (блоки) из dba_indexes a, dba_segments b где a.index_name = b.segment_name и a.table_name = dba_tables.table_name ), 0) + блоки) * 8192/1024 TotalSize, блоки * 8 tableSize из dba_tables заказать по 3

0
ответ дан 24 November 2019 в 01:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: