Suite

Comment puis-je changer un type de champ de table attributaire de chaîne en double dans QGIS ?

Comment puis-je changer un type de champ de table attributaire de chaîne en double dans QGIS ?


Je travaille sur QGIS 2.2 et je ne peux pas modifier ma table attributaire pour changer le type de champ de chaîne en double.

J'ai suivi plusieurs tutos. - Je ne peux pas exécuter le plugin du gestionnaire de tables, probablement parce que sa dernière version est pour qgis 2.0 (enfin, il semble cassé sur l'interface utilisateur de mon gestionnaire de plugins).

  • Je ne parviens pas à modifier ma couche pour pouvoir utiliser le calculateur de champ (comme plusieurs tutoriels l'ont stipulé).

  • Je ne connais pas python pour utiliser la console python


Pour ce faire, il est préférable de créer un autre champ de type Double et d'y copier le champ de chaîne. Par exemple, dans l'image suivante, j'ai créé le champ de chaîne "myString" (session d'édition) et j'y ai mis la valeur "5.78453". Vous pouvez corroborer que le type est une chaîne car il est aligné à gauche.

Dans l'image ci-dessous, on peut observer la création du champ "myDouble" (session d'édition) et le clonage de leurs valeurs à partir du champ "myString".

Après Enter, on peut observer que le champ 'myDouble' a été créé comme prévu (et le champ 'myString' peut être effacé).


En bref: C'est possible avec la commande alter column UNIQUEMENT si le type de données modifié est compatible avec une nouvellement modifiée. De plus, il est recommandé de le faire avec transaction.

Par exemple : vous pouvez changer une colonne d'un varchar(50) à un nvarchar(200), avec un script ci-dessous.

Éditer: Concernant votre erreur postée lors de la modification du type de colonne.

** Erreur lors de la conversion du type de données nvarchar en flottant. **

Une façon serait de créer une nouvelle colonne et de convertir tous les bons (convertible et compatible) enregistre dans une nouvelle colonne. Après cela, vous voudrez peut-être nettoyer les mauvais enregistrements qui ne sont pas convertis, supprimer l'ancienne colonne et renommer votre colonne nouvellement ajoutée et remplie avec le nom d'origine. Important: utilisez d'abord l'environnement de test pour toutes ces manipulations. Habituellement, jouer avec les tables de production s'avère être une mauvaise pratique pour tout foutre en l'air.

Les références pour rechercher plus de discussions sur des articles SE similaires :


Pour apporter des modifications à la base de données existante, vous pouvez modifier le type de colonne en utilisant change() dans la migration.

C'est ce que tu pourrais faire

s'il vous plaît noter que vous devez ajouter doctrine/dbal dépendance à composer.json pour plus d'informations, vous pouvez le trouver ici http://laravel.com/docs/5.1/migrations#modifying-columns

La solution standard n'a pas fonctionné pour moi, lors du changement de type de TEXTE à TEXTE LONG.

Cela pourrait être un problème de doctrine. Plus d'informations ici.

Une autre façon de procéder consiste à utiliser la méthode string() et à définir la valeur sur la longueur maximale du type de texte :

Solution 2018, encore d'autres réponses sont valables mais vous n'avez pas besoin d'utiliser de dépendance:

Vous devez d'abord créer une nouvelle migration :

Ensuite, dans ce fichier de migration up() , essayez :

Si vous ne modifiez pas la taille, la valeur par défaut sera varchar (191) mais si vous souhaitez modifier la taille du champ :

toutes les autres réponses sont correctes Mais Avant de courir

assurez-vous d'exécuter ce code en premier

RuntimeException : La modification des colonnes de la table "items" nécessite l'installation de Doctrine DBAL "doctrine/dbal".

Le premier compositeur requiert doctrine/dbal , puis :

Pas vraiment une réponse, mais juste une note à propos de ->change() :

Seuls les types de colonnes suivants peuvent être "modifiés": bigInteger, binary, boolean, date, dateTime, dateTimeTz, decimal, integer, json, longText, mediumText, smallInteger, string, text, time, unsignedBigInteger, unsignedInteger et unsignedSmallInteger.

Si votre colonne n'en fait pas partie, vous devrez soit supprimer la colonne, soit utiliser l'instruction alter comme mentionné dans d'autres réponses.


Puis-je modifier un champ privé en lecture seule en C# à l'aide de la réflexion ?

Je suis d'accord avec les autres réponses en ce sens que cela fonctionne généralement et surtout avec le commentaire d'E. Lippert selon lequel il ne s'agit pas d'un comportement documenté et donc d'un code à l'épreuve du temps.

Cependant, nous avons également remarqué un autre problème. Si vous exécutez votre code dans un environnement avec des autorisations restreintes, vous pouvez obtenir une exception.

Nous venons d'avoir un cas où notre code fonctionnait correctement sur nos machines, mais nous avons reçu une VerificationException lorsque le code s'exécutait dans un environnement restreint. Le coupable était un appel de réflexion à l'auteur d'un champ en lecture seule. Cela a fonctionné lorsque nous avons supprimé la restriction en lecture seule de ce champ.

Vous avez demandé pourquoi vous voudriez briser l'encapsulation comme ça.

J'utilise une classe d'assistance d'entité pour hydrater les entités. Cela utilise la réflexion pour obtenir toutes les propriétés d'une nouvelle entité vide, et fait correspondre le nom de la propriété/du champ à la colonne dans le jeu de résultats, et le définit à l'aide de propertyinfo.setvalue().

Je ne veux pas que quelqu'un d'autre puisse changer la valeur, mais je ne veux pas non plus faire tous les efforts pour personnaliser les méthodes d'hydratation du code pour chaque entité.

Mes nombreux procs stockés renvoient des ensembles de résultats qui ne correspondent pas directement aux tables ou aux vues, de sorte que les ORM de la génération de code ne font rien pour moi.

Je viens de passer une journée à corriger un bug surréaliste où les objets pouvaient ne pas être de leur propre type déclaré.

La modification du champ en lecture seule a fonctionné une fois. Mais si vous essayez de le modifier à nouveau, vous obtiendrez des situations comme celle-ci :

C'était sur le runtime Mono (moteur de jeu Unity).

Un autre moyen simple de le faire en utilisant unsafe (ou vous pouvez passer le champ à une méthode C via DLLImport et le définir là).

La réponse est oui, mais surtout :

Pourquoi voudriez-vous? Briser intentionnellement l'encapsulation me semble être une horriblement mauvaise idée.

Utiliser la réflexion pour modifier un champ en lecture seule ou constant revient à combiner la loi des conséquences imprévues avec la loi de Murphy.

Je veux juste ajouter que si vous avez besoin de faire ce genre de choses pour les tests unitaires, vous pouvez utiliser :

B) Vous aurez toujours besoin d'une instance PrivateObject, mais vous pouvez générer des objets "Accessor" avec Visual Studio. Comment : régénérer les accesseurs privés

Si vous définissez des champs privés d'un objet dans votre code en dehors des tests unitaires, ce serait un exemple de "odeur de code". Je pense que la seule autre raison pour laquelle vous voudriez le faire est peut-être si vous traitez avec un tiers bibliothèque et vous ne pouvez pas modifier le code de la classe cible. Même dans ce cas, vous voudrez probablement contacter le tiers, expliquer votre situation et voir s'il ne va pas de l'avant et modifier son code pour répondre à vos besoins.


6 réponses 6

En utilisant "Ajouter un fichier délimité par des virgules" au lieu du bouton de couche vectorielle, QGIS le lira avec des colonnes de nombres comme colonnes.
Une fenêtre de dialogue s'ouvrira dans laquelle vous pourrez changer le caractère de délimitation en deux points, point-virgule, tabulation ou autres.
Si le csv est destiné à être utilisé comme une table (pas une couche xy ou d'événement), vous devez demander Aucune géométrie.
Ici vous avez un exemple (désolé pour le langage bizarre).

Je l'ai fait (qgis 2.6) et tout s'est bien passé.
J'espère que cela t'aides.
Asie

merci pour la solution de contournement - fonctionne !

– robert tuw
25 novembre 14 à 14:58

le problème persiste en 2,18 ltr ainsi qu'en 3,4 ltr. et la réponse est toujours valable (@Asier). utilisez Ouvrir "Data Source Manager / Delimited Text" et spécifiez les paramètres en fonction des caractéristiques de votre fichier ! mais (!) Faites attention à un fichier csv propre. Je viens d'avoir une session de 2 heures car 1. une seule ligne de mes champs numériques contenait une valeur (numérique) vide (c'est-à-dire NoData) 2. la routine csv-export a ajouté 2 champs vides à mon csv à la fin du tableau. . résultant en un csv avec des valeurs de chaîne au lieu de nombres dans des champs numériques

– robert tuw
8 novembre 18 à 16:46

Enregistrez d'abord votre fichier/données Excel en tant que fichier .CSV.
Ouvrez QGIS, puis chargez votre carte de couche vectorielle que vous vouliez joindre à votre fichier .csv.
Chargez ensuite votre fichier .csv en tant que calque délimité par du texte.
Ensuite, cochez la case du format de fichier en tant que valeurs séparées par des virgules (CSV)
puis cochez la case Pas de géométrie (données d'attribut uniquement), cliquez sur OK
Cela ajoutera votre fichier CSV. Double-cliquez sur le fichier CSV, cliquez sur Champ et vous pouvez voir les données sous forme d'entiers, pas sous forme de chaîne. C'est ce que tu voulais.

Vous pouvez maintenant joindre le fichier CSV aux données de couche vectorielle en spécifiant votre couche d'entrée, votre couche de jointure et votre couche cible.
Lorsque vous cliquez sur OK, vos données sont jointes et vous pouvez à nouveau vérifier le champ et vous verrez vos colonnes souhaitées en tant qu'entiers. J'ai fait cette version QGIS 2.6

En effet, convertir un chaîne champ à réel ne semble plus fonctionner. C'est un bug ?

Mais vous pouvez créer un autre champ basé sur un champ existant. Définir le type et précision (si réel) et spécifiez le format avec la fonction adéquate (ici toreal() ). Voir la capture d'écran ci-dessous :

Ma valeur de chaîne est dans test champ et je le convertis en réel en myréaliste domaine.

bien - bien sûr, j'ai trouvé des "solutions de contournement". et finalement réussi à faire une importation, qui fonctionne (merci pour les entrées à tous ! ! ! - ma faute avait un premier retour/pause dans le fichier csvt :( ). <br> mais quand même - ce n'est pas exactement ma question initiale. qgis a produit une sortie csv via "Distance Matrix" et je serais vraiment heureux s'il pouvait aussi écrire un csvt. Sinon, je dois enseigner à mes étudiants comment gérer les solutions de contournement mentionnées ci-dessus. ce qui est ok - mais pas le moyen le plus simple, en effet.

– robert tuw
11 mars 14 à 12:10

@roberttuw, peut-être pourriez-vous modifier votre question d'origine avec ces informations et/ou sélectionner une meilleure réponse acceptée ?

– Simbamangu
15 février 15 à 10:17

Si tu glisser déposer le fichier csv dans le panneau Calques, tout fonctionne comme prévu ! (Testé avec QGIS 2.2.0, 2.0.1, 1.8.0 et 1.7.4)

La réponse de Sorin (importation en tant que fichier texte délimité, sans coordonnées X/Y) fonctionne correctement dans QGIS 2.8 (peut-être plus tard aussi) mais pas dans QGIS 2.16. Les valeurs numériques sont toujours traitées à tort comme du texte. Les solutions alternatives que j'ai vues (créer un fichier CSVT ou utiliser l'outil Defactor) sont TRÈS compliquées et potentiellement chronophages (par exemple, j'ai un tableau de santé publique avec une centaine de colonnes - à intervalles variables - vais-je vraiment m'asseoir et écrivez un en-tête CSVT avec chacun correctement étiqueté comme 'text', 'int' ou autre ?).

L'importation de données tabulaires est une opération de base et elle doit être aussi simple que possible pour maintenir la convivialité et l'attractivité de QGIS pour l'utilisateur non développeur qui souhaite simplement passer autant de temps que possible avec les données réelles, et non avec les solutions de contournement nécessaires pour y parvenir. ces données.

Puis-je faire appel à la communauté de développement QGIS pour faire de la simplification de cette opération une priorité ?

Je ne sais pas comment 'lever un ticket', donc, si cela est nécessaire, j'apprécierais de l'aide.

à droite - cela ne fonctionne toujours pas correctement en 2.18 et en 3.4 (!) . si vous avez excel sur votre machine, vous pouvez ouvrir le csv avec excel et l'enregistrer sous xls ou xlsx. s'il n'y a pas de non-concordance de type (comme txt, NoData ou des blancs dans des champs numériques, des champs ou des lignes vides), vous obtiendrez un xls (x) qui fonctionnera comme entrée dans 2.18 et 3.4. et si vous avez vraiment vraiment besoin d'un csv + csvt, vous pouvez exporter cette table avec qgis export et créer un csvt valide en définissant l'option d'exportation correspondante)

– robert tuw
9 novembre 18 à 7:43

Le format correct pour le fichier csv est d'avoir comme délimiteur, avec , comme délimiteur du fichier csvt. Cela semble être ce qui ne va pas avec votre exemple.


BOOL et BOOLEAN sont des synonymes de TINYINT dans MySQL. Voir la documentation MySQL : Présentation du type numérique

Vous voudrez probablement utiliser le type de données BIT.

MySQL ne prend pas en charge les vrais booléens selon le SQL standard. Il utilise les valeurs entières 1 et 0 respectivement pour vrai et faux. Il prend en charge les mots-clés true et false , mais ceux-ci sont mappés aux valeurs entières.

Ils sont vraiment mappés sur des entiers :

Cela signifie que certaines expressions sont plus simples dans MySQL, comme compter les lignes où une certaine valeur est vraie est aussi simple que SUM() d'une expression booléenne, qui sera 1 là où la condition est vraie et 0 sinon.

Le SQL standard ne prend pas en charge cette utilisation des booléens en tant qu'entiers et nécessiterait le plus détaillé :

Comme d'autres réponses l'ont déjà noté, vous pouvez utiliser un alias de type de données BOOL mais il est immédiatement remplacé par TINYINT(1) (MySQL fait quelque chose de similaire avec d'autres types de données, comme REAL et SERIAL ).


Comment puis-je changer un type de champ de table attributaire de chaîne en double dans QGIS ? - Systèmes d'information géographique

Ce chapitre fournit une introduction aux objets de schéma et traite des tableaux, qui sont les types d'objets de schéma les plus courants.

Ce chapitre contient les sections suivantes:

Introduction aux objets de schéma

Un schéma de base de données est un conteneur logique pour les structures de données, appelées objets de schéma. Des exemples d'objets de schéma sont les tables et les index. Vous créez et manipulez des objets de schéma avec SQL.

Un compte d'utilisateur de base de données a un mot de passe et des privilèges de base de données spécifiques. Chaque compte utilisateur possède un schéma unique, qui porte le même nom que l'utilisateur. Le schéma contient les données de l'utilisateur propriétaire du schéma. Par exemple, le compte utilisateur hr possède le schéma hr, qui contient des objets de schéma tels que la table des employés. Dans une base de données de production, le propriétaire du schéma représente généralement une application de base de données plutôt qu'une personne.

Dans un schéma, chaque objet de schéma d'un type particulier a un nom unique. Par exemple, hr.employees fait référence à la table employee dans le schéma hr. La figure 2-1 illustre un propriétaire de schéma nommé hr et des objets de schéma dans le schéma hr.

Cette section contient les sujets suivants :

"Présentation de la sécurité de la base de données" pour en savoir plus sur les utilisateurs et les privilèges

Types d'objets de schéma

Oracle SQL vous permet de créer et de manipuler de nombreux autres types d'objets de schéma.

Les principaux types d'objets de schéma sont indiqués dans le tableau suivant.

Une table stocke les données dans des lignes. Les tables sont les objets de schéma les plus importants dans une base de données relationnelle.

Les index sont des objets de schéma qui contiennent une entrée pour chaque ligne indexée de la table ou du cluster de tables et fournissent un accès direct et rapide aux lignes. Oracle Database prend en charge plusieurs types d'index. Une table organisée en index est une table dans laquelle les données sont stockées dans une structure d'index.

Les partitions sont des morceaux de grandes tables et index. Chaque partition a son propre nom et peut éventuellement avoir ses propres caractéristiques de stockage.

Les vues sont des présentations personnalisées de données dans un ou plusieurs tableaux ou autres vues. Vous pouvez les considérer comme des requêtes stockées. Les vues ne contiennent pas réellement de données.

Une séquence est un objet créé par l'utilisateur qui peut être partagé par plusieurs utilisateurs pour générer des entiers. En règle générale, vous utilisez des séquences pour générer des valeurs de clé primaire.

Une dimension définit une relation parent-enfant entre des paires d'ensembles de colonnes, où toutes les colonnes d'un ensemble de colonnes doivent provenir de la même table. Les dimensions sont couramment utilisées pour catégoriser des données telles que les clients, les produits et le temps.

Un synonyme est un alias pour un autre objet de schéma. Parce qu'un synonyme est simplement un alias, il ne nécessite aucun stockage autre que sa définition dans le dictionnaire de données .

Sous-programmes et packages PL/SQL

PL/SQL est l'extension procédurale Oracle de SQL. Un sous-programme PL/SQL est un bloc PL/SQL nommé qui peut être invoqué avec un ensemble de paramètres. Un package PL/SQL regroupe des types, des variables et des sous-programmes PL/SQL logiquement liés.

D'autres types d'objets sont également stockés dans la base de données et peuvent être créés et manipulés avec des instructions SQL mais ne sont pas contenus dans un schéma. Ces objets incluent le compte d'utilisateur de la base de données, les rôles, les contextes et les objets de dictionnaire.

Guide de l'administrateur de base de données Oracle pour apprendre à gérer les objets de schéma

Oracle Database SQL Language Reference pour en savoir plus sur les objets de schéma et les objets de base de données

Stockage d'objets de schéma

Certains objets de schéma stockent des données dans un type de structure de stockage logique appelé segment. Par exemple, une table organisée en tas non partitionnée ou un index crée un segment.

Les autres objets de schéma, tels que les vues et les séquences, sont constitués uniquement de métadonnées. Cette rubrique décrit uniquement les objets de schéma qui ont des segments.

Oracle Database stocke un objet de schéma de manière logique dans un tablespace . Il n'y a aucune relation entre les schémas et les tablespaces : un tablespace peut contenir des objets de différents schémas, et les objets d'un schéma peuvent être contenus dans différents tablespaces. Les données de chaque objet sont physiquement contenues dans un ou plusieurs fichiers de données.

La figure suivante montre une configuration possible de segments de table et d'index, d'espaces de table et de fichiers de données. Le segment de données d'une table s'étend sur deux fichiers de données, qui font tous deux partie du même tablespace. Un segment ne peut pas s'étendre sur plusieurs tablespaces.

Figure 2-2 Segments, tablespaces et fichiers de données

"Logical Storage Structures" pour en savoir plus sur les tablespaces et les segments

Guide de l'administrateur de base de données Oracle pour apprendre à gérer le stockage des objets de schéma

Dépendances d'objet de schéma

Certains objets de schéma font référence à d'autres objets, créant une dépendance d'objet de schéma .

Par exemple, une vue contient une requête qui référence des tables ou des vues, tandis qu'un sous-programme PL/SQL appelle d'autres sous-programmes. Si la définition de l'objet A fait référence à l'objet B, alors A est un objet dépendant de B et B est un objet référencé pour A.

Oracle Database fournit un mécanisme automatique pour garantir qu'un objet dépendant est toujours à jour par rapport à ses objets référencés. Lorsque vous créez un objet dépendant, la base de données suit les dépendances entre l'objet dépendant et ses objets référencés. Lorsqu'un objet référencé change d'une manière susceptible d'affecter un objet dépendant, la base de données marque l'objet dépendant comme non valide. Par exemple, si un utilisateur supprime une table, aucune vue basée sur la table supprimée n'est utilisable.

Un objet dépendant non valide doit être recompilé par rapport à la nouvelle définition d'un objet référencé avant que l'objet dépendant ne soit utilisable. La recompilation se produit automatiquement lorsque l'objet dépendant non valide est référencé.

Pour illustrer comment les objets de schéma peuvent créer des dépendances, l'exemple de script suivant crée une table test_table, puis une procédure qui interroge cette table :

La requête suivante du statut de la procédure test_proc montre qu'elle est valide :

Après avoir ajouté la colonne col3 à test_table , la procédure est toujours valide car la procédure n'a aucune dépendance sur cette colonne :

Cependant, changer le type de données de la colonne col1, dont dépend la procédure test_proc, invalide la procédure :

L'exécution ou la recompilation de la procédure la rend à nouveau valide, comme illustré dans l'exemple suivant :

Schémas SYS et SYSTEM

Toutes les bases de données Oracle incluent des comptes administratifs par défaut.

Les comptes administratifs sont hautement privilégiés et sont destinés uniquement aux administrateurs de bases de données autorisés à effectuer des tâches telles que le démarrage et l'arrêt de la base de données, la gestion de la mémoire et du stockage, la création et la gestion des utilisateurs de la base de données, etc.

Le compte administratif SYS est automatiquement créé lors de la création d'une base de données. Ce compte peut exécuter toutes les fonctions administratives de la base de données. Le schéma SYS stocke les tables de base et les vues du dictionnaire de données. Ces tables et vues de base sont essentielles au fonctionnement d'Oracle Database.Les tables du schéma SYS ne sont manipulées que par la base de données et ne doivent jamais être modifiées par aucun utilisateur.

Le compte administrateur SYSTEM est également automatiquement créé lors de la création d'une base de données. Le schéma SYSTEM stocke des tables et des vues supplémentaires qui affichent des informations administratives, ainsi que des tables et vues internes utilisées par divers outils et options de base de données Oracle. N'utilisez jamais le schéma SYSTEM pour stocker des tables d'intérêt pour les utilisateurs non administratifs.

Guide de l'administrateur de base de données Oracle pour en savoir plus sur SYS , SYSTEM et d'autres comptes administratifs

Exemples de schémas

Une base de données Oracle peut inclure exemples de schémas, qui sont un ensemble de schémas interconnectés qui permettent à la documentation Oracle et aux supports pédagogiques Oracle d'illustrer les tâches de base de données courantes.

L'exemple de schéma hr contient des informations sur les employés, les services et les emplacements, les historiques de travail, etc. L'illustration suivante présente un diagramme entité-relation des tables dans hr . La plupart des exemples de ce manuel utilisent des objets de ce schéma.

Oracle Database Sample Schemas pour apprendre à installer les exemples de schémas

Aperçu des tableaux

Une table est l'unité de base de l'organisation des données dans une base de données Oracle.

Un tableau décrit une entité, ce qui est quelque chose d'important sur lequel des informations doivent être enregistrées. Par exemple, un employé peut être une entité.

Les tables de la base de données Oracle appartiennent aux catégories de base suivantes :

Les tables relationnelles ont des colonnes simples et sont le type de table le plus courant. L'exemple 2-1 montre une instruction CREATE TABLE pour une table relationnelle.

Les colonnes correspondent aux attributs de niveau supérieur d'un type d'objet . Voir "Présentation des tables d'objets" .

Vous pouvez créer une table relationnelle avec les caractéristiques organisationnelles suivantes :

Une table organisée en tas ne stocke pas les lignes dans un ordre particulier. L'instruction CREATE TABLE crée par défaut une table organisée en tas.

Une table organisée en index classe les lignes en fonction des valeurs de clé primaire. Pour certaines applications, les tables organisées en index améliorent les performances et utilisent l'espace disque plus efficacement. Voir "Présentation des tables organisées en index".

Une table externe est une table en lecture seule dont les métadonnées sont stockées dans la base de données mais dont les données sont stockées en dehors de la base de données. Voir "Présentation des tables externes" .

Une table est soit permanente, soit temporaire. Une définition de table permanente et des données persistent d'une session à l'autre. Une définition de table temporaire persiste de la même manière qu'une définition de table permanente, mais les données n'existent que pour la durée d'une transaction ou d'une session . Les tables temporaires sont utiles dans les applications où un jeu de résultats doit être conservé temporairement, peut-être parce que le résultat est construit en exécutant plusieurs opérations.

Ce sujet contient les sujets suivants :

Colonnes

Une définition de table comprend un nom de table et un ensemble de colonnes.

Une colonne identifie un attribut de l'entité décrite par la table. Par exemple, la colonne employee_id dans la table des employés fait référence à l'attribut d'ID d'employé d'une entité d'employé.

En général, vous donnez à chaque colonne un nom de colonne, un type de données et une largeur lorsque vous créez un tableau. Par exemple, le type de données pour employee_id est NUMBER(6) , indiquant que cette colonne ne peut contenir que des données numériques d'une largeur maximale de 6 chiffres. La largeur peut être prédéterminée par le type de données, comme avec DATE .

Colonnes virtuelles

Un tableau peut contenir un colonne virtuelle, qui contrairement à une colonne non virtuelle ne consomme pas d'espace disque.

La base de données dérive les valeurs d'une colonne virtuelle à la demande en calculant un ensemble d'expressions ou de fonctions spécifiées par l'utilisateur. Par exemple, le revenu de la colonne virtuelle pourrait être une fonction des colonnes salaire et commission_pct.

Guide de l'administrateur de base de données Oracle pour apprendre à gérer les colonnes virtuelles

Colonnes invisibles

Une colonne invisible est une colonne spécifiée par l'utilisateur dont les valeurs ne sont visibles que lorsque la colonne est explicitement spécifiée par son nom. Vous pouvez ajouter une colonne invisible à une table sans affecter les applications existantes, et rendre la colonne visible si nécessaire.

En général, les colonnes invisibles aident à migrer et à faire évoluer les applications en ligne. Un cas d'utilisation peut être une application qui interroge une table à trois colonnes avec une instruction SELECT *. L'ajout d'une quatrième colonne à la table interromprait l'application, qui attend trois colonnes de données. L'ajout d'une quatrième colonne invisible permet à l'application de fonctionner normalement. Un développeur peut ensuite modifier l'application pour gérer une quatrième colonne et rendre la colonne visible lorsque l'application est mise en ligne.

L'exemple suivant crée une table products avec un nombre de colonnes invisibles , puis rend la colonne invisible visible :

Oracle Database Administrator's Guide pour apprendre à gérer les colonnes invisibles

Oracle Database SQL Language Reference pour plus d'informations sur les colonnes invisibles

Une ligne est une collection d'informations de colonne correspondant à un enregistrement dans une table.

Par exemple, une ligne dans la table des employés décrit les attributs d'un employé spécifique : ID d'employé, nom, prénom, etc. Après avoir créé une table, vous pouvez insérer, interroger, supprimer et mettre à jour des lignes à l'aide de SQL.

Exemple : instructions CREATE TABLE et ALTER TABLE

L'instruction Oracle SQL pour créer une table est CREATE TABLE .

Exemple 2-1 Employés CREATE TABLE

L'exemple suivant montre l'instruction CREATE TABLE pour la table des employés dans l'exemple de schéma hr. L'instruction spécifie des colonnes telles que employee_id , first_name , etc., en spécifiant un type de données tel que NUMBER ou DATE pour chaque colonne.

Exemple 2-2 Employés ALTER TABLE

L'exemple suivant montre une instruction ALTER TABLE qui ajoute des contraintes d'intégrité à la table des employés. Les contraintes d'intégrité appliquent les règles métier et empêchent la saisie d'informations non valides dans les tables.

Exemple 2-3 Lignes dans le tableau des employés

L'exemple de sortie suivant montre 8 lignes et 6 colonnes de la table hr.employees.

La sortie précédente illustre certaines des caractéristiques importantes suivantes des tables, des colonnes et des lignes :

Une ligne du tableau décrit les attributs d'un employé : nom, salaire, service, etc. Par exemple, la première ligne de la sortie affiche l'enregistrement de l'employé nommé Steven King.

Une colonne décrit un attribut de l'employé. Dans l'exemple, la colonne employee_id est la clé primaire , ce qui signifie que chaque employé est identifié de manière unique par son ID d'employé. Deux employés sont assurés de ne pas avoir le même identifiant d'employé.

Une colonne non-clé peut contenir des lignes avec des valeurs identiques. Dans l'exemple, la valeur du salaire pour les employés 101 et 102 est la même : 17000 .

Une colonne de clé étrangère fait référence à une clé primaire ou unique dans la même table ou une table différente. Dans cet exemple, la valeur 90 dans department_id correspond à la colonne department_id de la table des départements.

Un champ est l'intersection d'une ligne et d'une colonne. Il ne peut contenir qu'une seule valeur. Par exemple, le champ de l'ID de service de l'employé 103 contient la valeur 60 .

Un champ peut manquer de valeur. Dans ce cas, le champ est dit contenir une valeur nulle. La valeur de la colonne commission_pct pour l'employé 100 est nulle, alors que la valeur du champ pour l'employé 149 est .2 . Une colonne autorise les valeurs NULL à moins qu'une contrainte d'intégrité NOT NULL ou de clé primaire n'ait été définie sur cette colonne, auquel cas aucune ligne ne peut être insérée sans valeur pour cette colonne.

Oracle Database SQL Language Reference pour la syntaxe et la sémantique CREATE TABLE

Types de données Oracle

Chaque colonne a un type de données , qui est associé à un format de stockage, des contraintes et une plage de valeurs valides spécifiques. Le type de données d'une valeur associe un ensemble fixe de propriétés à la valeur.

Ces propriétés amènent Oracle Database à traiter les valeurs d'un type de données différemment des valeurs d'un autre. Par exemple, vous pouvez multiplier les valeurs du type de données NUMBER, mais pas les valeurs du type de données RAW.

Lorsque vous créez une table, vous devez spécifier un type de données pour chacune de ses colonnes. Chaque valeur insérée par la suite dans une colonne suppose le type de données de la colonne.

Oracle Database fournit plusieurs types de données intégrés. Les types de données les plus couramment utilisés appartiennent aux catégories suivantes :

D'autres catégories importantes de types intégrés incluent les objets bruts, volumineux (LOB) et les collections. PL/SQL a des types de données pour les constantes et les variables, qui incluent BOOLEAN , les types référence, les types composites (enregistrements) et les types définis par l'utilisateur.

Oracle Database SQL Language Reference pour en savoir plus sur les types de données SQL intégrés

Oracle Database Development Guide pour apprendre à utiliser les types de données intégrés

Types de données de caractères

Les types de données caractère stockent les données alphanumériques dans des chaînes. Le type de données de caractères le plus courant est VARCHAR2 , qui est l'option la plus efficace pour stocker des données de caractères.

Les valeurs des octets correspondent au schéma de codage des caractères, généralement appelé jeu de caractères . Le jeu de caractères de la base de données est établi lors de la création de la base de données. Des exemples de jeux de caractères sont ASCII 7 bits, EBCDIC et Unicode UTF-8.

La sémantique de longueur des types de données caractère est mesurable en octets ou en caractères. Le traitement des chaînes comme une séquence d'octets est appelé sémantique des octets. Il s'agit de la valeur par défaut pour les types de données caractère. Le traitement des chaînes comme une séquence de caractères est appelé sémantique des caractères. Un caractère est un point de code du jeu de caractères de la base de données.

Oracle Database 2 Day Developer's Guide pour une brève introduction aux types de données

Oracle Database Development Guide pour apprendre à choisir un type de données caractère

Types de données VARCHAR2 et CHAR

Par exemple, 'LILA' , 'St. George Island' et '101' sont tous des caractères littéraux 5001 est un littéral numérique. Les caractères littéraux sont placés entre guillemets simples afin que la base de données puisse les distinguer des noms d'objet de schéma.

Ce manuel utilise les termes littéral de texte , littéral de caractère et chaîne de manière interchangeable.

Lorsque vous créez une table avec une colonne VARCHAR2, vous spécifiez une longueur de chaîne maximale. Dans l'exemple 2-1, la colonne last_name a un type de données VARCHAR2(25) , ce qui signifie que tout nom stocké dans la colonne a un maximum de 25 octets.

Pour chaque ligne, Oracle Database stocke chaque valeur dans la colonne sous forme de champ de longueur variable, sauf si une valeur dépasse la longueur maximale, auquel cas la base de données renvoie une erreur. Par exemple, dans un jeu de caractères à un octet, si vous entrez 10 caractères pour la valeur de colonne last_name dans une ligne, la colonne de la ligne ne stocke que 10 caractères (10 octets), et non 25. L'utilisation de VARCHAR2 réduit la consommation d'espace.

Contrairement à VARCHAR2 , CHAR stocke des chaînes de caractères de longueur fixe. Lorsque vous créez une table avec une colonne CHAR, la colonne nécessite une longueur de chaîne. La valeur par défaut est 1 octet. La base de données utilise des blancs pour remplir la valeur à la longueur spécifiée.

Oracle Database compare les valeurs VARCHAR2 à l'aide d'une sémantique de comparaison non complétée et compare les valeurs CHAR à l'aide d'une sémantique de comparaison complétée par des blancs.

Oracle Database SQL Language Reference pour plus d'informations sur la sémantique de comparaison avec et sans remplissage

Types de données NCHAR et NVARCHAR2

Unicode est un jeu de caractères codés universel qui peut stocker des informations dans n'importe quelle langue à l'aide d'un seul jeu de caractères. NCHAR stocke des chaînes de caractères de longueur fixe qui correspondent au jeu de caractères national, tandis que NVARCHAR2 stocke des chaînes de caractères de longueur variable.

Vous spécifiez un jeu de caractères national lors de la création d'une base de données. Le jeu de caractères des types de données NCHAR et NVARCHAR2 doit être AL16UTF16 ou UTF8 . Les deux jeux de caractères utilisent le codage Unicode.

Lorsque vous créez une table avec une colonne NCHAR ou NVARCHAR2, la taille maximale est toujours en sémantique de longueur de caractère. La sémantique de longueur de caractère est la sémantique de longueur par défaut et unique pour NCHAR ou NVARCHAR2 .

Oracle Database Globalization Support Guide pour plus d'informations sur la fonction de prise en charge de la globalisation d'Oracle

Types de données numériques

Les types de données numériques Oracle Database stockent des nombres à virgule fixe et flottante, zéro et infini. Certains types numériques stockent également des valeurs qui sont le résultat indéfini d'une opération, appelée "pas un nombre" ou NaN .

Oracle Database stocke les données numériques au format de longueur variable. Chaque valeur est stockée en notation scientifique, avec 1 octet utilisé pour stocker l'exposant. La base de données utilise jusqu'à 20 octets pour stocker la mantisse , qui est la partie d'un nombre à virgule flottante qui contient ses chiffres significatifs. Oracle Database ne stocke pas les zéros de début et de fin.

NOMBRE Type de données

Le type de données NUMBER stocke les nombres à virgule fixe et flottante. La base de données peut stocker des nombres de pratiquement n'importe quelle grandeur. Ces données sont garanties d'être portables entre différents systèmes d'exploitation exécutant Oracle Database. Le type de données NUMBER est recommandé dans la plupart des cas où vous devez stocker des données numériques.

Vous spécifiez un nombre à virgule fixe sous la forme NOMBRE ( p , s ) , où p et s font référence aux caractéristiques suivantes :

La précision spécifie le nombre total de chiffres. Si aucune précision n'est spécifiée, la colonne stocke les valeurs exactement telles que fournies par l'application sans aucun arrondi.

L'échelle spécifie le nombre de chiffres de la virgule au chiffre le moins significatif. L'échelle positive compte les chiffres à droite de la virgule jusqu'au chiffre le moins significatif inclus. L'échelle négative compte les chiffres à gauche de la virgule décimale jusqu'au chiffre le moins significatif mais non compris. Si vous spécifiez une précision sans échelle, comme dans NUMBER(6) , l'échelle est 0.

Dans l'exemple 2-1, la colonne salaire est de type NUMBER(8,2) , la précision est donc de 8 et l'échelle est 2. Ainsi, la base de données stocke un salaire de 100 000 sous la forme 100000.00 .

Nombres à virgule flottante

Oracle Database fournit deux types de données numériques exclusivement pour les nombres à virgule flottante : BINARY_FLOAT et BINARY_DOUBLE .

Ces types prennent en charge toutes les fonctionnalités de base fournies par le type de données NUMBER. Cependant, alors que NUMBER utilise une précision décimale, BINARY_FLOAT et BINARY_DOUBLE utilisent une précision binaire, ce qui permet des calculs arithmétiques plus rapides et réduit généralement les besoins de stockage.

BINARY_FLOAT et BINARY_DOUBLE sont des types de données numériques approximatifs. Ils stockent des représentations approximatives de valeurs décimales, plutôt que des représentations exactes. Par exemple, la valeur 0.1 ne peut pas être exactement représentée par BINARY_DOUBLE ou BINARY_FLOAT . Ils sont fréquemment utilisés pour des calculs scientifiques. Leur comportement est similaire aux types de données FLOAT et DOUBLE en Java et XMLSchema.

Oracle Database SQL Language Reference pour en savoir plus sur la précision, l'échelle et d'autres caractéristiques des types numériques

Types de données date/heure

Les types de données datetime sont DATE et TIMESTAMP . Oracle Database fournit une prise en charge complète des fuseaux horaires pour les horodatages.

DATE Type de données

Le type de données DATE stocke la date et l'heure. Bien que les dates/heures puissent être représentées sous forme de types de données caractère ou nombre, DATE possède des propriétés associées spéciales.

La base de données stocke les dates en interne sous forme de nombres. Les dates sont stockées dans des champs de longueur fixe de 7 octets chacun, correspondant au siècle, à l'année, au mois, au jour, à l'heure, à la minute et à la seconde.

Les dates prennent entièrement en charge les opérations arithmétiques, vous pouvez donc ajouter et soustraire des dates comme vous le pouvez avec des nombres.

La base de données affiche les dates selon le modèle de format spécifié. Un modèle de format est un littéral de caractère qui décrit le format d'une date/heure dans une chaîne de caractères. Le format de date standard est DD-MON-RR , qui affiche les dates sous la forme 01-JAN-11 .

RR est similaire à YY (les deux derniers chiffres de l'année), mais le siècle de la valeur de retour varie en fonction de l'année à deux chiffres spécifiée et des deux derniers chiffres de l'année en cours. Supposons qu'en 1999 la base de données affiche 01-JAN-11 . Si le format de date utilise RR , alors 11 spécifie 2011 , alors que si le format utilise YY , alors 11 spécifie 1911 . Vous pouvez modifier le format de date par défaut au niveau de l'instance de base de données et de la session.

Oracle Database stocke l'heure au format 24 heures — HH:MI:SS . Si aucune partie de l'heure n'est saisie, l'heure par défaut dans un champ de date est 00:00:00 A.M . Dans une entrée de temps uniquement, la partie date est par défaut le premier jour du mois en cours.

Oracle Database Development Guide pour plus d'informations sur les siècles et les masques de format de date

Oracle Database SQL Language Reference pour plus d'informations sur les codes de format datetime

Oracle Database Development Guide pour apprendre à effectuer des opérations arithmétiques avec des types de données datetime

Type de données TIMESTAMP

Le type de données TIMESTAMP est une extension du type de données DATE.

TIMESTAMP stocke des fractions de seconde en plus des informations stockées dans le type de données DATE. Le type de données TIMESTAMP est utile pour stocker des valeurs temporelles précises, comme dans les applications qui doivent suivre l'ordre des événements.

Les types de données DATETIME TIMESTAMP WITH TIME ZONE et TIMESTAMP WITH LOCAL TIME ZONE prennent en compte le fuseau horaire. Lorsqu'un utilisateur sélectionne les données, la valeur est ajustée au fuseau horaire de la session utilisateur. Ce type de données est utile pour collecter et évaluer les informations de date dans toutes les régions géographiques.

Oracle Database SQL Language Reference pour plus d'informations sur la syntaxe de création et de saisie de données dans les colonnes d'horodatage

Types de données Rowid

Chaque ligne stockée dans la base de données a une adresse. Oracle Database utilise un type de données ROWID pour stocker l'adresse (rowid) de chaque ligne de la base de données.

Les Rowids appartiennent aux catégories suivantes :

Les rowids physiques stockent les adresses des lignes dans des tables organisées en tas, des clusters de tables et des partitions de table et d'index.

Les rowids logiques stockent les adresses des lignes dans des tables organisées en index.

Les rowids étrangers sont des identificateurs dans les tables étrangères, telles que les tables DB2 accessibles via une passerelle. Ce ne sont pas des rowids Oracle Database standard.

Un type de données appelé le rowid universel, ou urowid, prend en charge tous les types de rowids.

Utilisation de Rowids

Un index B-tree , qui est le type le plus courant, contient une liste ordonnée de clés divisées en plages. Chaque clé est associée à un rowid qui pointe vers l'adresse de la ligne associée pour un accès rapide.

Les utilisateurs finaux et les développeurs d'applications peuvent également utiliser les rowids pour plusieurs fonctions importantes :

Les Rowids sont le moyen le plus rapide d'accéder à des lignes particulières.

Les Rowids offrent la possibilité de voir comment une table est organisée.

Les Rowids sont des identifiants uniques pour les lignes d'une table donnée.

Vous pouvez également créer des tables avec des colonnes définies à l'aide du type de données ROWID. Par exemple, vous pouvez définir une table d'exceptions avec une colonne de type de données ROWID pour stocker les rowids des lignes qui violent les contraintes d'intégrité. Les colonnes définies à l'aide du type de données ROWID se comportent comme les autres colonnes de table : les valeurs peuvent être mises à jour, etc.

ROWID Pseudocolonne

Chaque table d'une base de données Oracle a une pseudo-colonne nommée ROWID .

Une pseudo-colonne se comporte comme une colonne de table, mais n'est pas réellement stockée dans la table. Vous pouvez sélectionner des pseudo-colonnes, mais vous ne pouvez pas insérer, mettre à jour ou supprimer leurs valeurs. Une pseudo-colonne est également similaire à une fonction SQL sans arguments. Les fonctions sans arguments renvoient généralement la même valeur pour chaque ligne du jeu de résultats, tandis que les pseudo-colonnes renvoient généralement une valeur différente pour chaque ligne.

Les valeurs de la pseudo-colonne ROWID sont des chaînes représentant l'adresse de chaque ligne.Ces chaînes ont le type de données ROWID . Cette pseudo-colonne n'est pas évidente lors de la liste de la structure d'une table en exécutant SELECT ou DESCRIBE , et la pseudo-colonne ne consomme pas d'espace. Cependant, le rowid de chaque ligne peut être récupéré avec une requête SQL en utilisant le mot réservé ROWID comme nom de colonne.

L'exemple suivant interroge la pseudo-colonne ROWID pour afficher l'ID de ligne de la ligne dans la table des employés pour l'employé 100 :

Oracle Database Development Guide pour apprendre à identifier les lignes par adresse

Modèles de format et types de données

Un modèle de format est un littéral de caractère qui décrit le format des données date/heure ou numériques stockées dans une chaîne de caractères. Un modèle de format ne modifie pas la représentation interne de la valeur dans la base de données.

Lorsque vous convertissez une chaîne de caractères en date ou en nombre, un modèle de format détermine comment la base de données interprète la chaîne. En SQL, vous pouvez utiliser un modèle de format comme argument des fonctions TO_CHAR et TO_DATE pour formater une valeur à renvoyer de la base de données ou pour formater une valeur à stocker dans la base de données.

L'instruction suivante sélectionne les salaires des employés du département 80 et utilise la fonction TO_CHAR pour convertir ces salaires en valeurs de caractères avec le format spécifié par le modèle de format numérique « 99 990,99 $ » :

L'exemple suivant met à jour une date d'embauche à l'aide de la fonction TO_DATE avec le masque de format 'YYYY MM DD' pour convertir la chaîne '1998 05 20' en valeur DATE :

Contraintes d'intégrité

Un contrainte d'intégrité est une règle nommée qui restreint les valeurs d'une ou plusieurs colonnes d'une table.

Les règles d'intégrité des données empêchent la saisie de données non valides dans les tables. De plus, des contraintes peuvent empêcher la suppression d'une table lorsque certaines dépendances existent.

Si une contrainte est activée, la base de données vérifie les données lors de leur saisie ou de leur mise à jour. Oracle Database empêche la saisie de données non conformes à la contrainte. Si une contrainte est désactivée, Oracle Database autorise les données non conformes à la contrainte à entrer dans la base de données.

Dans l'exemple 2-1, l'instruction CREATE TABLE spécifie des contraintes NOT NULL pour les colonnes last_name , email , hiring_date et job_id . Les clauses de contrainte identifient les colonnes et les conditions de la contrainte. Ces contraintes garantissent que les colonnes spécifiées ne contiennent aucune valeur NULL. Par exemple, une tentative d'insertion d'un nouvel employé sans ID de poste génère une erreur.

Vous pouvez créer une contrainte lorsque ou après avoir créé une table. Vous pouvez désactiver temporairement les contraintes si nécessaire. La base de données stocke les contraintes dans le dictionnaire de données.

« Intégrité des données » pour connaître les contraintes d'intégrité

"Présentation du dictionnaire de données" pour en savoir plus sur le dictionnaire de données

Oracle Database SQL Language Reference pour en savoir plus sur les clauses de contrainte SQL

Rangement des tables

Oracle Database utilise un segment de données dans un tablespace pour contenir les données de la table.

Un segment contient des extensions constituées de blocs de données. Le segment de données d'une table (ou segment de données de cluster, pour un cluster de table ) se trouve soit dans le tablespace par défaut du propriétaire de la table, soit dans un tablespace nommé dans l'instruction CREATE TABLE.

« Segments utilisateur » pour en savoir plus sur les types de segments et comment ils sont créés

Organisation de la table

Par défaut, une table est organisée sous forme de tas, ce qui signifie que la base de données place les lignes là où elles s'adaptent le mieux plutôt que dans un ordre spécifié par l'utilisateur. Ainsi, une table organisée en tas est une collection non ordonnée de lignes.

Les tables organisées en index utilisent un principe d'organisation différent.

Au fur et à mesure que les utilisateurs ajoutent des lignes, la base de données place les lignes dans le premier espace libre disponible dans le segment de données. Il n'est pas garanti que les lignes soient récupérées dans l'ordre dans lequel elles ont été insérées.

La table hr.departments est une table organisée en tas. Il comporte des colonnes pour l'ID du service, le nom, l'ID du responsable et l'ID de l'emplacement. Au fur et à mesure que les lignes sont insérées, la base de données les stocke là où elles se trouvent. Un bloc de données dans le segment de table peut contenir les lignes non ordonnées illustrées dans l'exemple suivant :

L'ordre des colonnes est le même pour toutes les lignes d'un tableau. La base de données stocke généralement les colonnes dans l'ordre dans lequel elles ont été répertoriées dans l'instruction CREATE TABLE, mais cet ordre n'est pas garanti. Par exemple, si une table a une colonne de type LONG , Oracle Database stocke toujours cette colonne en dernier dans la ligne. De plus, si vous ajoutez une nouvelle colonne à une table, la nouvelle colonne devient la dernière colonne stockée.

Une table peut contenir une colonne virtuelle qui, contrairement aux colonnes normales, ne consomme pas d'espace sur le disque. La base de données dérive les valeurs d'une colonne virtuelle à la demande en calculant un ensemble d'expressions ou de fonctions spécifiées par l'utilisateur. Vous pouvez indexer des colonnes virtuelles, collecter des statistiques sur celles-ci et créer des contraintes d'intégrité. Ainsi, les colonnes virtuelles ressemblent beaucoup aux colonnes non virtuelles.

Stockage en ligne

La base de données stocke les lignes dans des blocs de données. Chaque ligne d'un tableau contenant des données pour moins de 256 colonnes est contenue dans un ou plusieurs éléments de ligne.

Si possible, Oracle Database stocke chaque ligne sous la forme d'un élément de ligne . Cependant, si toutes les données de ligne ne peuvent pas être insérées dans un seul bloc de données, ou si une mise à jour d'une ligne existante fait que la ligne devient trop grande pour son bloc de données, la base de données stocke la ligne en utilisant plusieurs éléments de ligne.

Les lignes d'un cluster de tables contiennent les mêmes informations que les lignes des tables non cluster. De plus, les lignes d'un cluster de table contiennent des informations qui font référence à la clé de cluster à laquelle elles appartiennent.

"Data Block Format" pour en savoir plus sur les composants d'un bloc de données

Rowids of Row Pieces

UNE Rowid est effectivement une adresse physique de 10 octets d'une ligne.

Chaque ligne d'une table organisée en tas a un rowid unique à cette table qui correspond à l'adresse physique d'un élément de ligne. Pour les clusters de tables, les lignes de différentes tables qui se trouvent dans le même bloc de données peuvent avoir le même rowid.

Oracle Database utilise des rowids en interne pour la construction d'index. Par exemple, chaque clé d'un index B-tree est associée à un rowid qui pointe vers l'adresse de la ligne associée pour un accès rapide. Les rowids physiques fournissent l'accès le plus rapide possible à une ligne de table, permettant à la base de données de récupérer une ligne en une seule E/S.

"Rowid Format" pour en savoir plus sur la structure d'un rowid

"Vue d'ensemble des index B-Tree" pour en savoir plus sur les types et la structure des index B-tree

Stockage des valeurs nulles

Un null est l'absence d'une valeur dans une colonne. Les valeurs nulles indiquent des données manquantes, inconnues ou inapplicables.

Les valeurs NULL sont stockées dans la base de données s'ils se situent entre des colonnes contenant des valeurs de données. Dans ces cas, ils nécessitent 1 octet pour stocker la longueur de la colonne (zéro). Les valeurs NULL à la fin d'une ligne ne nécessitent aucun stockage car un nouvel en-tête de ligne signale que les colonnes restantes de la ligne précédente sont NULL. Par exemple, si les trois dernières colonnes d'une table sont nulles, aucune donnée n'est stockée pour ces colonnes.

Table de compression

La base de données peut utiliser la compression de table pour réduire la quantité de stockage requise pour la table.

La compression économise de l'espace disque, réduit l'utilisation de la mémoire dans le cache de la mémoire tampon de la base de données et, dans certains cas, accélère l'exécution des requêtes. La compression de table est transparente pour les applications de base de données.

Compression de table de base et compression de ligne avancée

La compression de table basée sur un dictionnaire fournit de bons taux de compression pour les tables organisées en tas.

Oracle Database prend en charge les types suivants de compression de table basée sur un dictionnaire :

Ce type de compression est destiné aux opérations de chargement en masse. La base de données ne compresse pas les données modifiées à l'aide du DML conventionnel. Vous devez utiliser les opérations INSERT de chemin direct, ALTER TABLE . . . Opérations MOVE ou redéfinition de table en ligne pour obtenir une compression de table de base.

Ce type de compression est destiné aux applications OLTP et compresse les données manipulées par toute opération SQL. La base de données atteint un taux de compression compétitif tout en permettant à l'application d'exécuter le DML en approximativement le même temps que le DML sur une table non compressée.

Pour les types de compression précédents, la base de données stocke les lignes compressées au format de ligne principal . Toutes les colonnes d'une ligne sont stockées ensemble, suivies de toutes les colonnes de la ligne suivante, et ainsi de suite. La base de données remplace les valeurs en double par une courte référence à une table de symboles stockée au début du bloc. Ainsi, les informations dont la base de données a besoin pour recréer les données non compressées sont stockées dans le bloc de données lui-même.

Les blocs de données compressés ressemblent beaucoup à des blocs de données normaux. La plupart des fonctionnalités et fonctions de base de données qui fonctionnent sur des blocs de données réguliers fonctionnent également sur des blocs compressés.

Vous pouvez déclarer la compression au niveau du tablespace, de la table, de la partition ou de la sous-partition. Si spécifié au niveau de l'espace table, toutes les tables créées dans l'espace table sont compressées par défaut.

Exemple 2-4 Compression au niveau de la table

L'instruction suivante applique une compression de ligne avancée à la table des commandes :

Exemple 2-5 Compression au niveau de la partition

L'exemple suivant d'instruction CREATE TABLE partielle spécifie une compression de ligne avancée pour une partition et une compression de table de base pour l'autre partition :

"Row Format" pour savoir comment les valeurs sont stockées dans une ligne

"Data Block Compression" pour en savoir plus sur le format des blocs de données compressés

"SQL*Loader" pour en savoir plus sur l'utilisation de SQL*Loader pour les charges de chemin direct

Compression colonnaire hybride

Avec la compression hybride en colonnes, la base de données stocke la même colonne pour un groupe de lignes ensemble. Le bloc de données ne stocke pas les données au format de ligne principale, mais utilise une combinaison de méthodes de ligne et de colonne.

Le stockage des données de colonne ensemble, avec le même type de données et des caractéristiques similaires, augmente considérablement les économies de stockage réalisées grâce à la compression. La base de données compresse les données manipulées par n'importe quelle opération SQL, bien que les niveaux de compression soient plus élevés pour les charges de chemin direct. Les opérations de base de données fonctionnent de manière transparente sur les objets compressés, aucune modification de l'application n'est donc requise.

La compression de colonnes hybride et le stockage de colonnes en mémoire (stockage de colonnes IM) sont étroitement liés. La principale différence est que la compression de colonne hybride optimise le stockage sur disque, tandis que le stockage de colonne IM optimise le stockage en mémoire.

« Zone en mémoire » pour en savoir plus sur le magasin de colonnes IM

Types de compression colonnaire hybride

Si votre stockage sous-jacent prend en charge la compression hybride en colonnes, vous pouvez spécifier différents types de compression, en fonction de vos besoins.

Les options de compression sont :

Ce type de compression est optimisé pour économiser de l'espace de stockage et est destiné aux applications d'entrepôt de données.

Ce type de compression est optimisé pour des niveaux de compression maximum et est destiné aux données historiques et aux données qui ne changent pas.

Hybrid Columnar Compression est optimisé pour les applications d'entreposage de données et d'aide à la décision sur le stockage Oracle Exadata. Oracle Exadata optimise les performances des requêtes sur les tables compressées à l'aide de la compression hybride en colonnes, en tirant parti de la puissance de traitement, de la mémoire et de la bande passante du réseau Infiniband qui font partie intégrante du serveur de stockage Oracle Exadata.

D'autres systèmes de stockage Oracle prennent en charge la compression hybride en colonnes et offrent les mêmes économies d'espace que sur le stockage Oracle Exadata, mais n'offrent pas le même niveau de performances de requête. Pour ces systèmes de stockage, la compression hybride en colonnes est idéale pour l'archivage dans la base de données des données plus anciennes auxquelles on accède rarement.

Unités de compression

La compression en colonnes hybride utilise une construction logique appelée unité de compression pour stocker un ensemble de lignes.

Lorsque vous chargez des données dans une table, la base de données stocke des groupes de lignes au format de colonnes, avec les valeurs de chaque colonne stockées et compressées ensemble. Une fois que la base de données a compressé les données de colonne pour un ensemble de lignes, la base de données ajuste les données dans l'unité de compression.

Par exemple, vous appliquez la compression en colonnes hybride à une table daily_sales. À la fin de chaque journée, vous remplissez le tableau avec les articles et le nombre vendu, l'ID de l'article et la date formant une clé primaire composite. Le tableau suivant présente un sous-ensemble des lignes de daily_sales .

Tableau 2-2 Exemple de tableau daily_sales

Supposons que ce sous-ensemble de lignes est stocké dans une unité de compression. Hybrid Columnar Compression stocke les valeurs de chaque colonne ensemble, puis utilise plusieurs algorithmes pour compresser chaque colonne. La base de données choisit les algorithmes en fonction de divers facteurs, notamment le type de données de la colonne, la cardinalité des valeurs réelles de la colonne et le niveau de compression choisi par l'utilisateur.

Comme le montre le graphique suivant, chaque unité de compression peut s'étendre sur plusieurs blocs de données. Les valeurs d'une colonne particulière peuvent ou non s'étendre sur plusieurs blocs.

Figure 2-4 Unité de compression

Si la compression hybride en colonnes ne permet pas d'économiser de l'espace, la base de données stocke les données au format DBMS_COMPRESSION.COMP_BLOCK. Dans ce cas, la base de données applique la compression OLTP aux blocs, qui résident dans un segment de compression en colonne hybride.

Oracle Database Licensing Information User Manual pour en savoir plus sur les exigences de licence pour la compression hybride en colonnes

Guide de l'administrateur de base de données Oracle pour apprendre à utiliser la compression hybride en colonnes

Oracle Database SQL Language Reference pour la syntaxe et la sémantique CREATE TABLE

DML et compression en colonne hybride

La compression en colonnes hybride a des implications pour le verrouillage des lignes dans différents types d'opérations DML.

Charges directes et inserts conventionnels

Lors du chargement de données dans une table qui utilise la compression hybride en colonnes, vous pouvez utiliser des insertions conventionnelles ou des charges de chemin direct. Les chargements de chemin direct verrouillent la table entière, ce qui réduit la concurrence.

Oracle Database 12c Release 2 (12.2) ajoute la prise en charge des insertions de tableaux conventionnels dans le format Hybrid Columnar Compression. Les avantages des inserts de matrice conventionnels sont :

Les lignes insérées utilisent des verrous au niveau de la ligne, ce qui augmente la simultanéité.

L'optimisation automatique des données (ADO) et la carte thermique prennent en charge la compression hybride en colonnes pour les stratégies au niveau des lignes. Ainsi, la base de données peut utiliser la compression hybride en colonnes pour les blocs éligibles même lorsque l'activité DML se produit sur d'autres parties du segment.

Lorsque l'application utilise des insertions de tableau conventionnelles, Oracle Database stocke les lignes en unités de compression lorsque les conditions suivantes sont remplies :

La table est stockée dans un tablespace ASSM.

Le niveau de compatibilité est 12.2.0.1 ou ultérieur.

La définition de table satisfait les contraintes de table Hybrid Columnar Compression existantes, y compris aucune colonne de type LONG et aucune dépendance de ligne.

Les inserts conventionnels génèrent des opérations de restauration et d'annulation. Ainsi, les unités de compression créées par l'instruction DML conventionnelle sont annulées ou validées avec le DML. La base de données effectue automatiquement la maintenance des index, tout comme pour les lignes stockées dans des blocs de données conventionnels.

Par défaut, la base de données verrouille toutes les lignes de l'unité de compression si une mise à jour ou une suppression est appliquée à une ligne de l'unité. Pour éviter ce problème, vous pouvez choisir d'activer le verrouillage au niveau des lignes pour une table. Dans ce cas, la base de données ne verrouille que les lignes affectées par l'opération de mise à jour ou de suppression.

Guide de l'administrateur de base de données Oracle pour apprendre à effectuer des insertions conventionnelles

Présentation des clusters de tables

UNE groupe de tables est un groupe de tables qui partagent des colonnes communes et stockent les données associées dans les mêmes blocs.

Lorsque les tables sont regroupées, un seul bloc de données peut contenir des lignes de plusieurs tables. Par exemple, un bloc peut stocker des lignes des tables des employés et des services plutôt que d'une seule table.

La clé de cluster est la ou les colonnes que les tables en cluster ont en commun. Par exemple, les tables des employés et des services partagent la colonne department_id. Vous spécifiez la clé de cluster lors de la création du cluster de tables et lors de la création de chaque table ajoutée au cluster de tables.

La valeur de clé de cluster est la valeur des colonnes de clé de cluster pour un ensemble particulier de lignes. Toutes les données qui contiennent la même valeur de clé de cluster, telles que department_id=20 , sont physiquement stockées ensemble. Chaque valeur de clé de cluster est stockée une seule fois dans le cluster et l'index de cluster, quel que soit le nombre de lignes de tables différentes contenant la valeur.

Par analogie, supposons qu'un responsable des ressources humaines ait deux bibliothèques : une avec des boîtes de dossiers d'employés et l'autre avec des boîtes de dossiers de service. Les utilisateurs demandent souvent les dossiers de tous les employés d'un service particulier. Pour faciliter la récupération, le gestionnaire réorganise toutes les boîtes dans une seule bibliothèque. Elle divise les boîtes par numéro de service. Ainsi, tous les dossiers des employés du département 20 et le dossier du département 20 lui-même se trouvent dans une boîte, les dossiers des employés du département 100 et le dossier du département 100 se trouvent dans une autre boîte, et ainsi de suite.

Envisagez de regrouper les tables lorsqu'elles sont principalement interrogées (mais non modifiées) et que les enregistrements des tables sont fréquemment interrogés ensemble ou joints. Étant donné que les clusters de tables stockent des lignes liées de différentes tables dans les mêmes blocs de données, les clusters de tables correctement utilisés offrent les avantages suivants par rapport aux tables non cluster :

Les E/S de disque sont réduites pour les jointures de tables en cluster.

Le temps d'accès s'améliore pour les jointures de tables en cluster.

Moins de stockage est requis pour stocker les données de table et d'index associées, car la valeur de la clé de cluster n'est pas stockée de manière répétée pour chaque ligne.

En règle générale, le regroupement des tables n'est pas approprié dans les situations suivantes :

Les tableaux sont régulièrement mis à jour.

Les tables nécessitent fréquemment une analyse complète de la table.

Les tables doivent être tronquées.

Présentation des clusters indexés

Un cluster d'index est un cluster de tables qui utilise un index pour localiser des données. L'index de cluster est un index B-tree sur la clé de cluster. Un index de cluster doit être créé avant que des lignes puissent être insérées dans des tables en cluster.

Exemple 2-6 Création d'un cluster de tables et d'un index associé

Supposons que vous créiez le cluster employee_departments_cluster avec la clé de cluster department_id , comme illustré dans l'exemple suivant :

Étant donné que la clause HASHKEYS n'est pas spécifiée, employee_departments_cluster est un cluster indexé. L'exemple précédent crée un index nommé idx_emp_dept_cluster sur la clé de cluster department_id .

Exemple 2-7 Création de tables dans un cluster indexé

Vous créez les tables des employés et des services dans le cluster, en spécifiant la colonne department_id comme clé de cluster, comme suit (les ellipses marquent l'endroit où va la spécification de colonne) :

Supposons que vous ajoutez des lignes aux tables des employés et des services. La base de données stocke physiquement toutes les lignes pour chaque département des tables des employés et des départements dans les mêmes blocs de données. La base de données stocke les lignes dans un tas et les localise avec l'index.

La figure 2-5 montre le cluster de tables employee_departments_cluster, qui contient les employés et les services . La base de données stocke les lignes des employés du département 20 ensemble, du département 110 ensemble, et ainsi de suite. Si les tables ne sont pas groupées, la base de données ne garantit pas que les lignes associées sont stockées ensemble.

Figure 2-5 Données de table groupées

L'index de cluster B-tree associe la valeur de clé de cluster à l'adresse de bloc de base de données (DBA) du bloc contenant les données.Par exemple, l'entrée d'index de la clé 20 indique l'adresse du bloc qui contient les données des employés du département 20 :

L'index de cluster est géré séparément, tout comme un index sur une table non cluster, et peut exister dans un tablespace distinct du cluster de table.

Oracle Database Administrator's Guide pour apprendre à créer et à gérer des clusters indexés

Oracle Database SQL Language Reference pour la syntaxe et la sémantique CREATE CLUSTER

Présentation des clusters de hachage

Un cluster de hachage est comme un cluster indexé, sauf que la clé d'index est remplacée par une fonction de hachage . Il n'existe aucun index de cluster distinct. Dans un cluster de hachage, les données sont l'index.

Avec une table indexée ou un cluster indexé, Oracle Database localise les lignes de la table à l'aide de valeurs de clé stockées dans un index séparé. Pour rechercher ou stocker une ligne dans une table indexée ou un cluster de tables, la base de données doit effectuer au moins deux E/S :

Une ou plusieurs E/S pour rechercher ou stocker la valeur de la clé dans l'index

Une autre E/S pour lire ou écrire la ligne dans la table ou le cluster de tables

Pour rechercher ou stocker une ligne dans un cluster de hachage, Oracle Database applique la fonction de hachage à la valeur de clé de cluster de la ligne. La valeur de hachage résultante correspond à un bloc de données dans le cluster, que la base de données lit ou écrit au nom de l'instruction émise.

Le hachage est un moyen facultatif de stocker des données de table pour améliorer les performances de récupération des données. Les clusters de hachage peuvent être bénéfiques lorsque les conditions suivantes sont remplies :

Une table est interrogée beaucoup plus souvent que modifiée.

La colonne de clé de hachage est fréquemment interrogée avec des conditions d'égalité, par exemple, WHERE department_id=20 . Pour de telles requêtes, la valeur de la clé de cluster est hachée. La valeur de la clé de hachage pointe directement vers la zone de disque qui stocke les lignes.

Vous pouvez raisonnablement deviner le nombre de clés de hachage et la taille des données stockées avec chaque valeur de clé.

Création de cluster de hachage

Pour créer un cluster de hachage, vous utilisez la même instruction CREATE CLUSTER que pour un cluster indexé, avec l'ajout d'une clé de hachage. Le nombre de valeurs de hachage pour le cluster dépend de la clé de hachage.

La clé de cluster, comme la clé d'un cluster indexé, est une colonne unique ou une clé composite partagée par les tables du cluster. Une valeur de clé de hachage est une valeur réelle ou possible insérée dans la colonne de clé de cluster. Par exemple, si la clé de cluster est department_id , les valeurs de clé de hachage peuvent être 10, 20, 30, etc.

Oracle Database utilise une fonction de hachage qui accepte un nombre infini de valeurs de clé de hachage en entrée et les trie en un nombre fini de compartiments. Chaque compartiment a un ID numérique unique appelé valeur de hachage . Chaque valeur de hachage correspond à l'adresse de bloc de base de données pour le bloc qui stocke les lignes correspondant à la valeur de clé de hachage (département 10, 20, 30, etc.).

Dans l'exemple suivant, le nombre de départements susceptibles d'exister est de 100, donc HASHKEYS est défini sur 100 :

Après avoir créé employee_departments_cluster , vous pouvez créer les tables des employés et des services dans le cluster. Vous pouvez ensuite charger des données dans le cluster de hachage comme dans le cluster indexé.

Oracle Database Administrator's Guide pour apprendre à créer et à gérer des clusters de hachage

Requêtes de cluster de hachage

Dans les requêtes d'un cluster de hachage, la base de données détermine comment hacher les valeurs de clé entrées par l'utilisateur.

Par exemple, les utilisateurs exécutent fréquemment des requêtes telles que les suivantes, en saisissant différents numéros d'identification de service pour p_id :

Si un utilisateur interroge des employés dans department_id =20 , la base de données peut hacher cette valeur dans le compartiment 77. Si un utilisateur interroge des employés dans department_id = 10 , la base de données peut hacher cette valeur dans le compartiment 15. La base de données utilise la valeur de hachage générée en interne pour localiser le bloc qui contient les lignes des employés pour le service demandé.

L'illustration suivante représente un segment de cluster de hachage sous la forme d'une rangée horizontale de blocs. Comme le montre le graphique, une requête peut récupérer des données dans une seule E/S.

Figure 2-6 Récupération de données à partir d'un cluster de hachage

Une limitation des clusters de hachage est l'indisponibilité des analyses de plage sur les clés de cluster non indexées. Supposons qu'il n'existe aucun index distinct pour le cluster de hachage créé dans Hash Cluster Creation. Une requête pour les départements avec des ID entre 20 et 100 ne peut pas utiliser l'algorithme de hachage car il ne peut pas hacher toutes les valeurs possibles entre 20 et 100. Comme aucun index n'existe, la base de données doit effectuer une analyse complète.

Variations de cluster de hachage

Un cluster de hachage à table unique est une version optimisée d'un cluster de hachage qui prend en charge une seule table à la fois. Un mappage un-à-un existe entre les clés de hachage et les lignes.

Un cluster de hachage à table unique peut être utile lorsque les utilisateurs ont besoin d'un accès rapide à une table par clé primaire. Par exemple, les utilisateurs recherchent souvent un enregistrement d'employé dans la table des employés par employee_id .

Un cluster de hachage trié stocke les lignes correspondant à chaque valeur de la fonction de hachage de manière à ce que la base de données puisse les renvoyer efficacement dans l'ordre trié. La base de données effectue le tri optimisé en interne. Pour les applications qui consomment toujours les données dans l'ordre trié, cette technique peut accélérer la récupération des données. Par exemple, une application peut toujours trier sur la colonne order_date de la table des commandes.

Oracle Database Administrator's Guide pour apprendre à créer des clusters de hachage à table unique et triés

Stockage en cluster de hachage

Oracle Database alloue l'espace pour un cluster de hachage différemment d'un cluster indexé.

Dans l'exemple de Hash Cluster Creation, HASHKEYS spécifie le nombre de départements susceptibles d'exister, tandis que SIZE spécifie la taille des données associées à chaque département. La base de données calcule une valeur d'espace de stockage basée sur la formule suivante :

Ainsi, si la taille de bloc est de 4096 octets dans l'exemple illustré dans Création de cluster de hachage, la base de données alloue au moins 200 blocs au cluster de hachage.

Oracle Database ne limite pas le nombre de valeurs de clé de hachage que vous pouvez insérer dans le cluster. Par exemple, même si HASHKEYS vaut 100 , rien ne vous empêche d'insérer 200 départements uniques dans la table des départements. Cependant, l'efficacité de la récupération du cluster de hachage diminue lorsque le nombre de valeurs de hachage dépasse le nombre de clés de hachage.

Pour illustrer les problèmes de récupération, supposons que le bloc 100 de la figure 2-6 est complètement rempli de lignes pour le département 20. Un utilisateur insère un nouveau département avec department_id 43 dans la table des départements. Le nombre de départements dépasse la valeur HASHKEYS, de sorte que la base de données hache department_id 43 à la valeur de hachage 77, qui est la même valeur de hachage utilisée pour department_id 20. Le hachage de plusieurs valeurs d'entrée à la même valeur de sortie est appelé collision de hachage .

Lorsque les utilisateurs insèrent des lignes dans le cluster pour le département 43, la base de données ne peut pas stocker ces lignes dans le bloc 100, qui est plein. La base de données lie le bloc 100 à un nouveau bloc de débordement, disons le bloc 200, et stocke les lignes insérées dans le nouveau bloc. Les blocs 100 et 200 sont désormais éligibles pour stocker des données pour l'un ou l'autre département. Comme le montre la figure 2-7, une requête du département 20 ou 43 nécessite maintenant deux E/S pour récupérer les données : le bloc 100 et son bloc 200 associé. Vous pouvez résoudre ce problème en recréant le cluster avec un autre HASHKEYS valeur.

Figure 2-7 Récupération des données d'un cluster de hachage lorsqu'une collision de hachage se produit

Guide de l'administrateur de base de données Oracle pour apprendre à gérer l'espace dans les clusters de hachage

Présentation des tables à clusters d'attributs

Une table en cluster d'attributs est une table organisée en tas qui stocke les données à proximité immédiate sur le disque en fonction des directives de clustering spécifiées par l'utilisateur. Les directives spécifient des colonnes dans des tables simples ou multiples.

Les directives sont les suivantes :

Le CLUSTER. La directive BY LINEAR ORDER classe les données d'une table en fonction des colonnes spécifiées.

Envisagez d'utiliser le clustering BY LINEAR ORDER, qui est la valeur par défaut, lorsque les requêtes qualifient le préfixe des colonnes spécifié dans la clause de clustering. Par exemple, si les requêtes de sh.sales spécifient souvent soit un ID client, soit à la fois un ID client et un ID de produit, vous pouvez regrouper les données dans la table à l'aide de l'ordre de colonne linéaire cust_id , prod_id .

Le CLUSTER. La directive BY INTERLEAVED ORDER classe les données dans une ou plusieurs tables à l'aide d'un algorithme spécial, similaire à une fonction d'ordre Z, qui permet la réduction des E/S multicolonnes.

Envisagez d'utiliser le clustering BY INTERLEAVED ORDER lorsque les requêtes spécifient une variété de combinaisons de colonnes. Par exemple, si les requêtes de sh.sales spécifient différentes dimensions dans différents ordres, vous pouvez regrouper les données dans la table des ventes en fonction des colonnes de ces dimensions.

Le regroupement d'attributs n'est disponible que pour les opérations INSERT de chemin direct. Il est ignoré pour le DML conventionnel.

Cette section contient les sujets suivants :

Avantages des tables à clusters d'attributs

Le principal avantage des tables en cluster d'attributs est la réduction des E/S, qui peut réduire considérablement le coût des E/S et le coût CPU des analyses de table. La réduction des E/S se produit soit avec des zones, soit en réduisant les E/S physiques grâce à une plus grande proximité physique sur le disque pour les valeurs en cluster.

Une table en cluster d'attributs présente les avantages suivants :

Vous pouvez regrouper des tables de faits en fonction des colonnes de dimension dans les schémas en étoile.

Dans les schémas en étoile, la plupart des requêtes qualifient les tables de dimensions et non les tables de faits, de sorte que le regroupement par colonnes de table de faits n'est pas efficace. Oracle Database prend en charge le clustering sur les colonnes des tables de dimension.

La réduction des E/S peut se produire dans plusieurs scénarios différents :

Lorsqu'il est utilisé avec les index de stockage Oracle Exadata, l'élagage min/max Oracle In-Memory ou les cartes de zone

Dans les applications OLTP pour les requêtes qui qualifient un préfixe et utilisent le regroupement d'attributs avec un ordre linéaire

Sur un sous-ensemble des colonnes de clustering pour le clustering BY INTERLEAVED ORDER

Le clustering d'attributs peut améliorer la compression des données et, de cette manière, améliorer indirectement les coûts d'analyse des tables.

Lorsque les mêmes valeurs sont proches les unes des autres sur le disque, la base de données peut plus facilement les compresser.

Oracle Database n'engage pas les coûts de stockage et de maintenance d'un index.

Oracle Database Data Warehousing Guide pour plus d'avantages des tables en cluster d'attributs

Joindre les tables attributaires en cluster

Le regroupement d'attributs basé sur des colonnes jointes est appelé regroupement d'attributs de jointure. Contrairement aux clusters de tables, les tables groupées d'attributs de jointure ne stockent pas les données d'un groupe de tables dans les mêmes blocs de base de données.

Par exemple, considérons une table groupée d'attributs, sales , jointe à une table de dimension, products . La table des ventes contient uniquement des lignes de la table des ventes, mais l'ordre des lignes est basé sur les valeurs des colonnes jointes à partir de la table des produits. La jointure appropriée est exécutée pendant le déplacement des données, l'insertion de chemin direct et les opérations CREATE TABLE AS SELECT. En revanche, si les ventes et les produits se trouvaient dans un cluster de tables standard, les blocs de données contiendraient des lignes des deux tables.

Oracle Database Data Warehousing Guide pour en savoir plus sur le regroupement d'attributs de jointure

Réduction d'E/S à l'aide de zones

UNE zone est un ensemble de blocs de données contigus qui stocke les valeurs minimales et maximales des colonnes pertinentes.

Lorsqu'une instruction SQL contient des prédicats sur des colonnes stockées dans une zone, la base de données compare les valeurs de prédicat au minimum et au maximum stockés dans la zone. De cette façon, la base de données détermine les zones à lire lors de l'exécution SQL.

La réduction des E/S est la possibilité d'ignorer les blocs de table ou d'index qui ne contiennent pas de données dont la base de données a besoin pour satisfaire une requête. Cette réduction peut réduire considérablement le coût des E/S et du processeur des analyses de table.

Cartes des zones

Une carte de zone est une structure d'accès indépendante qui divise les blocs de données en zones. Oracle Database implémente chaque carte de zone comme un type de vue matérialisée.

Chaque fois que CLUSTERING est spécifié sur une table, la base de données crée automatiquement une carte de zone sur les colonnes de clustering spécifiées. La carte de zone met en corrélation les valeurs minimales et maximales des colonnes avec des blocs de données consécutifs dans la table en cluster d'attributs. Les tables en cluster d'attributs utilisent des mappages de zones pour effectuer une réduction d'E/S.

Vous pouvez créer des tables à clusters d'attributs qui n'utilisent pas de mappes de zone. Vous pouvez également créer des cartes de zone sans tables groupées par attributs. Par exemple, vous pouvez créer une carte de zone sur une table dont les lignes sont naturellement ordonnées sur un ensemble de colonnes, comme une table de bourse dont les transactions sont classées par heure. Vous exécutez des instructions DDL pour créer, supprimer et gérer des mappages de zones.

But des zones

Pour une analogie lâche des zones, considérons un directeur des ventes qui utilise une bibliothèque de casiers, qui sont analogues à des blocs de données.

Chaque casier a des reçus (lignes) décrivant les chemises vendues à un client, classées par date d'expédition. Dans cette analogie, une carte de zone est comme une pile de fiches. Chaque carte correspond à une "zone" (plage contiguë) de casiers, tels que les casiers 1-10. Pour chaque zone, la carte répertorie les dates d'expédition minimum et maximum pour les reçus stockés dans la zone.

Lorsque quelqu'un veut savoir quelles chemises ont été expédiées à une certaine date, la responsable retourne les cartes jusqu'à ce qu'elle arrive à la plage de dates qui contient la date demandée, note la zone des casiers, puis recherche uniquement les casiers dans cette zone pour les reçus demandés. De cette façon, le gérant évite de chercher les reçus dans chaque casier de la bibliothèque.

Comment fonctionne une carte de zone : exemple

Cet exemple illustre comment une carte de zone peut élaguer des données dans une requête dont le prédicat contient une constante.

Supposons que vous créiez le tableau d'éléments de campagne suivant :

L'élément de ligne du tableau contient 4 blocs de données avec 2 lignes par bloc. Le tableau 2-3 montre les 8 lignes du tableau.


Prise en charge d'Impala DML pour les tables Kudu (INSERT, UPDATE, DELETE, UPSERT)

Impala prend en charge certaines instructions DML pour les tables Kudu uniquement. Les instructions UPDATE et DELETE vous permettent de modifier les données dans les tables Kudu sans réécrire des quantités substantielles de données de table. L'instruction UPSERT agit comme une combinaison de INSERT et UPDATE , en insérant des lignes où la clé primaire n'existe pas déjà et en mettant à jour les colonnes de clé non primaire où la clé primaire existe déjà dans la table.

L'instruction INSERT pour les tables Kudu respecte les exigences uniques et NOT NULL pour les colonnes de clé primaire.

Comme Impala et Kudu ne prennent pas en charge les transactions, les effets de toute instruction INSERT , UPDATE ou DELETE sont immédiatement visibles. Par exemple, vous ne pouvez pas effectuer une séquence d'instructions UPDATE et ne rendre les modifications visibles qu'une fois toutes les instructions terminées. De plus, si une instruction DML échoue à mi-chemin, toutes les lignes qui ont déjà été insérées, supprimées ou modifiées restent dans la table, il n'y a pas de mécanisme de restauration pour annuler les modifications.

En particulier, un INSERT . L'instruction SELECT qui fait référence à la table dans laquelle est insérée peut insérer plus de lignes que prévu, car la partie SELECT de l'instruction voit certaines des nouvelles lignes insérées et les traite à nouveau.

L'instruction LOAD DATA, qui implique la manipulation de fichiers de données HDFS, ne s'applique pas aux tables Kudu.

À partir d'Impala 2.9, les opérations INSERT ou UPSERT dans les tables Kudu ajoutent automatiquement un nœud d'échange et de tri au plan qui partitionne et trie les lignes selon le schéma de partitionnement/clé primaire de la table cible (sauf si le nombre de lignes à inséré est suffisamment petit pour déclencher l'exécution d'un seul nœud). Étant donné que Kudu partitionne et trie les lignes en écriture, le pré-partitionnement et le tri enlèvent une partie de la charge de Kudu et aident les grandes opérations INSERT à se terminer sans expiration. Cependant, ce comportement par défaut peut ralentir les performances de bout en bout des opérations INSERT ou UPSERT. À partir d'Impala 2.10 , vous pouvez utiliser les astuces /* +NOCLUSTERED */ et /* +NOSHUFFLE */ ensemble pour désactiver le partitionnement et le tri avant que les lignes ne soient envoyées à Kudu. De plus, étant donné que le tri peut consommer une grande quantité de mémoire, envisagez de définir l'option de requête MEM_LIMIT pour ces requêtes.


Une chose qui m'a immédiatement sauté aux yeux est la suivante :

Votre conception suppose que chaque élève aura exactement 1 mère et exactement 1 père. Je peux vous dire maintenant que ce ne sera pas le cas. Les étudiants dont les parents sont divorcés peuvent avoir deux mères et deux pères, qui voudront tous que leurs coordonnées soient répertoriées. Certains élèves peuvent avoir des parents gais ou lesbiens, et donc deux pères ou deux mères. Certains élèves peuvent avoir ni, et peuvent à la place avoir un tuteur légal qui n'est ni leur père ni leur mère.

Une solution à cela serait d'avoir une table pour une "personne", et de relier les personnes à chaque élève. Indiquez si cette personne est un père ou une mère (ou un tuteur non parental). Cela simplifiera également le fait d'avoir des frères et sœurs : vous pouvez avoir la même mère, le même père, etc. pour plusieurs élèves.

Pour la majorité des étudiants, ce ne sera pas un problème, mais pour plus que vous ne le pensez, ce sera le cas. Faites une faveur à ces familles et à votre direction en facilitant la gestion de divers scénarios familiaux !

Certaines choses qui ont sauté

prenez la suggestion de martin york et soyez cohérent autant que possible, l'utilisateur identifiant les noms de clés primaires comme user_id par opposition à id pour chaque table car cela le rendra moins déroutant pour ceux qui écrivent/maintiennent le SQL. Pour les clés étrangères, je suggérerais d'abord la table, par exemple. area_id par opposition à IdArea car il s'écoule mieux avec le langage naturel.

En regardant votre ERD, il y a des endroits où il ne parvient pas à atteindre 3NF (qui est un niveau de normalisation de la base de données que vous devriez vous efforcer d'atteindre lorsque cela est possible)

Utilisez des types de champs appropriés, il semble que vous utilisiez beaucoup de chaînes, des éléments tels que la date d'embauche doivent être la colonne horodatage/date-heure réelle, le sexe peut être une énumération, etc.

Toutes les informations de contact/téléphone dans les tables du personnel et des étudiants peuvent être placées dans des tables de téléphone/contact plus appropriées car il s'agit de relations un à plusieurs.

Votre table de présence. On dirait qu'il indique qu'un élève a fréquenté l'école un jour particulier ou non. semble que ce serait quelque chose de plus au niveau de la classe, car un étudiant pourrait assister à une demi-journée et autre.

Est-il possible pour un membre du personnel d'avoir plus d'un type de personnel, si c'est le cas, vous devriez avoir une table associative pour lier le personnel aux types de personnel

Au lieu d'années de service dans le personnel, ne pourriez-vous pas simplement utiliser la colonne de la date d'embauche pour le déterminer au lieu de mettre à jour chaque année la colonne de l'année de service.

Ce sont des choses que j'ai remarquées, j'espère que cela aide.

Tous vos identifiants (identifiants uniques) sont appelés identifiants (c'est OK et cela fonctionne pour vous)
Mais j'ai trouvé que lorsque vous commencez à faire des jointures, cela peut devenir difficile à lire. Ainsi, j'aime nommer la clé unique après la table. par exemple User_ID sur la table des utilisateurs, etc.

Pour faciliter la lecture des identifiants, utilisez soit la casse chameau, soit les mots séparés par _
Les identifiants comme IDArea fonctionnent un peu ensemble. Donc IdArea ou ID_Area ou Id_Area (N'oubliez pas de choisir un style et soyez cohérent cependant).

La table Staff contient beaucoup d'informations dont beaucoup pourraient être NULL.
Je préférerais avoir une table Person pour conserver les informations sur les personnes. Ensuite, une table de relations pour tenir les relations entre les personnes. De cette façon, lorsque votre base de données est étendue (et dans un environnement professionnel, cela se produira), vous pouvez exprimer d'autres relations entre le personnel.

Lié au personnel. Comme le personnel, je conserverais les détails personnels de l'étudiant dans la table Personne. Noter.Je garderais toujours une table (ou une vue) séparée pour le personnel/l'étudiant qui a un lien dans la table Person.

Je suis d'accord avec toutes les observations des autres ci-dessus, mais j'aborderai quelques points particuliers :

Vous pouvez certainement faire une normalisation supplémentaire. Il y a des endroits où cela peut se résumer à une décision consciente de NE PAS normaliser complètement (il peut y avoir des raisons de ne pas le faire. . . En fonction de l'espace de votre problème), mais dans l'ensemble, lorsque je commence à voir les mêmes noms de champ apparaître dans plusieurs tables (autre que les relations PK/FK), je deviens méfiant. Un exemple (que Martin York aborde, mais j'irai un peu plus loin) concerne tous les champs "Personnes". Notez le niveau de duplication entre la table « Personnel » et la table « Élèves » en ce qui concerne les Mères/Pères/Lieux de travail/Métiers. Les mères et les pères sont des personnes. Le personnel est aussi des gens. Les étudiants sont des personnes.

Je remarque que vous avez un champ "Observations" dans votre table des étudiants. Je vous recommande fortement de définir une table "Observations" avec une clé étrangère à la table "Etudiants" avec les champs suivants (Le Staff_ID sert à enregistrer qui a fait l'observation). Au fil du temps, les observations s'accumuleront et il sera utile de savoir quand et qui les a faites :

Tableau des observations : Observation_ID, Student_ID, Observation_Date, Observation, Staff_ID

Je suis d'accord avec l'idée qu'il devrait y avoir une table "Contact_Info" séparée. De plus, je parie que vous voudrez envoyer du courrier à l'étudiant (ou aux parents de l'étudiant) de temps en temps. J'inclurais un tableau "Adresses" à cet effet. Je ne prétendrai pas savoir comment cela fonctionne en Bolivie, mais aux États-Unis, les écoles aiment envoyer des bulletins par la poste (bien que les parents puissent AUSSI suivre les progrès de leurs élèves sur Internet ces jours-ci. ).

Les salaires du personnel peuvent changer. Bien que vous puissiez décider qu'il est acceptable d'écraser cette valeur, il s'agit d'un autre domaine où une normalisation correcte indique une table Staff-Salaries, qui comprend des champs pour ID, Salary et Effective_Date.

Jusqu'où vous poussez le processus de normalisation peut être délicat, mais comme un ou plusieurs autres commentateurs l'ont observé, vous devriez toujours viser 3NF. Je vous promets, d'après ma propre expérience douloureuse, que lorsque votre patron décide qu'il veut un rapport indiquant les augmentations de salaire du personnel sur une période de cinq ans, vous serez heureux de l'avoir fait.

Bien qu'il arrive souvent qu'il y ait une décision consciente et basée sur la conception de "dénormaliser" une table, la décision doit être documentée pour ceux qui pourraient avoir besoin de maintenir votre base de données à l'avenir, lorsque vous n'êtes plus là.


2 réponses 2

En répondant directement à la question, il existe deux manières d'exécuter l'opération.

  • Si le nombre de colonnes varchar impliquées sur la table est faible (une ou deux), il est plus pratique de créer des colonnes pseudo-temp
  • Si le nombre de colonnes varchar est plus important, la méthode ci-dessus n'est pas très pratique - vous créez donc une pseudo-table. Ceci est le plus utilisé sur les scripts de mise à jour des métadonnées de certains outils de base de données comme ErWin ou ER/Studio (j'ai utilisé les deux outils et examiné les scripts générés avant de postuler)

Remarque sur les grandes tables: Si la table contient quelques milliers d'enregistrements ou moins, vous pouvez effectuer l'opération en une seule fois. Dans le cas des tables de millions d'enregistrements, il est plus pratique d'effectuer par lots (disons des milliers ou des centaines d'enregistrements à chaque fois).

Les colonnes pseudo-temp (j'ai oublié s'il y a un autre nom, plus approprié) sont des colonnes utilisées pour stocker le résultat d'une conversion. Dans ce cas, ils seraient également les dernières colonnes après le processus.

  1. Créez les nouvelles colonnes avec la longueur souhaitée. N'oubliez pas d'inclure les contraintes de vérification ou les valeurs par défaut sur la nouvelle définition
  2. Effectuez une mise à jour (ou des mises à jour, voir l'observation ci-dessus) pour stocker les données de l'ancienne colonne dans la nouvelle.
  3. Effectuez la sauvegarde du journal et effectuez le point de contrôle pour ne pas permettre au journal de devenir absurdement volumineux.
  4. Si l'ancienne colonne est associée à des contraintes, supprimez-les.
  5. Déposez l'ancienne colonne.
  6. Renommer la nouvelle colonne avec l'ancien nom de colonne
  7. Reconstruisez les index affectés (ou tous, si la colonne affectée faisait également partie d'une contrainte de clé primaire en cluster - il est rare que quelqu'un utilise un (n)varchar comme PK, mais j'en ai vu).

C'est le même processus détaillé dans la réponse d'Aaron.

Lorsque la modification porte sur plus d'une poignée de colonnes, il est plus pratique de créer une nouvelle table, basée sur le schéma de l'ancienne.

  1. Créez une nouvelle table, sans aucune contrainte de table (PK,FK,etc). N'apportez que les colonnes pour le moment (NOT NULL, DEFAULT, CHECK, etc.)
  2. Insérez les données de l'ancienne table dans la nouvelle table (voir le Remarque sur les grandes tables dessus). SET IDENTITY_INSERT ici est un must.
  3. Maintenant, supprimez toutes les contraintes de table (PK, FK, contrôles) et déclencheurs sur l'ancienne table. Recréez ces contraintes et déclencheurs sur la nouvelle table.
  4. Recréez tous les autres index (tous en une fois ou un à la fois, selon votre fenêtre de maintenance) de l'ancienne table, sur la nouvelle table. À moins que la table n'ait pas d'index clusterisé, cela doit être fait après l'étape 3. Ou, au moins, après la création de la contrainte PK.
  5. Vérifiez si tout s'est bien passé (si vous n'avez pas oublié un déclencheur ou une contrainte dans le processus) et, si tout va bien, supprimez l'ancienne table.
  6. Renommer la nouvelle table au nom de l'ancienne table

Remarque sur l'étape 4: Si vous avez détecté des index en double (la détection des index en double est un sujet très long, voir le blog de Kimberly Tripp sur SQLSkills.com), c'est votre chance de vous en débarrasser si c'est le cas.

Le passage de VARCHAR à NVARCHAR a des implications sur les performances, au moins pour tout serveur SQL inférieur à 2008R2. Pour SQL 2008 R2, Aaron Bertrand a publié des articles de blog sur la fonctionnalité de compression Unicode, ce qui peut contrebalancer lorsque les colonnes NVarchar sont utilisées pour stocker du contenu pouvant être stocké sur des colonnes VARCHAR. Je ne les ai pas lus complètement comme le méritent les articles, mais le sujet est intéressant.

Les colonnes NVARCHAR (IOW, avant 2008R2) stockent généralement tous les caractères dans les colonnes avec 2 octets par caractère. Par exemple, la chaîne 'MSSQL' sera stockée sur 5 octets sur une colonne VARCHAR et 10 sur une colonne NVARCHAR. Étant donné que les colonnes de chaînes non LOB sont limitées à un maximum de 8 000 octets, cela signifie que VARCHAR peut stocker 8000 caractères, tandis que NVARCHR est limité à 4000.

Implications de ces faits :

  • Étant donné que les clés d'index sont limitées à 900 octets (voir la documentation sur CREATE INDEX), si vous essayez d'indexer une colonne NVARCHAR (500), la commande n'échouera pas (si c'est la seule colonne sur la clé d'index), mais si vous UPDATE ou INSÉRER une ligne avec plus de 450 - (taille totale des autres colonnes sur la clé d'index, si c'est le cas) caractères l'opération échouera.
  • Plus il y a d'octets à exploiter, plus il y a de travail à faire. Vous lisez/écrivez/comparez/mettez en cache le double d'octets.
  • En fonction de la taille de la table, de l'influence des colonnes de chaîne sur la taille stockée de la table et de la participation de la table à la taille de la base de données, vous pouvez vous attendre à une augmentation de la taille de la base de données (utilisée) et de toutes les variables qu'elle affecte directement ou non (comme le temps de sauvegarde/restauration, la maintenance d'index, etc.).

EDIT: comme l'a déclaré gbn, cela ne vaut pas la peine de créer quelque chose juste pour utiliser les VARCHAR lorsque vous avez une exigence claire qui nécessite que les colonnes NVARCHAR soient remplies.


3 réponses 3

Comme l'affirme Doug, j'ai commencé à étudier cela et je me suis retrouvé avec un plus gros test/démo/etc. que ce que j'avais initialement prévu. J'ai adopté l'approche de classe "wrapper", en commençant par une version AuraEnabled de FieldSetMember dans FieldSetMember.apx :

Ceci est utilisé dans FieldSetController.apxc, qui peut faire des choses comme a) obtenir les noms des types d'objets qui ont des ensembles de champs et b) obtenir les champs pour l'ensemble de champs sous forme de liste de FieldSetMember :

Le contrôleur est utilisé dans fsTest.cmp

Le contrôleur associé, fsTesdtController.js, gère principalement les événements :

L'assistant, fsTestHelper.js, construit l'interface utilisateur pour afficher les objets avec des ensembles de champs, les ensembles de champs pour l'objet sélectionné, un formulaire généré et une zone de test pour démontrer la liaison de données :

Et un peu de CSS pour le rendre un peu plus joli dans fsTest.css :

Le composant implémente force:appHostable, il peut donc être utilisé dans l'application mobile S1. Pour l'utiliser de manière autonome, voici fsTestApp.app :

Lorsqu'elle est exécutée, l'interface utilisateur ressemble à ceci :

Pour l'utiliser, cliquez sur l'icône d'actualisation/rechargement en haut à gauche. Cela peut prendre quelques secondes car le nombre de sobjects sur une organisation typique est énorme. Si vous n'avez aucun ensemble de champs, vous ne verrez rien dans la liste. Si vous le faites, tous les types d'objet avec des ensembles de champs sont répertoriés. En cliquant sur le lien du type d'objet, les ensembles de champs seront récupérés sur le serveur et affichés dans la liste en haut à droite. Cliquer sur un lien d'ensemble de champs générera le formulaire et la liste des tests. Entrez les valeurs et appuyez sur la touche retour pour voir les valeurs changer. Cliquez sur le bouton Soumettre le test pour voir les valeurs.

Notez qu'il existe un bogue dans ui:inputDate qui peut se produire lors de l'utilisation de la création dynamique. Vous obtiendrez un spinner et serez bloqué.

Vous pouvez modifier le mappage DisplayType->component dans le configMap dans fsTestHelper.js. Vous pouvez faire le mappage autrement, via du code, des métadonnées, etc., si vous le souhaitez.

Faites moi savoir si vous avez des questions. Ce n'est pas une application robuste, mais elle pourrait fournir des idées sur la façon d'aborder cela.


Voir la vidéo: How to join data from excel to shapefile in QGIS