sql - requete - lister les index d'une table oracle



Oracle 12c-L'index sur une colonne 'number' est-il plus rapide que l'index sur la colonne 'varchar'? (1)

Disons que j'ai une table dans Oracle 12c avec des colonnes:

create table t1 (
a number (5,0),
b varchar (5,0)
d ...
e ...
);

Ensuite, j'insère 100.000.000 enregistrements dans les deux colonnes qui ont les mêmes valeurs - par exemple

20151 and '20152' ... (for a first record)
20152 and '20152' ... (for a second record)
20153 and '20153' ... (for a third record)
...

Ensuite, j'ajoute l'index 1 sur la colonne 'a' et l'index 2 sur la colonne 'b'.

La question est la suivante: la requête fonctionnerait-elle aussi rapidement lors de l'exécution sur la colonne 'a' que sur la colonne 'b' (par exemple, join une autre table basée sur une colonne 'a' ou sur une colonne 'b' ou WHERE colonnes)?

Aussi - utiliserait-il l'index sur une colonne ' varchar ' - utiliser plus de CPU que d'utiliser l'index sur une colonne 'nombre'?

Merci.


[TL; DR] Utilisez les dates pour stocker les dates, les numéros pour stocker les numéros et les chaînes pour stocker les chaînes.

Et à propos de l'utilisation des ressources?

Oracle stocke le type de données NUMBER comme 1 octet par 2 chiffres.

Oracle stocke le type de données CHAR à 1 octet par caractère ASCII (les codages UTF-8 et autres peuvent prendre plus de caractères dans les ensembles étendus) et remplit à droite la chaîne avec des caractères espace pour que les chaînes aient exactement la même longueur.

Oracle stocke le type de données VARCHAR2 la forme d'un octet par caractère ASCII plus une petite surcharge (1 ou 2 octets) pour la longueur de la chaîne.

Oracle stocke le type de données DATE à 7 octets (2 pour l'année et 1 pour chaque mois, jour, heure, minute, seconde).

En fonction de votre question précédente, vous semblez stocker des year et des quarter et en supposant que vous aurez toujours des années à quatre chiffres et des trimestres à un chiffre:

  • NUMBER(5,0) prendrait 3 octets;
  • CHAR(5 CHARACTER) prendrait 5 octets;
  • VARCHAR2(5 CHARACTER) prendrait 6 octets; et
  • DATE prendrait 7 octets.

Donc, si l'on considère seulement la mémoire, un NUMBER(5,0) serait le plus efficace.

toutefois

Dès que vous commencez à faire de l'arithmétique sur l'année / trimestres stockés sous forme de nombres / chaînes, vous obtenez des problèmes de performance:

Par exemple, obtenir le prochain trimestre:

  • Si quarter est un type de données NUMBER alors vous pouvez utiliser: CASE WHEN MOD(quarter,10) = 4 THEN quarter + 7 ELSE quarter + 1 END mais cela ne gère pas quand vous voulez ajouter 5 quarts ou commencer à soustraire des quarts puis la logique commence à devenir beaucoup plus compliquée.
  • Si quarter est un type de données CHAR vous pouvez le convertir en un nombre ou une date et utiliser l'une ou l'autre de ces méthodes (la manipulation de chaîne n'est pas susceptible d'être performante).
  • Si quarter est une DATE il suffit d'utiliser ADD_MONTHS( quarter, 3 ) .

La méthode DATE est auto-documentée et existe déjà alors que la méthode NUMBER deviendrait une fonction personnalisée pour votre approximation d'un type de données QUARTER et une fois que vous aurez implémenté toutes les fonctions de comparaison et de manipulation dont vous avez besoin, vous aurez réécrit efficacement le type de données DATE . un UDT pour les trimestres et ces fonctions seront moins performantes que les fonctions de date optimisées.

N'utilisez pas de types de données inappropriés - il suffit de stocker les dates sous forme de dates; les nombres en tant que nombres; et les chaînes comme une chaîne.





numbers