Oracle - выберите только столбцы, которые содержат данные - PullRequest
0 голосов
/ 14 февраля 2019

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

Многие из этих столбцов полностью не используются.Я пытаюсь создать запрос, который возвращает список всех фактически используемых столбцов (содержит> 0 значений).

Моя текущая попытка -

SELECT table_name, column_name
FROM ALL_TAB_COLUMNS
WHERE OWNER = 'XUSER' 
    AND num_nulls < 1
;

Использование num_nulls < 1 резкоуменьшает число возвращаемых значений, как и ожидалось.

Однако при проверке некоторых таблиц в результатах запроса отсутствуют столбцы, в которых, по-видимому, есть значения.

Кто-нибудь может объяснить, почему это может иметь место?

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

"в результатах запроса отсутствуют столбцы, в которых, по-видимому, содержатся значения."

Потенциально каждый необязательный столбец может появиться в этом наборе, поскольку онвероятно, что некоторые строки будут иметь значения, но не все строки.«Некоторые строки» больше нуля означает, что такие столбцы не пройдут тест на num_nulls < 1.

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

 select t.table_name
        , tc.column_name
 from user_tables t
      join user_tab_cols tc on t.table_name = tc.table_name
 where t.num_rows > 0
and  t.num_rows = tc.num_nulls;

Обратите внимание, что если вы используете Partitioning, вам нужно будет сканировать user_tab_partitions.num_rows и user_part_col_statistics.num_nulls.

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

0 голосов
/ 14 февраля 2019

Прежде всего, статистика не всегда на 100% точна.Они могут быть собраны в подмножестве строк таблицы, так как они, в конце концов, статистика .Точно так же, как опросчикам не нужно спрашивать каждого американца, как они относятся к тому или иному политику, Oracle может получить достаточно точное представление о данных в таблице, прочитав только их часть.

Даже если статистикасобранные на 100% строк в таблице (и они могут быть собраны таким образом, если вы хотите), статистика устареет, как только появятся какие-либо вставки, обновления или удаления вТаблица.

Во-вторых, num_nulls < 1 не скажет вам столбцы, которые не имеют данных.Представьте себе таблицу с 100 строками и «столбцом X», имеющим num_nulls, равным 80. Это означает, что столбец имеет 20 ненулевых значений, но НЕ пройдет ваш фильтр.Лучшим подходом (если вы доверяете, что ваша статистика не устарела и основана на 100% выборке строк), можно сравнить DBA_TAB_COLUMNS.NUM_NULLS < DBA_TABLES.NUM_ROWS.Например, столбец с 99 нулями в таблице из 100 строк содержит данные в 1 строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...