Oracle
 sql >> Base de données >  >> RDS >> Oracle

Oracle 10g :Estimation de la valeur de la colonne MIN/MAX

Oui, LOW_VALUE et HIGH_VALUE vous indiqueront les valeurs minimale et maximale dans la colonne mais :

  • elles sont stockées sous forme de colonnes RAW(32), de sorte que la signification ne sera pas immédiatement apparente
  • il s'agira de la dernière collecte de statistiques pour le tableau, il se peut donc qu'elles ne soient pas exactes (sauf si vous collectez explicitement des statistiques avant de les utiliser)

Si vous indexez la colonne alors MIN(a) et MAX(a) devraient être très rapides comme dans cet exemple où T1 a 50000 lignes et est indexé sur 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

Le résultat est le même si vous sélectionnez le MAX au lieu du MIN. Cependant, si vous sélectionnez le MIN et le MAX dans une seule instruction de sélection, le résultat est différent :

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

Cela suggère qu'il serait peut-être préférable de les obtenir séparément, bien que je n'aie pas prouvé cela de manière concluante.