Вернуть table_name и partition_name, чей счет имеет значение 0 - PullRequest
1 голос
/ 13 февраля 2020

Я пытаюсь написать запрос, который возвращает table_name и partition_name, чей счет этого раздела имеет значение 0.

У меня есть следующий запрос, который возвращает SELECT COUNT () из таблицы и их разделы:

SELECT 'SELECT COUNT(*) FROM ' || TABLE_NAME || ' PARTITION (' || PARTITION_NAME || ');'
FROM user_tab_partitions
ORDER BY table_name;

Вот некоторые из возвращаемых SELECT:

SELECT COUNT(*) FROM A5109713 PARTITION (PT5109713_201210);
SELECT COUNT(*) FROM A5109713 PARTITION (PT5109713_201104);
SELECT COUNT(*) FROM A5109713 PARTITION (PT5109713_201301);

Последние, единственные, которые возвращают данные:

COUNT(*) |
2430276  |

Мне нужен запрос, который возвращает table_name и partition_name тех, у кого нет данных. Примерно так:

TABLE_NAME | PARTITION_NAME
A5109713   | PT5109713_201210
A5109713   | PT5109713_201104

Ответы [ 2 ]

1 голос
/ 14 февраля 2020

Я хотел бы такую ​​процедуру:

DECLARE
    r INTEGER;
    cur sys_refcursor;
BEGIN
    FOR aPart IN (SELECT TABLE_NAME, PARTITION_NAME FROM USER_TAB_PARTITIONS ORDER BY TABLE_NAME, PARTITION_POSITION) LOOP
        OPEN cur FOR 'SELECT ROWNUM FROM '||aPart.TABLE_NAME||' PARTITION ('||aPart.PARTITION_NAME||') WHERE ROWNUM <= 1';
        FETCH cur INTO r;
        IF cur%NOTFOUND THEN
            DBMS_OUTPUT.PUT_LINE(aPart.TABLE_NAME||CHR(9)||aPart.PARTITION_NAME);
        end if;
        close cur;
    END LOOP;
END;

Я бы не стал полагаться на NUM_ROWS при просмотре USER_TAB_PARTITIONS, потому что достоверность содержащейся в нем информации зависит от свежести вашей статистики.

Я использую SELECT ROWNUM FROM ... WHERE ROWNUM <= 1; вместо COUNT(*) по соображениям производительности. На самом деле вас не интересует общее количество строк, вы просто хотите узнать, больше ли они 0.

В худшем случае COUNT(*) запускает FULL-TABLE Scan, которая намного медленнее, чем чтение только Первая запись.

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

Этот метод с использованием Dynami c SQL является сложным для реализации и медленным для выполнения (так как вам нужно вручную считать строки в каждом разделе). Кроме того, вы теперь нуждаетесь в некоторых дополнительных логах c, для которых потребуется больше кода PL / SQL.

Системное представление user_tab_partitions имеет столбец с именем num_rows, который задокументирован as : Количество строк в разделе . Надежность содержащейся в ней информации зависит от свежести вашей статистики.

Итак, если ваша статистика актуальна, вы можете получить информацию, которую ищете, непосредственно из представления:

select table_name, partition_name
from user_tab_partitions
where num_rows = 0
order by table_name, partition_name
...