publikaccion @publikaccion

jueves, febrero 23, 2017

Significado de count(1)

Cuando queremos emplear la función count(), para realizar un "cuenteo" del número de registros de una tabla, otra forma de afrontar la consulta en lugar del muy usado count(*), se puede emplear el menos común count(1).

Veamos un ejemplo


    select count(1) into l_num_rec_count 
        from [Table Name] where 1=1
            and [condition1] 
            and [condition2]; 

esta forma de realizar el cuenteo, lo que hace es sumar el número de "NON-NULL 1's" que devuelve la query, que es lo mismo que emplear "count(*)".

A todos los efectos count(1) es count(*) disfrazada :o)

Formas de obtener el total de registros de una tabla

Para obtener el total de registros de una tabla, se pueden emplear las siguientes estrategias de consulta

- consultar tablas del sistema


      select NUM_ROWS from ALL_TABLES 
            where TABLE_NAME = <TABLE_NAME_IN_UPPERCASE>

- emplear índices de la tabla


      select /*+ index(r REPARTO_FECHA_I) */ 
            count(r.FECHA) from REPARTO r where 1=1;

- emplear ejecuciones parallel para la tabla


      select /*+ parallel */ count(*) from <table_name>

- por medio de la columna de cualquier "primary key" de la tabla


      select count(<Primary_Key_col>) from <table_name>

He intentando poner de la opción más rápida a la menos rápida y desesperante...

Uso de índices en Oracle y conversiones de fecha

A la hora de emplear índices en las consultas de Oracle, en el caso de que hagamos una conversión si estamos empleando un índice sobre un dato del tipo DATE (fecha), el efectuar una conversión del registro, rompe la celeridad de la query de una forma dramática... pasando de tener una consulta de casi una hora, a realizar una consulta de sólo uno segundos sobre dicho índice.


      select /*+ index(r REPARTO_FECHA_I) */ 
            count(r.FECHA) from REPARTO r where 1=1 
            AND R.FECHA = TO_DATE('01/02/2017', 'DD/MM/YYYY') 
            -- HAY QUE EVITAR USAR ESTE TIPO DE CONVERSION
            -- YA QUE EMPLEA OTRA OPERACION DE CONVERSIONA TO_CHAR 
            -- Y RALENTIZA EL INDICE
            -- AND TO_CHAR(r.FECHA,'DD/MM/YYYY') = '22/02/2017'
            ;