Как я могу получить этот запрос для вывода для нескольких значений в таблице - PullRequest
2 голосов
/ 30 марта 2019

У меня есть запрос, который даст мне средний размер в байтах для данного имени таблицы.

Я намереваюсь использовать его в качестве оценки для набора результатов sql, например, 100-байтовая таблица имеет 100 строк, она будет работать, каждая строка может составлять 1 байт. Следовательно, выборка в таблице с предложением where, которая возвращает 25 строк, может быть оценена как 25 байтов.

Это элементарный планировщик мощности. Который, посмотрев на другие возможные методы, я бы предпочел по сравнению со всем, что зависит от статистики.

Я попробовал приведенный ниже код, который отлично работает для 1 таблицы.

SELECT a.total_bytes / b.num_rows avg_row_size
FROM (SELECT SUM(bytes) total_bytes
FROM dba_extents
WHERE owner = 'KEVIN'
AND segment_name = 'KEVS_TABLE' ) a,
(SELECT COUNT(*) num_rows
FROM KEVS_TABLE) b 

Тем не менее, я хотел бы, чтобы этот цикл прошел и дал результаты для всей загрузки таблиц. Я пробовал:

SELECT a.total_bytes / b.num_rows avg_row_size
FROM (SELECT SUM(bytes) total_bytes
FROM dba_extents
WHERE 
segment_name in (select table_name from table_list) ) a,
(SELECT COUNT(*) num_rows
FROM table_list) b 

Но это просто ничего не возвращает.

Есть какие-нибудь идеи, как заставить его возвращать значение для каждой строки в table_list?

1 Ответ

2 голосов
/ 30 марта 2019

Я думаю, что вы слишком усложняете это. Что касается системы, в системном представлении Oracle ALL_TABLES в столбце AVG_ROW_LEN.

содержится информация, которую вы ищете.

В документации сказано:

AVG_ROW_LEN - NUMBER: средняя длина строки в таблице (в байтах)

NB: AVG_ROW_LENGTH заполняется, только если статистика была собрана по соответствующей таблице.

Так что вы должны иметь возможность использовать запрос вроде:

SELECT table_name, avg_row_length FROM all_tables WHERE owner = 'KEVIN';

Или, если вы хотите проверить все таблицы в вашей текущей схеме, просто используйте USER_TABLES:

SELECT table_name, avg_row_length FROM user_tables;

Примечание: обратите внимание, что ALL_TABLESUSER_TABLES) содержит много другой информации, которая может быть полезна для вашего случая использования, при условии, что связанные таблицы анализируются недавно, например, величина данных близка к реальному времени, например :

  • NUM_ROWS: количество строк в таблице
  • BLOCKS: Количество используемых блоков данных в таблице (вы можете умножить это на размер блока табличного пространства, в котором размещена таблица, чтобы вычислить ее общий размер в байтах)
  • LAST_ANALYZED: дата последнего анализа этой таблицы
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...