Visszatérés a table_name és partíció_neve akiknek száma van a 0 érték

szavazat
1

Próbálom beírni a keresett, hogy visszatérjen a table_name és partíció_neve akiknek száma a partíciót egy 0 érték.

Megvan a lenti lekérdezést, amely visszaadja a SELECT COUNT () az asztalok és a partíció:

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

Ezek közül néhány a SELECT, hogy a visszatérési:

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

Az utolsó, ez az egyetlen, amely visszatérő adatok:

COUNT(*) |
2430276  |

Amire szükségem van egy lekérdezés, hogy visszatérjen a table_name és partíció_neve akik nincsenek adatok. Valami ilyesmi:

TABLE_NAME | PARTITION_NAME
A5109713   | PT5109713_201210
A5109713   | PT5109713_201104
A kérdést 13/02/2020 23:52
a forrás felhasználó
Más nyelveken...                            


2 válasz

szavazat
0

Ez a módszer a dinamikus SQL nehéz megvalósítani, és lassan végre (mivel kézzel kell számolni sorok minden egyes partíció). Is, akkor most találja magát szüksége valamilyen további logika, hogy szükség lesz több PL / SQL-kódot.

Rendszer nézet user_tab_partitionsvan nevű oszlopot num_rows, amely dokumentált : A sorok száma a partíciót . Az információk megbízhatóságát tartalmaz függ a frissesség a statisztikát.

Tehát, ha a statisztikák naprakészek, akkor kap információt, amit keres közvetlenül a nézet:

select table_name, partition_name
from user_tab_partitions
where num_rows = 0
order by table_name, partition_name
Válaszolt 14/02/2020 00:11
a forrás felhasználó

szavazat
0

Én olyan eljárás, mint ez:

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;

Én nem hivatkozhat NUM_ROWSa nézet USER_TAB_PARTITIONS, mert a megbízhatóság a benne foglalt információk függ a frissesség a statisztikát.

ÉN használ SELECT ROWNUM FROM ... WHERE ROWNUM <= 1;helyett COUNT(*)a teljesítmény oka. Igazából nem érdekel a teljes sorok számát, csak szeretném tudni, hogy azok nagyobbak 0.

A legrosszabb esetben COUNT(*)fut egy teljes táblázat vizsgálat, ami sokkal lassabb, mint olvasó csak az első rekordot.

Válaszolt 14/02/2020 13:35
a forrás felhasználó

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more