Vrátit table_name a Partition_Name jejichž počet má hodnotu 0

hlasů
1

Snažím se psát dotaz, který vrátí table_name a Partition_Name jejichž počet tomto oddílu mají hodnotu 0.

Mám níže dotazu, který vrátí SELECT COUNT () z tabulek a její rozdělení:

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

To jsou některé z SELECT, že návrat:

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

Poslední z nich je to, že pouze to, že návratové údaje:

COUNT(*) |
2430276  |

Co potřebuju, je dotaz, který vrátí table_name a Partition_Name těch, kdo nemá žádné údaje. Něco takového:

TABLE_NAME | PARTITION_NAME
A5109713   | PT5109713_201210
A5109713   | PT5109713_201104
Položena 13/02/2020 v 23:52
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
0

Tato metoda s použitím dynamické SQL je těžké realizovat, a pomalu spustit (protože je třeba ručně počítat řádky v každém oddílu). Také nyní se ocitnete v nouzi některé další logiku, která bude vyžadovat více PL / SQL kódu.

Pohled systém user_tab_partitionsmá sloupec s názvem num_rows, který je dokumentován jako : Počet řádků v bloku . Spolehlivost informací, které obsahuje, závisí na čerstvosti svých statistik.

Takže, pokud vaše statistiky jsou až do dnešního dne, pak můžete získat informace, které hledáte přímo z pohledu:

select table_name, partition_name
from user_tab_partitions
where num_rows = 0
order by table_name, partition_name
Odpovězeno 14/02/2020 v 00:11
zdroj uživatelem

hlasů
0

Bych postup takto:

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;

Já bych se spoléhat na NUM_ROWSv názoru USER_TAB_PARTITIONS, protože spolehlivost informací, které obsahuje, závisí na čerstvosti svých statistik.

I používat SELECT ROWNUM FROM ... WHERE ROWNUM <= 1;místo COUNT(*)pro představení důvodu. Ve skutečnosti nejste zajímají o celkovém počtu řádků, je stejně jako vědět, zda jsou větší než 0.

V nejhorším případě COUNT(*)běží na plný TABLE Scan, který je mnohem pomalejší, než číst pouze první záznam.

Odpovězeno 14/02/2020 v 13:35
zdroj uživatelem

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