Devolver el nombre_tabla y partition_name cuyo recuento tener un valor de 0

votos
1

Estoy intentando escribir una consulta que devuelve el nombre_tabla y partition_name cuyo recuento de esa partición tiene un valor de 0.

Tengo el siguiente consulta que devuelve el SELECT COUNT () de las tablas y su partición:

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

Estos son algunos de los SELECT que devuelven:

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

El último de ellos es los datos de retorno sólo eso:

COUNT(*) |
2430276  |

Lo que necesito es una consulta que devuelve el nombre_tabla y partition_name de los que no tiene datos. Algo como esto:

TABLE_NAME | PARTITION_NAME
A5109713   | PT5109713_201210
A5109713   | PT5109713_201104
Publicado el 13/02/2020 a las 23:52
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
0

Este método utiliza SQL dinámico es pesado para poner en práctica, y lento para ejecutar (ya que se necesita para contar manualmente las filas de cada partición). Además, ahora se encuentra en la necesidad de una lógica adicional, que requerirá más código PL / SQL.

Vista del sistema user_tab_partitionstiene columna llamada num_rowsque está documentado como : Número de filas de la partición . La fiabilidad de la información que contiene depende de la frescura de sus estadísticas.

Por lo tanto, si sus estadísticas son hasta la fecha, a continuación, puede obtener la información que está buscando directamente desde la vista:

select table_name, partition_name
from user_tab_partitions
where num_rows = 0
order by table_name, partition_name
Respondida el 14/02/2020 a las 00:11
fuente por usuario

votos
0

Lo haría un procedimiento como este:

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;

Yo no confiaría en NUM_ROWSel paisaje USER_TAB_PARTITIONSdebido a la fiabilidad de la información que contiene depende de la frescura de sus estadísticas.

Utilizo SELECT ROWNUM FROM ... WHERE ROWNUM <= 1;en lugar de COUNT(*)por motivos de rendimiento. En realidad, usted no está interesado en el número total de filas, al igual que para saber si son mayores que 0.

En peor de los casos COUNT(*)se ejecuta un servicio completo, mesa de estudio, que es mucho más lento que la lectura sólo el primer registro.

Respondida el 14/02/2020 a las 13:35
fuente por usuario

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