Запрос на использование места для таблицы Oracle выполняется слишком медленно

Я использую запрос ниже для извлечения памяти, занимаемой таблицей.

SELECT SUM(bytes), SUM(bytes)/1024/1024 MB
    FROM dba_extents
    WHERE owner = :Owner
    AND segment_name = :table_name;

На печать файла размером 2 МБ ушло 986 ​​секунд (16 минут).

Что не так с этим запросом?

Есть ли лучший запрос, который очень быстро предоставляет одни и те же данные?


person Ravindra babu    schedule 10.09.2015    source источник
comment
замените запрос на SUM (байты), (SUM (байты) * 1024) / (1024).   -  person Tharunkumar Reddy    schedule 10.09.2015
comment
@Tarun (СУММ (байты) * 1024) / (1024) совпадает с суммой (байтами)   -  person David Aldridge    schedule 10.09.2015


Ответы (2)


SELECT SUM(bytes), SUM(bytes)/1024/1024 MB
FROM DBA_SEGMENTS
WHERE owner = :Owner
AND segment_name = :table_name;

Сегментов гораздо меньше, чем экстентов, но это странно. Сколько экстентов у вашей таблицы?

И, к вашему сведению, это просто данные несекционированной таблицы. И если в таблице есть индексы, большие объекты или типы объектов, это не все необходимое пространство.

person Husqvik    schedule 10.09.2015
comment
ваш запрос с DBA_SEGMENTS заботится о разделах и индексах? - person Ravindra babu; 10.09.2015
comment
Я выполнил этот запрос для ежедневной таблицы разделов. Теперь у меня есть данные только за один день. Как получить пространство таблицы по всем разделам? - person Ravindra babu; 10.09.2015
comment
Нет, потому что (под) разделы, индексы. Для индексов lob требуются собственные сегменты. Итак, вам нужно найти их имена и просуммировать общий размер. - person Husqvik; 10.09.2015
comment
Ваш запрос вернулся за 2 секунды для данных 186 МБ :) Кстати, есть ли другой хороший запрос, который возвращает пространство из всех разделов? - person Ravindra babu; 10.09.2015
comment
См. [stackoverflow.com/questions/264914/ - person Husqvik; 10.09.2015

Медленный доступ к DBA_EXTENTS кажется распространенной проблемой. Вот цитата:

Однако основная проблема производительности здесь заключается в том, что значения столбцов BYTES, BLOCKS и EXTENTS представлений DBA / USER / ALL_SEGMENTS и DBA / USER / ALL_EXTENTS не хранятся в словаре данных для сегментов, которые находятся в локально управляемых табличных пространствах. Вместо этого они должны быть получены путем доступа к блокам заголовков сегментов для всех сегментов, обрабатываемых в запросе. Эти дополнительные блоки доступа вызывают снижение производительности. Таким образом, с увеличением количества файлов базы данных и сегментов производительность запроса в этом случае может потенциально ухудшиться. Кроме того, в определенных обстоятельствах Oracle не кэширует должным образом эти блоки заголовков сегментов, что заставляет их читать с диска даже при следующем запуске запроса, поэтому кэширование не происходит. Не удивляйтесь, если я скажу, что запрос к dba_segments может запускать даже в фоновом режиме еще несколько процедур из пакета DBMS_SPACE_ADMIN для получения правильной информации о размере сегмента.

Ссылка также содержит решение для этого, которое я не могу применить и протестировать, потому что у меня сейчас нет собственной базы данных. Но я считаю, что идея у вас есть.

person miracle_the_V    schedule 10.09.2015