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

Oracle 12c:¿el índice en una columna 'número' funciona más rápido que el índice en la columna 'varchar'?

[TL;RD] Use fechas para almacenar fechas, números para almacenar números y cadenas para almacenar cadenas.

Oracle almacena el NUMBER tipo de datos como 1 byte por 2 dígitos.

Oracle almacena el CHAR tipo de datos como 1 byte por carácter ASCII (UTF-8 y otras codificaciones pueden tomar más caracteres en conjuntos extendidos) y rellenará la cadena con caracteres de espacio para que todas las cadenas tengan exactamente la misma longitud.

Oracle almacena el VARCHAR2 tipo de datos como 1 byte por carácter ASCII más una pequeña sobrecarga (1 o 2 bytes) para la longitud de la cadena.

Oracle almacena el DATE tipo de datos como 7 bytes (2 por año y 1 por mes, día, hora, minuto, segundo).

Basado en su pregunta anterior parece que estás almacenando year y quarter y suponiendo que siempre tendrá años de 4 dígitos y trimestres de 1 dígito, entonces:

  • NUMBER(5,0) tomaría 3 bytes;
  • CHAR(5 CHARACTER) tomaría 5 bytes;
  • VARCHAR2(5 CHARACTER) tomaría 6 bytes; y
  • DATE tomaría 7 bytes.

Entonces, solo considerando la memoria como NUMBER(5,0) sería el más eficiente.

Sin embargo

Tan pronto como comience a hacer aritmética en el año/trimestre almacenado como números/cadenas, tendrá problemas de rendimiento:

Por ejemplo, obtener el próximo trimestre:

  • Si quarter es un NUMBER tipo de datos, entonces podría usar:CASE WHEN MOD(quarter,10) = 4 THEN quarter + 7 ELSE quarter + 1 END pero esto no funciona cuando quieres sumar 5 cuartos o comenzar a restar cuartos y luego la lógica comienza a volverse mucho más complicada.
  • Si quarter es un CHAR tipo de datos, entonces podría convertirlo en un número o una fecha y usar cualquiera de esos métodos (es probable que la manipulación de cadenas no funcione).
  • Si quarter es una DATE entonces solo necesita usar ADD_MONTHS( quarter, 3 ) .

La DATE El método se autodocumenta y ya existe, mientras que el NUMBER el método simplemente se convertiría en una función personalizada para su aproximación de un QUARTER tipo de datos y una vez que implemente todas las funciones de comparación y manipulación que necesita, habrá reescrito efectivamente el DATE tipo de datos como UDT para trimestres y esas funciones tendrán menos rendimiento que las funciones de fecha optimizadas.

No use tipos de datos inapropiados, solo almacene fechas como fechas; números como números; y cadenas como cadena.