#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