sql >> Base de Datos >  >> RDS >> Oracle

Oracle 10g:estimación del valor de la columna MIN/MAX

Sí, LOW_VALUE y HIGH_VALUE le indicarán los valores mínimo y máximo en la columna pero :

  • se almacenan como columnas RAW(32), por lo que el significado no será evidente de inmediato
  • serán a partir de la última vez que se recopilaron estadísticas para la tabla, por lo que es posible que no sean precisas (a menos que recopile estadísticas explícitamente antes de usarlas)

Si indexa la columna, MIN(a) y MAX(a) deberían ser muy rápidos como en este ejemplo donde T1 tiene 50000 filas y está indexado en OBJECT_ID:

SQL> select min(object_id) from t1;

MIN(OBJECT_ID)
--------------
           100

------------------------------------------------------------------------------------
| Id  | Operation                  | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT           |       |     1 |     5 |     2   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE            |       |     1 |     5 |            |          |
|   2 |   INDEX FULL SCAN (MIN/MAX)| T1_ID | 53191 |   259K|     2   (0)| 00:00:01 |
------------------------------------------------------------------------------------

Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
          2  consistent gets
          0  physical reads
          0  redo size
        419  bytes sent via SQL*Net to client
        380  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

El resultado es el mismo si selecciona MAX en lugar de MIN. Sin embargo, si selecciona MIN y MAX en una sola declaración de selección, el resultado es diferente:

SQL> select min(object_id), max(object_id) from t1;

MIN(OBJECT_ID) MAX(OBJECT_ID)
-------------- --------------
           100          72809


-------------------------------------------------------------------------------
| Id  | Operation             | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |       |     1 |     5 |    34   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE       |       |     1 |     5 |            |          |
|   2 |   INDEX FAST FULL SCAN| T1_ID | 53191 |   259K|    34   (0)| 00:00:01 |
-------------------------------------------------------------------------------


Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
        125  consistent gets
          0  physical reads
          0  redo size
        486  bytes sent via SQL*Net to client
        380  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

Esto sugiere que puede ser mejor obtenerlos por separado, aunque no lo he probado de manera concluyente.