Привыкнув к MSSQL (и потенциально испорченный им), мне интересно, как я могу достичь размера таблиц в Oracle 10g. Я погуглил, поэтому теперь понимаю, что у меня может быть не такой простой вариант, как sp_spaceused. Тем не менее потенциальные ответы, которые я получил, в большинстве случаев устарели или не работают. Вероятно, потому что я не администратор баз данных по схеме, с которой работаю.
Есть ли у кого-нибудь решения или рекомендации?
Ответы:
Возможно, вам будет интересен этот запрос. Он сообщает вам, сколько места выделено для каждой таблицы, с учетом индексов и любых больших объектов в таблице. Часто вас интересует, «Сколько места занимает таблица заказа на закупку, включая любые индексы», а не только сама таблица. Вы всегда можете вникнуть в детали. Обратите внимание, что для этого требуется доступ к представлениям DBA_ *.
источник
источник
null
(num_rows
,avg_row_len
), вам необходимо провести некоторый анализ перед этим с помощью следующего утвержденияANALYZE TABLE your_table COMPUTE STATISTICS
Во-первых, я бы хотел предупредить, что сбор статистики таблиц для анализа пространства - это потенциально опасное занятие. Сбор статистики может изменить планы запросов, особенно если администратор баз данных настроил задание по сбору статистики, которое использует параметры, отличные от параметров по умолчанию, которые не используются вашим вызовом, и заставит Oracle повторно анализировать запросы, использующие рассматриваемую таблицу, что может быть производительностью ударить. Если администратор базы данных намеренно оставил некоторые таблицы без статистики (обычно, если вы
OPTIMIZER_MODE
выбрали CHOOSE), сбор статистики может привести к тому, что Oracle прекратит использование оптимизатора на основе правил и начнет использовать оптимизатор на основе затрат для набора запросов, что может быть основной производительностью. головная боль, если это происходит неожиданно на производстве. Если ваша статистика точна, вы можете запроситьUSER_TABLES
(илиALL_TABLES
илиDBA_TABLES
) напрямую без звонкаGATHER_TABLE_STATS
. Если ваша статистика неточна, вероятно, для этого есть причина, и вы не хотите нарушать статус-кво.Во-вторых, наиболее близким эквивалентом
sp_spaceused
процедуры SQL Server, вероятно, являетсяDBMS_SPACE
пакет Oracle . У Тома Кайта есть хорошаяshow_space
процедура, которая обеспечивает простой интерфейс для этого пакета и выводит на печать информацию, аналогичную той, чтоsp_spaceused
выводится.источник
Сначала соберите статистику оптимизатора в таблице (если вы еще этого не сделали):
ВНИМАНИЕ: как сказал Джастин в своем ответе, сбор статистики оптимизатора влияет на оптимизацию запросов и не должен выполняться без должной осторожности и внимания !
Затем найдите количество блоков, занятых таблицей, из сгенерированной статистики:
Общее количество блоков, выделенных для таблицы, составляет блоки + empty_blocks + num_freelist_blocks.
блоки - это количество блоков, которые фактически содержат данные.
Умножьте количество блоков на размер используемого блока (обычно 8 КБ), чтобы получить занимаемое пространство - например, 17 блоков x 8 КБ = 136 КБ.
Чтобы сделать это сразу для всех таблиц в схеме:
Примечание: изменения, внесенные в приведенное выше после прочтения этой ветки AskTom
источник
Я изменил запрос WW, чтобы предоставить более подробную информацию:
источник
Для суб-секционированных таблиц и индексов мы можем использовать следующий запрос
источник
IIRC, вам нужны таблицы DBA_TABLES, DBA_EXTENTS или DBA_SEGMENTS и DBA_DATA_FILES. Существуют также версии USER_ и ALL_ для таблиц, которые вы можете увидеть, если у вас нет прав администратора на машине.
источник
Вот вариант ответа WW, он включает в себя разделы и подразделы, как предлагали другие выше, плюс столбец для отображения ТИПА: Таблица / Индекс / LOB и т. Д.
источник
источник
Я изменил запрос, чтобы получить размер схемы для каждого табличного пространства.
источник
Зависит от того, что вы подразумеваете под «размером стола». Таблица не относится к конкретному файлу в файловой системе. Таблица будет находиться в табличном пространстве (возможно, в нескольких табличных пространствах, если она разбита на разделы, и, возможно, в нескольких табличных пространствах, если вы также хотите учитывать индексы в таблице). Табличное пространство часто будет содержать несколько таблиц и может быть распределено по нескольким файлам.
Если вы оцениваете, сколько места вам понадобится для будущего роста таблицы, тогда avg_row_len, умноженный на количество строк в таблице (или количество строк, которые вы ожидаете в таблице), будет хорошим ориентиром. Но Oracle оставит некоторое пространство свободным в каждом блоке, отчасти для того, чтобы строки могли `` расти '' при их обновлении, отчасти потому, что может оказаться невозможным уместить еще одну целую строку в этом блоке (например, блок 8K поместится только в 2 строки 3 КБ, хотя это был бы крайний пример, поскольку 3 КБ намного больше, чем большинство размеров строк). Так что BLOCKS (в USER_TABLES) может быть лучшим руководством.
Но если бы у вас было 200000 строк в таблице, вы удалили половину из них, тогда таблица все равно «владеет» тем же количеством блоков. Это не освобождает их для использования другими таблицами. Кроме того, блоки добавляются в таблицу не по отдельности, а в группах, называемых «экстентом». Таким образом, в таблице обычно будет EMPTY_BLOCKS (также в USER_TABLES).
источник
Исправление для секционированных таблиц:
источник
Простой выбор, который возвращает исходные размеры таблиц в зависимости от размера блока, также включает размер с индексом
select table_name, (nvl ((select sum (blocks) from dba_indexes a, dba_segments b, где a.index_name = b.segment_name и a.table_name = dba_tables.table_name), 0) + blocks) * 8192/1024 TotalSize, блоки * 8 tableSize из dba_tables в порядке 3
источник
Я обнаружил, что это немного точнее:
источник
источник
есть еще одна опция, которая позволяет получить размер "выбора" с объединениями, а также размер таблицы как вариант
источник
У меня такой же вариант, как и у последних, который вычисляет сегменты данных таблицы, индексы таблиц и blob-поля:
Источник .
источник