Oracle
 sql >> Database >  >> RDS >> Oracle

Oracle 12c:l'indice su una colonna "numero" ha prestazioni più veloci dell'indice su una colonna "varchar"?

[TL;DR] Usa le date per memorizzare le date, i numeri per memorizzare i numeri e le stringhe per archiviare le stringhe.

Oracle memorizza il NUMBER tipo di dati come 1 byte per 2 cifre.

Oracle memorizza il CHAR tipo di dati come 1 byte per carattere ASCII (UTF-8 e altre codifiche potrebbero richiedere più caratteri in set estesi) e riempirà la stringa con il tasto destro del mouse con spazi in modo che le stringhe abbiano tutte esattamente la stessa lunghezza.

Oracle memorizza il VARCHAR2 tipo di dati come 1 byte per carattere ASCII più un piccolo sovraccarico (1 o 2 byte) per la lunghezza della stringa.

Oracle memorizza il DATE tipo di dati come 7 byte (2 per anno e 1 per mese, giorno, ora, minuto, secondo).

Sulla base della la tua domanda precedente sembra che tu stia memorizzando year e quarter e supponendo di avere sempre anni a 4 cifre e trimestri a 1 cifra, allora:

  • NUMBER(5,0) richiederebbe 3 byte;
  • CHAR(5 CHARACTER) richiederebbe 5 byte;
  • VARCHAR2(5 CHARACTER) richiederebbe 6 byte; e
  • DATE richiederebbe 7 byte.

Quindi considerando solo la memoria un NUMBER(5,0) sarebbe il più efficiente.

Comunque

Non appena inizi a fare aritmetica su anno/trimestri memorizzati come numeri/stringhe, allora entri in problemi di prestazioni:

Ad esempio, ottenere il trimestre successivo :

  • Se quarter è un NUMBER tipo di dati quindi potresti usare:CASE WHEN MOD(quarter,10) = 4 THEN quarter + 7 ELSE quarter + 1 END ma questo non funziona quando vuoi aggiungere 5 quarti o iniziare a sottrarre quarti e quindi la logica inizia a diventare molto più complicata.
  • Se quarter è un CHAR tipo di dati, quindi puoi convertirlo in un numero o in una data e utilizzare uno di questi metodi (è improbabile che la manipolazione delle stringhe sia efficace).
  • Se quarter è una DATE quindi devi solo usare ADD_MONTHS( quarter, 3 ) .

Il DATE il metodo è autodocumentante ed esiste già mentre il NUMBER il metodo diventerebbe semplicemente una funzione personalizzata per l'approssimazione di un QUARTER tipo di dati e una volta implementate tutte le funzioni di confronto e manipolazione di cui hai bisogno avrai effettivamente riscritto il DATE tipo di dati come UDT per i trimestri e tali funzioni saranno meno performanti rispetto alle funzioni di data ottimizzate.

Non utilizzare tipi di dati inappropriati:archivia semplicemente le date come date; numeri come numeri; e stringhe come stringa.