Returner table_name og partisjons hvis teller ha en verdi fra 0

stemmer
1

Jeg prøver å skrive en spørring som returnerer table_name og partisjons som teller til at partisjonen har en verdi på 0.

Jeg har fått under spørring som returnerer SELECT COUNT () av ​​tabellene og dens partisjonen:

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

Dette er noen av SELECT at retur:

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

Den siste er det de bare at avkastningstallene:

COUNT(*) |
2430276  |

Det jeg trenger er en spørring som returnerer table_name og partisjons av dem som ikke har noen data. Noe sånt som dette:

TABLE_NAME | PARTITION_NAME
A5109713   | PT5109713_201210
A5109713   | PT5109713_201104
Publisert på 13/02/2020 klokken 23:52
kilden bruker
På andre språk...                            


2 svar

stemmer
0

Denne metoden å bruke dynamisk SQL er tung å gjennomføre, og treg til å utføre (siden du trenger å telle rader i hver partisjon manuelt). Også, du nå befinner deg i behov av noen ekstra logikk, som vil kreve mer PL / SQL-kode.

System vis user_tab_partitionshar kolonne heter num_rowssom er dokumentert som : Antall rader i skilleveggen . Påliteligheten av informasjonen den inneholder er avhengig av friskhet av statistikken.

Så hvis statistikken er oppdatert, så kan du få den informasjonen du er på jakt etter direkte fra visningen:

select table_name, partition_name
from user_tab_partitions
where num_rows = 0
order by table_name, partition_name
Svarte 14/02/2020 kl. 00:11
kilden bruker

stemmer
0

Jeg ville en prosedyre som dette:

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;

Jeg ville ikke stole på NUM_ROWSpå visning USER_TAB_PARTITIONSfordi påliteligheten av informasjonen den inneholder er avhengig av friskhet av statistikken.

Jeg bruker SELECT ROWNUM FROM ... WHERE ROWNUM <= 1;i stedet for COUNT(*)for ytelse grunn. Egentlig du ikke er interessert i det totale antallet rader, til deg akkurat som vet om de er større enn 0.

I verste fall COUNT(*)kjører en full-TABLE Scan som er mye tregere enn å lese bare den første posten.

Svarte 14/02/2020 kl. 13:35
kilden bruker

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