web-dev-qa-db-fra.com

Différence entre le type de données numérique et le nombre entier dans les vues de dictionnaire Oracle

J'ai utilisé les vues de dictionnaire Oracle pour déterminer les différences de colonne éventuelles entre deux schémas. Lors de la synchronisation des écarts de types de données, j'ai constaté que les types de données NUMBER et INTEGER étaient stockés dans all_tab_columns/user_tab_columns/dba_tab_columns en tant que NUMBER uniquement; .

Bien que la comparaison des schémas montre des incompatibilités de types de données. Indiquez s'il existe une autre forme de formulaire en dehors des vues de dictionnaire ou si des propriétés spécifiques à partir des vues de dictionnaire peuvent être utilisées pour déterminer si le type de données est un entier.

36
Anand

la meilleure explication que j'ai trouvée est la suivante:

Quelle est la différence entre INTEGER et NUMBER? Quand devrions-nous utiliser NUMBER et quand devrions-nous utiliser INTEGER? Je voulais juste mettre à jour mes commentaires ici ...

NUMBER stocke toujours comme nous sommes entrés. L'échelle va de -84 à 127. Mais INTEGER arrondit au nombre entier. L'échelle pour INTEGER est 0. INTEGER équivaut à NUMBER (38,0). Cela signifie que INTEGER est un nombre contraint. La décimale sera arrondie. Mais NUMBER n'est pas contraint.

  • INTEGER (12,2) => 12
  • INTEGER (12.5) => 13
  • ENTIER (12.9) => 13
  • ENTIER (12.4) => 12
  • NUMBER (12,2) => 12,2
  • NUMBER (12.5) => 12.5
  • NUMBER (12.9) => 12.9
  • NUMBER (12.4) => 12.4

INTEGER est toujours plus lent que NUMBER. Puisque entier est un nombre avec contrainte supplémentaire. Il faut des cycles de processeur supplémentaires pour appliquer la contrainte. Je n'ai jamais observé de différence, mais il pourrait y avoir une différence lorsque nous chargeons plusieurs millions d'enregistrements dans la colonne INTEGER. Si nous devons nous assurer que les valeurs entrées sont des nombres entiers, INTEGER est la meilleure option. Sinon, nous pouvons nous en tenir au type de données NUMBER.

Voici le lien

21
MCSI

Integer n’est là que pour le standard SQL, c’est-à-dire obsolète par Oracle.

Vous devriez utiliser Number à la place.

Les entiers sont quand même stockés en tant que nombre par Oracle en coulisse.

Le plus souvent, lorsque les ints sont stockés pour des ID et qu’ils sont définis sans parametres - vous pouvez donc en théorie examiner les colonnes d’échelle et de précision des vues de métadonnées pour ne voir aucune valeur décimale stockée - mais 99% du temps, cette ne va pas aider.

Comme indiqué ci-dessus, vous pouvez rechercher un nombre (38,0) de colonnes ou similaire (c'est-à-dire des colonnes sans virgule décimale autorisée), mais cela vous indiquera uniquement quelles colonnes ne peuvent pas prendre de décimales, et non quelles colonnes ont été définies pour pouvoir stocker INTS. .

Suggestion: créer un profil de données sur le nombre de colonnes. Quelque chose comme ça:

 select max( case when trunc(column_name,0)=column_name then 0 else 1 end ) as has_dec_vals
 from table_name
16
Mathew Frank

Voici ce que j'ai reçu de documentation Oracle , mais c'est pour Oracle 10g version 2:

Lorsque vous définissez une variable NUMBER, vous pouvez spécifier sa précision (p) et son (ses) échelle (s) afin qu’elle soit suffisamment grande, mais pas inutilement. La précision est le nombre de chiffres significatifs. L'échelle peut être positive ou négative. L'échelle positive identifie le nombre de chiffres à droite du séparateur décimal; échelle négative identifie le nombre de chiffres à gauche de la virgule décimale pouvant être arrondis.

Le type de données [~ # ~] [~ # ~] est pris en charge par les bibliothèques standard Oracle Database et fonctionne de la même manière que dans SQL. Il est utilisé pour les cotes et les substituts lorsqu'un texte ou un type de données [~ # ~] entier [~ # ~] n'est pas approprié. Il est généralement attribué aux variables qui ne sont pas utilisées pour les calculs (comme les prévisions et les agrégations), ainsi que pour les variables qui doivent correspondre au comportement d'arrondi de la base de données ou requérir un degré de précision élevé. Lorsque vous décidez d'affecter le type de données NUMBER à une variable, tenez compte des points suivants pour optimiser les performances :

  • Les calculs de l'espace de travail analytique sur les variables NUMBER sont plus lents que les autres types de données numériques car les valeurs NUMBER sont calculées en logiciel (pour la précision) plutôt qu'en matériel (pour la vitesse).
  • Lorsque des données sont extraites d'un espace de travail analytique vers une colonne relationnelle ayant le type de données NUMBER, les performances sont optimales lorsque les données possèdent déjà le type de données NUMBER dans l'espace de travail analytique, car aucune étape de conversion n'est requise.
12
periback2