NUM_NULLS и NUM_ROWS не работают для Oracle

#sql #oracle

#sql #Oracle

Вопрос:

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

ВЫБЕРИТЕ atc.column_name, atc.table_name, atc.data_type, ОБЪЕДИНИТЕ (atc.num_nulls, 0), ОБЪЕДИНИТЕ (at.num_rows, 0) Из all_tab_columns atc ПРИСОЕДИНИТЕ все таблицы at К ATC.TABLE_NAME = at.table_name ;

Что-то не так с моим кодом или возможно, что all_tab_columns или all_tables не обновлены?

PS. В таблицах действительно есть информация, я уже проверил, была ли база данных пуста.

Комментарии:

1. Вы повторно собрали статистику таблицы? exec dbms_stats.gather_table_stats(user,'TABLE_NAME')

2. Даже если статистика собрана и достаточно актуальна, она не будет точным подсчетом содержимого. Это может быть достаточно хорошо, чтобы дать грубое приближение доли пустых / заполненных столбцов, но на самом деле не следует полагаться на что-либо сверх этого.

3. @paul У меня нет, но когда я попробовал это, он говорит, что у меня нет нужных привилегий для этого.

4. @AlexPoole, Ты знаешь лучший способ получить точную информацию?

5. Насколько точным вам это нужно быть и почему? Единственный способ получить точную информацию — это подсчитать фактические данные в таблицах, но вы все равно знаете, каким было количество в тот момент времени. В 11g цифры могут быть точными на момент сбора статистики, но, вероятно, будут устаревшими к тому времени, когда вы посмотрите на них. Вероятно, вам нужно посмотреть, зачем вам нужны числа и для чего они будут использоваться.

Ответ №1:

Вы можете выполнить цикл по таблице all_tab_columns, чтобы сгенерировать для вас скрипт, который выглядит примерно так:

 with data as (
    select
        count(*) tot_rows,
        count(owner) owner,
        count(object_name) object_name,
        count(subobject_name) subobject_name
    from tblname
)
select column_name, not_null_count, tot_rows - not_null_count null_count
from data
unpivot (
    not_null_count
    for column_name in (owner,object_name,subobject_name)
);
  

Что даст вам результаты:

 COLUMN_NAME    NOT_NULL_COUNT NULL_COUNT
-------------- -------------- ----------
OWNER                     801          0
OBJECT_NAME               801          0
SUBOBJECT_NAME              0        801