Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Oracle 10g:estimativa de valor de coluna MIN/MAX


Sim, LOW_VALUE e HIGH_VALUE informarão os valores mínimo e máximo na coluna mas :
  • eles são armazenados como colunas RAW(32), portanto, o significado não será imediatamente aparente
  • eles serão da última vez que as estatísticas foram coletadas para a tabela, portanto, podem não ser precisas (a menos que você colete estatísticas explicitamente antes de usá-las)

Se você indexar a coluna, MIN(a) e MAX(a) devem ser muito rápidos, como neste exemplo, onde T1 tem 50.000 linhas e está indexado em 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

O resultado é o mesmo se você selecionar MAX em vez de MIN. No entanto, se você selecionar MIN e MAX em uma única instrução select, o resultado será 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

Isso sugere que pode ser melhor obtê-los separadamente, embora eu não tenha provado isso de forma conclusiva.