Bringen Sie den table_name und partition_name deren Zählung einen Wert von 0

stimmen
1

Ich versuche, eine Abfrage zu schreiben, die die table_name und partition_name deren Zahl dieser Partition einen Wert von 0 zurück.

Ich habe die folgende Abfrage bekommt, das den SELECT COUNT () der Tabellen und seine Partition zurück:

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

Dies sind einige der SELECT dass Rückkehr:

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

Der letzte, es ist das einzige, dass Rückgabedaten:

COUNT(*) |
2430276  |

Was ich brauche, ist eine Abfrage, die die table_name und partition_name von denen zurückgeben, die keine Daten hat. Etwas wie das:

TABLE_NAME | PARTITION_NAME
A5109713   | PT5109713_201210
A5109713   | PT5109713_201104
Veröffentlicht am 13/02/2020 um 21:52
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
0

Diese Methode dynamisches SQL verwendet, ist schwer zu implementieren, und langsam auszuführen (da Sie manuell müssen Zeilen in jeder Partition zählen). Auch jetzt können Sie sich in der Notwendigkeit einiger zusätzlichen Logik finden, die mehr PL / SQL-Code benötigen.

Systemansicht user_tab_partitionshat Spalte genannt , num_rowsdas ist wie dokumentiert : Anzahl der Zeilen in der Partition . Die Zuverlässigkeit der Informationen , die es hängt von der Frische Ihrer Statistiken enthält.

Also, wenn Sie Ihre Statistiken auf dem neuesten Stand sind, dann können Sie die Informationen erhalten, die Sie für direkt aus der Ansicht suchen:

select table_name, partition_name
from user_tab_partitions
where num_rows = 0
order by table_name, partition_name
Beantwortet am 13/02/2020 um 22:11
quelle vom benutzer

stimmen
0

Ich würde ein Verfahren wie folgt aus:

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;

Ich würde nicht darauf verlassen , NUM_ROWSauf Sicht , USER_TAB_PARTITIONSweil die Zuverlässigkeit der Informationen , die es über die Frische Ihrer Statistik hängt enthält.

Ich benutze SELECT ROWNUM FROM ... WHERE ROWNUM <= 1;statt COUNT(*)für Performance Grund. Eigentlich sind Sie nicht in der Gesamtzahl der Zeilen interessieren, die Sie gerade wie wissen , ob sie größer als 0.

Im schlimmsten Fall COUNT(*)führt ein FULL-Table - Scan , die langsamer ist viel als nur den ersten Datensatz zu lesen.

Beantwortet am 14/02/2020 um 11:35
quelle vom benutzer

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