Base de données relationnelle - Concepts de base. Modèle de base de données relationnelle

II. Modèle de réseau

III. Modèle relationnel

enregistrerdomaine

hiérarchique et modèles de réseau clés externes


4. Modèle de données relationnelle

Base de données relationnelle

* Attitude

* Attribut colonne Les tables.

* Type de données

* la communication clé.

* Une association

De base les fonctions RDBD sont:

· Définition de données

· Traitement de l'information

· Gestion de données

Microsoft Access.

Fenêtre BD dans l'accès



Modes de fonctionnement avec des objets

Les boutons de travail avec des objets de base de données sont situés dans les outils Toolbar Tools:

Ouvert - Vous permet d'aller en mode d'édition de table, d'exécuter la requête, du formulaire de téléchargement, de la construction de rapports, de la démarrage macro.

Constructeur - Fournit la transition au mode de réglage de l'objet sélectionné.

Créer - Vous permet de commencer à créer un nouvel objet du type sélectionné.

7. Travailler avec des tables

Pour créer une table, vous devez accéder à la liste des tables et cliquer sur le bouton Créer . Une nouvelle boîte de dialogue apparaît Nouvelle table:

Une table dans l'accès peut être créée de plusieurs manières:

· Construire nouvelle table "De zéro", profitant de Designer;

· Cours Tables maîtres - Offre spéciale de programme Créez une table en mode étape par étape basée sur solutions typiquesDisponible dans l'accès;

· Importer la table de base de données du fichier de tout programme, par exemple, FoxPro ou Excel.

Réglage du nom du champ

Le nom de champ est défini dans la colonne Nom de domaine. Le nom ne peut contenir plus de 64 caractères et tous les caractères sauf le point, la marque d'exclamation et les crochets sont autorisés. La répétition des noms de champs n'est pas autorisée.

Définition du type de données

Pour chaque champ, vous devez spécifier le type de données contenues. Le type de données est sélectionné dans la liste que vous pouvez appeler une souris dans la colonne. Type de données. Access fonctionne dans les types de données suivants:

Ø Texte- Pour stocker le texte habituel avec le nombre maximum de caractères 255.

Ø Champ de mémo - Pour stocker de gros volumes de texte jusqu'à 65 535 caractères.

Ø Numérique- Pour stocker des nombres valides.

Ø Heure - Pour stocker les dates de calendrier et l'heure actuelle.

Ø Monétaire- Ces champs contiennent des montants monétaires.

Ø Compteur - Déterminer la table de clé du système unique. Habituellement utilisé pour la numérotation ordinale des enregistrements. En ajoutant à la table nouvel enregistrement La valeur de ce champ augmente de 1 (unité). Les valeurs dans de tels champs ne sont pas mises à jour.

Ø Logical - Pour stocker des données qui rend les valeurs: oui ou non.

Ø Champ d'objet OLE - Pour stocker des objets créés dans d'autres applications.

Description des propriétés de la propriété

Comme indiqué précédemment, les caractéristiques des champs individuels sont définies dans la zone Propriétés du terrain (Tab. Général). Chaque champ a un ensemble spécifique de propriétés - en fonction du type de champ. Certains types de champs ont des ensembles similaires de propriétés de terrain. Vous trouverez ci-dessous les propriétés de base des champs.

Ø Taille du champlongueur maximale Champ de texte (50 caractères par défaut) ou champ numérique de type de données. Il est recommandé de définir la valeur admissible minimale de cette propriété, car le traitement de données plus petites est effectué plus rapidement.

Si le type de données est numérique, les valeurs de propriété suivantes sont autorisées Taille du champ:

Commenter. En cas de conversion de champ à une taille plus petite, une perte de données peut survenir.

Ø Format de champ - Format d'affichage des données à l'écran ou à l'impression. En règle générale, le format par défaut est utilisé.

Ø Le nombre de signes décimaux - Spécifie des données numériques et de type argent Le nombre de décimales après la virgule.

Ø Entrée de masque - Détermine la forme dans laquelle les données sont entrées dans le champ (moyen d'automatisation de saisie de données).

Ø Signature - La désignation du champ qui sera utilisée pour afficher le champ dans la table, le formulaire ou le rapport. Si cette valeur n'est pas définie, le nom du champ sera considéré comme une signature.

Ø Valeur par défaut - Valeur standard qui est automatiquement entrée dans le champ lors de la génération d'un nouvel enregistrement de données.

Ø Condition de valeur- Définit les restrictions sur les valeurs d'entrée, permettant ainsi le contrôle de l'exactitude de la saisie de données.

Ø Message d'erreur - Spécifie le texte du message affiché à l'écran en cas de violation de la valeur de condition.

Ø champs requis- Détermine si ce champ peut contenir valeurs null (c'est-à-dire rester vide), ou il est nécessaire d'introduire des données à ce domaine.

Ø Champ indexé - Utilisé pour les enregistrements de recherche et de tri de la valeur stockée dans ce champ, ainsi que d'exclure automatiquement la duplication des enregistrements. Type de champs Note., Objet OLE et Hyperlien Ne peut pas indexer.

Définir un champ clé

Après avoir défini les caractéristiques de tous les champs, vous devez sélectionner au moins un champ de clé. En règle générale, les champs qui ont des données non affinées sont spécifiés ou que des champs avec type de données sont spécifiés comme champs clés. Compteur . Dans tous les cas, le champ clé ne doit pas contenir de données répétées. Pour déterminer la clé, vous devez sélectionner le champ (ou les champs) souhaité, puis cliquez sur le bouton. Champ clé Éditer . L'image de la clé apparaît à gauche du marqueur.

Table de sauvegarde

Avant d'entrer des informations, la table conçue doit être enregistrée: appuyez sur le bouton Sauvegarder Dans la barre d'outils ou la commande appropriée au paragraphe m. Déposer et entrez le nom de la table, après quoi la question apparaît à l'écran "Créer un champ de clé maintenant?" (Oui ou non)

Si la réponse est sélectionnée Oui", Alors l'accès créera un champ automatiquement avec le nom" Code "et Type de données Compteur , si un " Pas«La table sera créée sans champ clé. Dans ce cas, vous devez ouvrir la table créée en mode. Designer Et déterminez le champ clé "manuellement".

Entrée de données

Pour traduire la table en mode de saisie de l'information, vous devez aller en mode. les tables. Les champs sont remplis en série. Transition d'un champ à un autre pratique pour effectuer la clé Languette. (ou combinaison Shift + Tab. - dans la direction opposée). Si lors de la conception d'une table, des valeurs par défaut ont été fournies pour certains champs, ces valeurs apparaissent automatiquement dans les champs correspondants. Les entrées du tableau peuvent être déplacées, copier et supprimer les mêmes façons que dans feuilles de calculC'est-à-dire d'abord mettre en surbrillance les lignes, puis effectuez l'opération nécessaire. La colonne peut être mise en surbrillance en cliquant sur l'en-tête. Les colonnes peuvent être déplacées vers la droite et la gauche, en utilisant la méthode glisser déposer. (faites glisser et lancer).

Si nécessaire, vous pouvez retourner en mode Designer. Cela permet de corriger quelque chose dans la structure de la table.

Data try dans le tableau

Les données du tableau peuvent être triées par ordre croissant ou décroissant. Pour ce faire, il est nécessaire de placer le curseur de la souris dans n'importe quelle cellule de colonne, dont les valeurs seront triées et du paragraphe m. Entrées sélectionnez une commande Tri Ou appuyez sur le bouton correspondant sur le panneau.

8. Création de connexions entre les tables de base de données

La connexion entre les tables est définie en définissant dans la même table ( subalterne) Champs correspondant à la clé d'une autre table ( la chose principale). Le lien établi connectera les enregistrements contenant les mêmes valeurs dans le champ spécifié. Création de communication L'accès ultérieur sera utilisé dans les requêtes, les formulaires ou les rapports.

Commentaires.

Ø Les deux champs associés doivent avoir la même chose type de données.

Ø Propriétés Taille du champ Pour les deux champs de liaison type numérique Doit être la même chose.

Ø Si le champ clé de la table principale est un champ de type de données CompteurCe champ peut être associé à un champ numérique de la table subordonnée. Dans ce cas, pour le champ numérique de la table associée pour la propriété Taille du champ La valeur doit être définie. Long tout .

Intégrité des données

Intégrité des données - Il s'agit d'un ensemble de règles prenant en charge l'exactitude des liens entre les enregistrements dans des tableaux associés et assurer la protection des données contre les changements aléatoires ou les suppressions.

Ces règles incluent:

Ø Dans la table subordonnée, il n'y a pas d'entrées qui ne sont pas liées à l'enregistrement de la table principale.

Ø Dans la table principale, vous ne pouvez pas modifier la valeur du champ de clé s'il y a des enregistrements dans la table esclave qui sont connectés à celle-ci.

Ø Dans la table principale, vous ne pouvez pas supprimer les enregistrements s'il y a des enregistrements associés à celui-ci dans la table esclave.

Opérations en cascade

L'intégrité des données dans des tableaux connexes fournit des opérations en cascade de deux types:

Ø opérations de mise à jour en cascade;

Ø opérations de retrait en cascade.

Ces opérations peuvent être activées et éteintes en installant les indicateurs correspondants: "Mise à jour de cascade des champs associés" et "Suppression de cascade des champs associés".

Si la case à cocher "Cascade Refrname Related Champs" est cochée, toutes les modifications de la valeur de champ clé dans la table principale, qui se tient sur le côté "Un" en termes de 1: M, conduisent à mise à jour automatique valeurs correspondantes dans tous les enregistrements associés.

Lorsque vous installez la case "Cascade Supprimer les tables de suppression", lorsque vous supprimez un enregistrement de la table principale, vous pouvez automatiquement supprimer les entrées associées dans des tables subordonnées.

Connexions de retrait (changement)

Ø Ouvrir la fenêtre Régime de données;

Ø Pour activer le bouton gauche de la souris que vous souhaitez supprimer (changer);

Ø Cliquez avec le bouton droit de la souris appeler le menu dépendant du contexte et sélectionnez la commande Effacer (Changer) respectivement.

9. Types de relations entre les tables

Il existe trois types de relations entre les tables:

Un à un (1: 1). La valeur clé de chaque enregistrement dans la table principale peut correspondre à la valeur dans le champ associé uniquement dans un enregistrement de la table subordonnée. Dans ce cas, la relation entre les tableaux ne peut être installée que par des champs clés des deux tables.

Un à plusieurs (1: m). La valeur clé de chaque entrée de la table principale peut correspondre à la valeur dans le champ associé (champs) dans plusieurs enregistrements de la table subordonnée. Ce type de ratio est assez couramment utilisé dans des bases de données relationnelles.

Plusieurs à plusieurs (m: m). Il se produit entre les deux tables lorsqu'une entrée de la première table A (sortie) peut être associée à plus d'une entrée d'une autre table dans (réceptionnelle), à \u200b\u200bson tour, une entrée d'une autre table peut être associée à plus d'une Première entrée de table. Ce schéma est implémenté uniquement à l'aide d'une troisième table de connexion, dont la clé de connexion est constituée d'au moins deux champs. Ces champs sont des champs clé externe Tables A et V. La clé principale de la table de connexion est généralement une combinaison de clés externes.

S'il existe des connexions dans la table entre les tables, une table d'intersection supplémentaire est créée, avec laquelle la connexion M: M sera réduite à deux liaisons de type 1: m. L'accès ne permet pas de déterminer la connexion directe M: M entre les deux tables.

10. Formation de demandes

Demande d'exécution

Pour démarrer une requête pour l'exécution de la fenêtre Designer Vous devez appuyer sur le bouton de la barre d'outils En cours» ! ou exécuter la commande Demande / course à pied. Les résultats des échantillons de données sur la requête sont affichés sur le mode Table.

Formation des conditions de sélection

La liste des opérateurs utilisés dans la tâche des expressions est la suivante:

Ø opérateurs comparer:


= (également)

<> (inégal)

> (Suite)

>= (pas moins)

< (moins)

<= (pas plus)


Entre. - Vous permet de définir la plage de valeurs. Syntaxe: Entre."Expression" Et."Expression" (par exemple: Entre. 10 Et. 20 signifie aussi une expression logique >= 10 Et.<= 20).

DANS. - Vous permet de spécifier les valeurs utilisées pour comparer (l'opérande est la liste ci-jointe entre parenthèses). Par example: DANS.("Brest", "Minsk", "Grodno") signifie la même chose que l'expression logique "Brest" Ou alors. "Minsk" Ou alors. "Grodno."

Ø casse-tête Les opérateurs:

Et. (Par exemple:\u003e \u003d 10 et<=20)

Ou alors.(par exemple:<50 OR >100)

Pas.(Par exemple: n'est pas NULL - un champ contenant une valeur).

Ø opérateur Comme.- vérifie la conformité textuelle ou alors Champs de mémo Selon le gabarit spécifié des caractères.

Tableau des symboles de modèle

Exemples d'utilisation de l'opérateur Comme:

Comme "c *" - des lignes commençant par le symbole avec;

Comme "[a - z] #" - n'importe quel caractère de A à Z et à la figure;

Comme "[! 0 - 9 ABC] * # #" - des lignes commençant par tout symbole, à l'exception du nombre ou des lettres A, B, C et se terminant par 2 chiffres;

Critères d'échantillonnage sophistiqué

Vous devez souvent sélectionner des enregistrements par une condition définie pour plusieurs champs de table ou par plusieurs conditions pour un seul champ. Dans ce cas, appliquer "Et demandes" (Sélection des enregistrements uniquement soumis à toutes les conditions) et "Ou demandes" (Sélection des enregistrements lors de l'exécution d'au moins une des conditions).

Lors de la spécification " Ou demande»Chaque condition d'échantillon doit être placée sur une ligne distincte. Demande de Blanca.

Lors de la spécification " Et demande»Chaque condition d'échantillon doit être placée sur une ligne, mais dans différents domaines Demande de Blanca.

Ces opérations peuvent être spécifiées explicitement à l'aide des opérateurs. Ou alors. et Et. respectivement.

Fonctions IIF () et format ()

Une fonction Iif (condition; si la condition; attitude - renvoie l'un des deux arguments en fonction du résultat du calcul de l'expression.

Une fonction Format (expression; instruction de formatage) - Retourne une chaîne contenant une expression formatée en fonction des instructions de formatage.

Pour les expressions date / heure Vous pouvez appliquer les caractères suivants dans les instructions de formatage:

I. Modèle hiérarchique

II. Modèle de réseau

III. Modèle relationnel

Dans le modèle relationnel, les informations sont présentées sous forme de tables rectangulaires. Chaque table se compose de lignes et de colonnes et a un nom unique dans la base de données. À son tour, chaque ligne ( enregistrer) Un tel tableau contient des informations relatives uniquement à un objet spécifique, et chaque colonne ( domaine) La table a un nom unique pour sa table.

Bases de données relationnelles (RBD), contrairement à hiérarchique et modèles de réseauVous permet d'organiser des liens entre les tables à tout moment. Pour ce faire, le mécanisme est mis en œuvre dans la RBD clés externes. Chaque table de base de données a au moins un champ qui sert de référence à une autre table. Dans la terminologie RBD, ces champs sont appelés champs de clés externes. A l'aide de clés externes, vous pouvez lier les tables de base de données à n'importe quel stade de travail avec la base de données.


4. Modèle de données relationnelle

Base de données relationnelle (RBD) est un ensemble de relations simples en deux dimensions logiquement bidimensionnelles constituées d'une pluralité de champs et d'enregistrements reflétant une zone d'objet.

Le modèle de données relationnel a été proposé par E. CODD, un spécialiste américain bien connu de la base de données. Les principaux concepts de ce modèle ont été publiés pour la première fois en 1970. Être un mathématicien pour l'éducation, le code proposé d'utiliser le dispositif de théorie de la théorie des ensembles (association, intersection, différence, travail décartitien). Il a montré que toute présentation de données résume à un ensemble de tables bidimensionnelles d'une espèce spéciale connue en mathématiques comme une attitude (en anglais - relation, d'où les bases de données relationnelles).

L'une des principales idées du code était que la relation entre les données devrait être établie conformément à leurs relations logiques internes. Le deuxième principe important proposé par le code est que, dans des systèmes relationnels avec une commande, des fichiers de données entiers peuvent être traités, tandis qu'une seule entrée a été traitée par une seule commande.

Concepts de base de bases de données relationnelles (RBD)

* Attitude - Informations sur les objets d'un type, par exemple sur les clients, les commandes, les employés. Dans la base de données relationnelle, le ratio est stocké comme une table.

* Attribut - une certaine partie des informations sur certaines installations - par exemple, l'adresse du client ou le salaire de l'employé. L'attribut est généralement stocké comme colonne Les tables.

* Type de données - Le concept que dans le modèle relationnel équivaut pleinement au concept correspondant dans les langues algorithmiques. Un ensemble de types de données pris en charge est déterminé par le SGBD et peut varier considérablement dans différents systèmes.

* la communication - La manière dont les informations sont connectées dans la même table avec des informations dans une autre table. La communication est effectuée à l'aide de champs de correspondance appelés clé.

* Une association - le processus de combinaison des tables ou des requêtes en fonction des valeurs coïncidentes de certains attributs.

Règles (normalisation) Construction de la base de données relationnelle

Normalisation Il s'agit d'un processus de réorganisation des données en éliminant les groupes répétés et les autres contradictions afin d'amener les tableaux à l'espèce qui vous permet d'effectuer une modification de données cohérente et correcte. L'objectif final de la normalisation est réduit à l'obtention d'un tel projet de type dB dans lequel chaque fait n'apparaît que dans un endroit, c'est-à-dire La redondance des informations est exclue.

1. Chaque champ de n'importe quelle table doit être unique.

2. Chaque table doit avoir un identifiant unique ( clé primaire), qui peut consister en un ou plusieurs champs de table.

3. Pour chaque valeur de la clé principale, une seule et une seule valeur de l'une des colonnes de données doit être, et cette valeur doit être liée à l'objet de la table (c'est-à-dire que la table ne doit pas être des données n'appartenant pas à l'objet défini. Par la clé principale, et aussi, les informations contenues dans le tableau doivent décrire complètement l'objet).

4. Il devrait être possible de modifier les valeurs de n'importe quel champ (non incluses dans la clé primaire), ce qui ne devrait pas entraîner des modifications à un autre champ (c'est-à-dire ne doit pas être calculé).

5. Systèmes de gestion de base de données (SGBD)

Maintenir des bases de données dans un environnement informatique Implémentez des logiciels - Systèmes de gestion de la base de données (système de gestion de la base de données), qui sont un ensemble d'outils logiciels et linguistiques de la destination générale ou spécialisée requise pour créer des bases de données sur les opérateurs de machines, les maintenir dans l'état actuel et l'organisation d'accès Ce sont divers utilisateurs dans les conditions de la technologie de traitement de données acceptée.

DBMS - Ce sont des gestionnaires qui fournissent toutes les manipulations avec des bases de données: la création de la base, son entretien, son utilisation par de nombreux utilisateurs, etc., c'est-à-dire un complexe complexe de fonctions pour la gestion centralisée de la base de données et desservant les intérêts des utilisateurs.

Les SGBM peuvent être considérés comme une coque de logiciel qui se trouve entre la base de données et l'utilisateur. Il fournit un contrôle centralisé de protection des données et d'intégrité, d'accès aux données, de traitement, de formage des rapports basés sur la base de données et d'autres opérations et procédures.

Système de gestion de la base de données relationnelle (RSUBD)

Les outils de gestion RBD sont appelés système de gestion de base de données relationnelle Ce qui peut contenir des utilitaires, des applications, des services, des bibliothèques, des outils de création d'applications et d'autres composants. Être connecté via des champs de clé générale, les informations de la RBD peuvent être combinées à partir d'une pluralité de tables en un ensemble de résultats unique.

De base les fonctions RDBD sont:

· Définition de données - Quelles informations seront stockées, définissez la structure de la base de données et de leur type.

· Traitement de l'information - Vous pouvez choisir n'importe quel champ, trier et filtrer des données. Vous pouvez combiner des données et résumer.

· Gestion de données - Ajustez et ajoutez des données.

6. Caractéristiques générales de l'accès à la SGBD

Microsoft Access. - Il s'agit d'une base de données relationnelle complète fonctionnelle, qui fournit à tous les outils nécessaires pour définir et traiter les données, ainsi que pour les gérer lorsque vous travaillez avec de grandes quantités d'informations. Les différentes versions sont incluses dans le package logiciel MS Office et fonctionnent sous Windows (3.11 / 95/98 / 2000 / XP).

Fenêtre BD dans l'accès

Après avoir créé un nouveau fichier de base de données ou ouvrir une fenêtre d'accès existante, une fenêtre de la base de données apparaît:


L'apparition de l'équipement informatique dans notre journée moderne a marqué le coup d'information dans toutes les sphères de l'activité humaine. Mais de sorte que toutes les informations ne deviennent pas inutiles des ordures dans l'Internet mondial, le système de base de données a été inventé, dans lequel les matériaux sont triés sont systématisés, à la suite desquels ils sont facilement trouvés et soumis au traitement ultérieur. Il existe trois variétés principales - identifier des bases de données relationnelles, hiérarchiques, réseaux.

Modèles fondamentaux

De retour à l'émergence de bases de données, il convient de dire que ce processus était assez compliqué, il provient avec le développement d'équipements de traitement d'informations programmables. Par conséquent, il n'est pas surprenant que le nombre de leurs modèles au moment atteignait plus de 50 ans, mais les principaux sont considérés comme hiérarchiques, relationnels et réseaux, qui sont encore largement utilisés dans la pratique. Qu'est-ce qu'ils imaginent?

Le hiérarchique a une structure d'arbres et est compilé de ces différents niveaux, entre lesquels il existe des connexions. Le modèle de réseau de base de données est un modèle plus complexe. Sa structure ressemble à une hiérarchie et le schéma est élargi et amélioré. La différence entre eux est que les données offacaires du modèle hiérarchique peuvent avoir une connexion avec un seul ancêtre et dans les réseaux, il peut y avoir plusieurs. La structure de la base de données relationnelle est beaucoup plus compliquée. Par conséquent, il devrait être démonté plus en détail.

Le concept principal de la base de données relationnelle

Un tel modèle a été développé dans les années 1970 par Dr. Science Edgarodododod. Il s'agit d'une table logiquement structurée avec des champs décrivant les données, leur relation entre elles, les opérations qui leur sont faites, et surtout - les règles garantissant leur intégrité. Pourquoi le modèle est-il appelé relationnel? Il est basé sur les relations (de la lat. Relatio) entre les données. Il existe de nombreuses définitions de ce type de base de données. Les tableaux relationnels avec des informations sont beaucoup plus faciles à systématiser et à donner un traitement que dans un réseau ou un modèle hiérarchique. Comment faire? Il suffit de connaître les caractéristiques, la structure du modèle et les propriétés des tables relationnelles.

Le processus de modélisation et d'élaboration des éléments principaux

Afin de créer votre propre SGBM, vous devez utiliser l'un des outils de modélisation, penser à quelles informations dont vous avez besoin pour fonctionner, concevoir des tables et des liens simples relationnels et multiples entre les données, remplir les cellules d'entités et installer des clés primordiales et externes.

Les tables de modélisation et la conception de bases de données relationnelles sont fabriquées par des outils gratuits tels que Workbench, PHPMYADMIN, Studio de boîtier, DBForge Studio. Après une conception détaillée, conservez le modèle graphiquement prêt à utiliser et traduisez-le en un code SQL prêt à l'emploi. À ce stade, vous pouvez commencer à travailler avec le tri des données, leur traitement et sa systématisation.

Caractéristiques, structure et termes associés au modèle relationnel

Chaque source décrit ses éléments à sa manière, de sorte qu'il voudrait apporter un petit indice pour une confusion plus petite:

  • plaque relationnelle \u003d essence;
  • layout \u003d attributs \u003d nom de champ \u003d titre de colonne d'entité;
  • instance de l'essence \u003d message \u003d enregistrement \u003d comprimés de rangée;
  • valeur d'attribut \u003d Cellule d'entité \u003d champ.

Pour accéder aux propriétés de la base de données relationnelle, vous devez savoir à partir de quels composants de base qu'il consistent et pour lesquels ils sont destinés.

  1. Essence. La table de base de données relationnelle peut en être une, et il peut y avoir un ensemble complet de tables qui caractérise les objets décrits en raison des données stockées. Ils ont un nombre fixe de champs et un nombre variable d'enregistrements. Le tableau du modèle relationnel des bases de données est constitué de lignes, d'attributs et de mise en page.
  2. L'enregistrement est un nombre variable de chaînes affichant des données, caractérisées par l'objet décrit. La numérotation des enregistrements est effectuée automatiquement.
  3. Attributs - Données montrant une description des colonnes d'entité.
  4. Domaine. C'est une colonne d'essence. Leur quantité est une valeur fixe installée lors de la création ou du changement de la table.

Maintenant, connaître les composants des éléments de la table, vous pouvez passer aux propriétés du modèle relationnel de base de données:

  • L'essence de la base de données relationnelle est bidimensionnelle. Grâce à cette propriété avec eux, il est facile de faire diverses opérations logiques et mathématiques.
  • L'ordre des valeurs d'attribut et des enregistrements dans la table relationnelle peut être arbitraire.
  • Une colonne dans une table relationnelle doit avoir son propre nom individuel.
  • Toutes les données de la colonne d'entité ont une longueur fixe et le même type.
  • Toute entrée est considérée comme un élément de données.
  • Les composants des rangées sont le seul en son genre. Il n'y a pas de lignes identiques dans l'entité relationnelle.

Sur la base des propriétés, il est clair que les valeurs d'attribut doivent être le même type, la même longueur. Considérez les fonctionnalités des valeurs d'attribut.

Les principales caractéristiques des champs de base de données relationnels

Les noms des champs doivent être uniques dans le cadre de la même entité. Les types d'attributs ou de champs de base de données relationnels sont décrits, les données de la catégorie sont stockées dans les champs d'entités. Le champ de la base de données relationnelle doit avoir une taille fixe calculée dans les caractères. Les paramètres et le format des valeurs d'attribut déterminent la manière des correctifs. Il existe également un tel concept en tant que "masque" ou "modèle d'entrée". Il est destiné à déterminer la configuration de la saisie de données dans la valeur d'attribut. Cependant, lorsque vous écrivez un problème incorrect dans le champ doit être émis un avis d'erreur. En outre, certaines restrictions sont superposées sur les éléments de terrain - les conditions de vérification de la précision et des erreurs d'entrée de données. Il existe une valeur d'attribut obligatoire qui soit sans ambiguïté avec des données. Certaines lignes d'attributs peuvent être remplies de valeurs nulles. Entrer des données vides dans les attributs de terrain. Outre un avis d'erreur, il existe automatiquement des valeurs remplies par le système. Il s'agit des données par défaut. Pour accélérer la recherche de données, un champ indexé est destiné.

Un diagramme d'une table de base de données relationnelle bidimensionnelle

Pour une compréhension détaillée du modèle utilisant SQL, il est préférable de considérer le schéma de l'exemple. Nous savons déjà que c'est une base de données relationnelle. L'entrée de chaque table est un élément de données. Pour prévenir la redondance des données, il est nécessaire de mener des opérations de normalisation.

Règles de base pour la normalisation de l'entité relationnelle

1. La valeur du nom de champ pour la table relationnelle doit être unique, la seule à son genre (la première forme normale - 1NF).

2. Pour une table, qui est déjà fournie à 1NF, le nom de toute colonne non identifiant doit dépendre de l'identifiant de table unique (2NF).

3. Pour toute la table, qui est déjà en 2NF, chaque champ non identifiant ne peut pas dépendre de l'élément d'une autre valeur non identifiée (3 novembre).

Bases de données: relations relationnelles entre les tables

Il y a 2 principales tablettes relationnelles:

  • "Un-plusieurs". Il se produit par un enregistrement clé de la table n ° 1 à plusieurs copies de la deuxième entité. L'icône de clé à l'une des extrémités de la ligne conductée suggère que l'entité est sur le côté "un", la deuxième extrémité de la ligne est souvent notée par le symbole de l'infini.

  • La connexion "Multi-Lot" est formée en cas de quelques rangées d'une entité d'interaction logique explicite avec un certain nombre d'enregistrements d'une autre table.
  • Si la concaténation "une à une" "se produit entre deux entités, cela signifie que l'identificateur de clé d'une table est présent dans une autre entité, puis une des tables doit être supprimée, elle est superflue. Mais parfois à des fins de sécurité, les programmeurs partagent délibérément deux entités. Par conséquent, la communication hypothétiquement "une à une" peut exister.

L'existence de clés dans la base de données relationnelle

Les clés primaires et secondaires déterminent les relations de base de données potentielles. Les modèles de communication relationnels peuvent avoir une seule clé potentielle, ce sera une clé primaire. Que représente-t-il? La clé principale est une colonne de l'essence ou un ensemble d'attributs, grâce auquel vous pouvez accéder aux données de ligne spécifiques. Il devrait être unique, le seul et ses champs ne peuvent pas contenir de valeurs vides. Si la clé principale consiste en un seul attribut, il est appelé simple, sinon sera le composant.

En plus de la clé primaire, il existe également une clé externe (clé étrangère). Beaucoup ne comprennent pas quelle est la différence entre eux. Nous les analyserons plus en détail sur l'exemple. Donc, il y a 2 tables: "Dean" et "étudiants". L'entité "Deanate" contient des champs: "ID d'étudiant", "nom complet" et "groupe". Table "Étudiants" a de telles valeurs d'attribut en tant que "nom complet", "groupe" et "balle moyenne". Étant donné que l'ID d'étudiant ne peut pas être identique à plusieurs élèves, ce champ sera la principale clé. Nom complet et "groupe" de la table "Étudiants" peuvent être identiques à plusieurs personnes, ils se réfèrent au numéro d'identification de l'étudiant de l'entité "Deanat", afin qu'ils puissent être utilisés comme clé externe.

Exemple de modèle de base de données relationnelle

Pour plus de clarté, nous donnons un exemple simple de modèle relationnel d'une base de données composée de deux entités. Il y a une table avec le titre "Deanat".

Il est nécessaire d'effectuer des connexions pour obtenir une base de données relationnelle à part entière. L'enregistrement "In-41", ainsi que "in-72", peut être présent non une fois dans le signe "Deanat", également le nom de famille, le nom et le patronymique des étudiants dans de rares cas peuvent coïncider, de sorte que ces champs ne peuvent pas être fait dans la clé primaire. Montrons l'entité "étudiants".

Comme nous le voyons, les types de champs de base de données relationnels sont complètement différents. Il y a à la fois des records numériques et symboliques. Par conséquent, dans les paramètres d'attribut, vous devez spécifier les valeurs d'Entreger, de Char, de Vachar, de la date et des autres. Dans le tableau "Deanat", une valeur unique n'est qu'un identifiant d'étudiant. Ce champ peut être pris pour la clé primaire. Nom complet, groupe et téléphone de l'entité "Les étudiants" peuvent être considérés comme une clé externe qui fait référence à l'ID d'étudiant. La communication est établie. Ceci est un exemple d'un modèle avec un lien "un à un". Hypothétiquement une des tables est superflue, elles peuvent être facilement combinées dans une entité. Au nombre d'identifiants d'étudiants ne deviennent pas universellement connus, assez réalistes à l'existence de deux tables.

2. Principes du modèle relationnel

Principes du modèle relationnel des bases de données, relation (relation), tableau (tableau), ensemble de résultats (ensemble de résultats), tuple, puissance, attribut, dimension, en-tête, corps, domaine

Le modèle relationnel a été développé à la fin des années 1960. Koddom (employé IBM) et publié en 1970. Il définit une méthode de présentation de données (structure de données), méthodes de protection des données (intégrité des données) et opérations pouvant être effectuées avec des données (manipulation de données).

Le modèle relationnel n'est pas le seul à pouvoir être utilisé lorsque vous travaillez avec des données. Il existe également un modèle hiérarchique, un modèle de réseau, un modèle en forme d'étoile, etc. Cependant, le modèle relationnel était le plus pratique et donc utilisé maintenant le plus largement.

Les principes de base des bases de données relationnelles peuvent être formulés comme suit:

· Toutes les données à un niveau conceptuel sont présentées sous la forme d'une organisation ordonnée définie sous la forme de lignes et de colonnes et appelées relation (relation). Un synonyme plus commun pour le mot "attitude" - une table (ou "jeu d'enregistrement" ou un ensemble de résultats - ensemble de résultats. C'est à partir de ceci que le terme "bases de données relationnelles" se produit et non dans toutes les relations entre les tables;

· Toutes les valeurs sont des scalaires. Cela signifie que pour n'importe quelle chaîne et colonne de toute relation, une seule et une seule valeur;

· Toutes les opérations sont effectuées sur une attitude complète et le résultat de ces opérations est également une attitude entière. Ce principe s'appelle la fermeture. Par conséquent, les résultats d'une opération (par exemple une requête) peuvent être utilisés comme données source pour effectuer une autre opération (sous-requête).

Maintenant - sur la terminologie formelle:

· attitude (Relation) est toute la structure de l'ensemble, un ensemble d'enregistrements (dans la table de compréhension habituelle).

· rechercher - Ceci est chaque chaîne contenant les données. Un terme plus courant, mais moins formel - enregistrement.

· puissance - le nombre de tuples par rapport à (simplement parler, le nombre d'enregistrements);

· attribut - c'est une colonne par rapport à;

· dimension - il s'agit du nombre d'attributs concernant (dans le présent cas - 3);

· Chaque attitude peut être divisée en deux parties - titre et corps. Dans une langue simple, la relation de titre est une liste de colonnes et le corps est les enregistrements eux-mêmes (Cortices).

· Dans notre exemple, le nom de chaque colonne (attribut) consiste en deux mots séparés par le côlon. Selon les définitions formelles, la première partie est nom d'attribut (nom de colonne), et la deuxième partie est domaine (Type de données qui représente les données de colonne). Les concepts de "domaine" et "type de données" ne sont pas équivalents les uns aux autres. En pratique, le domaine est généralement descendu.

· Le corps de la relation consiste en un ensemble de tuples non ordonnés (son nombre peut être n'importe lequel - de 0 à l'infiniment grand).

Le modèle de données est un ensemble de structures de données et d'opérations de traitement. En utilisant le modèle de données, vous pouvez clairement présenter la structure des objets et la connexion entre elles. Pour la terminologie des modèles de données, les concepts "élément de données" et "règles de liaison" sont caractéristiques. L'élément de données décrit tout ensemble de données et les règles de liaison définissent les algorithmes d'interconnexion des éléments de données. À ce jour, de nombreux modèles de données différents ont été développés, mais dans la pratique, trois ordinateurs sont utilisés. Allouer des modèles de données hiérarchiques, de réseau et relationnel. En conséquence, ils parlent de SGBD hiérarchique, de réseau et relationnel.

Oh modèle de données hiérarchique. Les données hiérarchiquement organisées se trouvent très souvent dans la vie quotidienne. Par exemple, la structure de l'institution éducative la plus élevée est une structure hiérarchique à plusieurs niveaux. La base de données hiérarchique (arborescence) est composée d'un ensemble commandé d'éléments. Dans ce modèle, les éléments initiaux génèrent d'autres éléments et ces éléments génèrent à son tour les éléments suivants. Chaque élément généré n'a qu'un seul élément de génération.

Structures organisationnelles, listes de matériaux, table des matières dans des livres, plans de projet et de nombreux autres ensembles de données peuvent être présentés sous forme hiérarchique. Maintient automatiquement l'intégrité des références entre les ancêtres et les descendants. La règle principale: aucun descendant ne peut exister sans votre parent.

Le principal inconvénient de ce modèle est la nécessité d'utiliser la hiérarchie basée sur la base de données lors de la conception. La nécessité d'une réorganisation constante des données (et souvent de l'impossibilité de cette réorganisation) a conduit à la création d'un modèle plus général - réseau.

Sur le modèle de données de réseau. L'approche réseau de l'organisation des données est une expansion d'une approche hiérarchique. Ce modèle diffère du hierahyx que chaque élément généré peut avoir plus d'un élément de génération. ■.

Étant donné que la base de données réseau peut être directement représentée par tous les types de connexions inhérentes à cette information, selon ces données, il est possible de déplacer, d'explorer et de les demander toutes sortes de façons, c'est-à-dire que le modèle de réseau n'est pas connecté à seulement une hiérarchie. Toutefois, afin de faire une demande de base de données réseau, il est nécessaire de convenir de manière approfondie dans sa structure (disposez d'un schéma de cette base de données) et de développer un mécanisme de navigation de base de données, ce qui constitue un inconvénient important de ce modèle de DB.

O Modèle de données relationnelle. L'idée principale du modèle de données relationnelle consiste à soumettre tout ensemble de données sous la forme d'une table en deux dimensions. Dans le cas le plus simple, le modèle relationnel décrit la seule table à deux dimensions, mais le plus souvent, ce modèle décrit la structure et la relation entre plusieurs tables différentes.

Modèle de données relationnelle

Ainsi, l'objectif du système d'information est le traitement donnéesà propos de objetsmonde réel, en tenant compte cravatesentre les objets. Dans la théorie des données de base de données est souvent appelée attributs, A.objets - entités.Objet, attributs et communication - concepts fondamentaux I.S.

Un objet(ou essence) est quelque chose existant et distinctc'est-à-dire que l'objet peut être appelé "quelque chose" pour lequel il existe un nom et un moyen de distinguer un objet similaire d'un autre. Par exemple, chaque école est un objet. Les objets sont également une personne, une classe à l'école, une alliage, un composé chimique, etc. Les objets peuvent non seulement être des objets matériels, mais également plus de concepts abstraits reflétant le monde réel. Par exemple, des événements, des régions, des œuvres d'art; livres (pas comme produits d'impression, mais comme fonctionne), des productions théâtrales, des films; Normes juridiques, théories philosophiques, etc.

Attribut(ou alors cette)- Ceci est un indicateur qui caractérise un certain objet et accepte une certaine valeur numérique, texte ou différente pour une instance particulière d'un objet. Le système d'information fonctionne avec des ensembles d'objets conçus en relation avec ce domaine, en utilisant spécifique valeurs d'attribut(données) de certains objets. Par exemple, nous prenons comme un ensemble de cours à l'école. Le nombre d'élèves de la classe est une valeur donnée qui prend une valeur numérique (dans une classe 28, de l'autre - 32). Le nom de la classe est une valeur de texte donnée (en un - 10a, une autre - 9b, etc.).

Le développement de bases de données relationnelles a commencé à la fin des années 60, lorsque le premier travail est apparu, dans lequel ont été discutés; Options d'utilisation des bases de données de façons familières et naturelles de représenter des données - les modèles dites de référence de table.

Le fondateur de la théorie des bases de données relationnelles est un employé IBM Dr. E. Codd, qui a publié 6 (juin 1970. Article Un modèle relationnel de données pour les banques de données partagées(Modèle de données relationnel pour les grandes banques de données collectives). Dans cet article, le terme "modèle de données relationnelle a été utilisé pour la première fois. La théorie des bases de données relationnelles, développées dans les années 70 aux États-Unis, le Dr E. Codd, dispose d'un cadre mathématique puissant décrivant les règles d'une organisation de données efficace. Développé par E. Codd La base théorique est devenue une base pour développer la théorie de la conception de la base de données.

E. DOCD, étant un mathématicien pour l'éducation, proposé d'utiliser l'appareil de la théorie des ensembles de traitement de données sur le dispositif (association, intersection, différence, travail décartitien). Il a prouvé que tout ensemble de données peut être représenté comme des tables bidimensionnelles d'une espèce spéciale connue en mathématiques comme une "relation".

Relationnelcette base de données est considérée, dans laquelle toutes les données sont présentées à l'utilisateur sous la forme de tables rectangulaires de valeurs de données et toutes les opérations via la base de données sont réduites à des manipulations avec des tables.

La table se compose de colonnes (champs)et lignes (entrées);il a un nom unique dans la base de données. Tableauréfléchir type d'objetvrai mira (Essence),et tout le monde objet spécifique à la chaîne.Chaque colonne Table est un ensemble de valeurs d'un attribut d'objet spécifique. Les valeurs sont sélectionnées dans l'ensemble de toutes les valeurs possibles de l'attribut d'objet, appelée domaine (domaine).

Dans la forme la plus générale, le domaine est déterminé par la tâche d'un certain type de données de base auxquels les éléments de domaine et une expression logique arbitraire appliquée aux éléments de données. Si, lors du calcul d'une condition logique concernant l'élément de données, la valeur de "vérité" est obtenue, alors cet élément appartient au domaine. Dans le cas le plus simple, le domaine est défini comme un ensemble potentiel admissible d'un type de valeurs. Par exemple, la totalité de la date de la naissance de tous les employés est un "domaine de la date de la date" et les noms de tous les employés constituent les "noms de domaine des employés". Le domaine des dates de naissance a un type de données qui vous permet de stocker des informations sur l'heure du temps et que les noms de domaine des employés doivent avoir un type de caractères de données.

Si deux valeurs sont extraites dans le même domaine, vous pouvez comparer ces deux valeurs. Par exemple, si deux valeurs sont extraites du domaine de la base de données, vous pouvez les comparer et déterminer qui des employés plus âgés. Si les valeurs sont extraites de différents domaines, leur comparaison n'est pas autorisée, car, dans toutes les chances, cela n'a pas de sens. Par exemple, à partir de la comparaison du nom et de la date de la naissance d'un employé, rien de définitif ne sera libéré.

Chaque colonne (champ) a un nom qui est généralement écrit en haut de la table. Lors de la conception de tables dans un SGBM spécifique, il est possible de choisir pour chaque champ un type,c'est-à-dire pour déterminer l'ensemble de règles pour son affichage et identifier ces opérations pouvant être effectuées sur les données stockées dans ce champ. Les ensembles de type peuvent varier de différents SGBD.

Le nom de champ doit être unique dans la table, mais des tables différentes peuvent avoir des champs avec le même nom. Toute table doit avoir au moins un champ; Les champs sont situés dans le tableau conformément à la procédure de suivi de leurs noms lors de sa création. Contrairement aux champs, les chaînes ne sont pas des noms; L'ordre de leur suit dans le tableau n'est pas défini et le nombre est logiquement illimité.

Étant donné que les rangées de la table ne sont pas commandées, il est impossible de choisir une chaîne dans sa position - parmi elles, il n'y a pas de "premier", "Deuxième", "Dernier". Toute table a une ou plusieurs colonnes, les valeurs dans lesquelles sont identifiés de manière unique chaque ligne. Une telle colonne (ou une combinaison de colonnes) est appelée touche principale (clé primaire). Un champ artificiel est souvent introduit, destiné aux enregistrements de numérotation dans la table. Un tel domaine, par exemple, peut être son ordinal, qui sera en mesure d'assurer le caractère unique de chaque entrée du tableau. La clé doit avoir les propriétés suivantes.

Unique.À tout moment du temps, aucune autre relation différente n'a la même valeur pour combiner les attributs inclus dans la clé. C'est-à-dire que la table ne peut pas être deux lignes ayant le même numéro d'identification ou le même numéro de passeport.

Minimalité.Aucun des attributs entrants ne peut être exclu de la clé sans perturber l'unicité. Cela signifie que vous ne devez pas créer une clé qui inclut le numéro de passeport et le numéro d'identification. Il suffit d'utiliser l'un de ces attributs pour identifier de manière unique l'intendant. Il n'est pas nécessaire d'inclure un attribut non public à la clé, c'est-à-dire qu'il est interdit d'utiliser comme une combinaison clé du numéro d'identification et du nom de l'employé. Avec l'exclusion du nom de l'employé de la clé, vous pouvez toujours être identifié de manière unique chaque chaîne.

Chaque attitude a au moins une clé possible, car la totalité de tous ses attributs satisfait à la condition de l'unicité - cela découle de la détermination même de la relation.

Une des clés possibles est arbitrairement sélectionnée dans comme clé primaire.Le reste des clés possibles, s'il y a, sont acceptés pour touches alternatives.Par exemple, si vous sélectionnez un numéro d'identification comme clé principale, le numéro de passeport sera une clé alternative.

La relation des tables est un élément essentiel du modèle de données relationnelle. Il est soutenu clés externes (clé étrangère).

Lorsque vous décrivez le modèle de la base de données relationnelle pour le même concept, divers termes sont souvent utilisés, qui dépend du niveau de description (théorie ou pratique) et au système (accès, SQL Server, dBase). Dans l'onglet. 2.3 Résumé des termes utilisés.

Tableau 2.3.Bases de données Terminology

Théorie de la base de données ____________ Base de données relationnelle _________ SQL Server __________

Tableau de la relation (tableau) (tableau)

Enregistrement de tuple (rangée) (rangée)

Champ d'attribut (champ) _______________ colonne ou colonne (colonne)

Bases de données relationnelles

Base de données relationnelle- Il s'agit d'un ensemble de relations contenant toutes les informations qui doivent être stockées dans la base de données. C'est-à-dire que la base de données est un ensemble de tables requises pour stocker toutes les données. Les tables de base de données relatives sont logiquement liées à l'autre. Les exigences de la conception de la base de données relationnelle sous une forme générale peuvent être réduites à plusieurs règles.

À propos de chaque table a un nom unique dans la base de données et consiste en un même type de lignes.

À propos de chaque table consiste en un nombre fixe de colonnes et de valeurs. Dans une colonne d'une rangée, plus d'une valeur ne peut pas être enregistrée. Par exemple, s'il existe une table avec des informations sur l'auteur, la date de publication, un régime, etc., puis dans la colonne avec le nom de l'auteur ne peut pas être conservé plus d'un nom. Si le livre est écrit en deux auteurs et plus, vous devrez utiliser des tables supplémentaires.

Plus de temps dans la table ne dispose pas de deux lignes en doublant mutuellement. Les rangées doivent différer au moins une valeur pour pouvoir identifier sans ambiguïté n'importe quelle ligne de la table.

À propos de chaque colonne est attribué un nom unique dans la table; Un type de données spécifique est installé pour celui-ci de sorte que dans cette colonne, il existe des valeurs homogènes (dates, noms de famille, téléphones, sommets, etc.).

À propos du contenu complet des informations de la base de données est présenté sous la forme de valeurs explicites des données elles-mêmes, et cette méthode de présentation est la seule. Par exemple, la connexion entre les tableaux est effectuée sur la base de colonnes de données stockées, et non sur la base de tout pointeurs, déterminant artificiellement la communication.

O Lors du traitement des données, vous pouvez accéder librement de n'importe quelle ligne ou toute colonne de table. Les valeurs stockées dans la table n'imposent aucune restriction sur demande de données. Description de la colonne,

Toutes les bases de données modernes utilisent la CBO (optimisation basée sur les coûts), optimisation des coûts. Son essence réside dans le fait que, pour chaque opération, il est déterminé par son "coût", puis le coût total de la demande est réduit en utilisant les chaînes d'opérations les plus "bon marché".

Pour une meilleure compréhension de l'optimisation des coûts, nous examinerons trois manières courantes de combiner les deux tables et de voir comment même une simple demande d'union peut devenir un cauchemar pour un optimiseur. Dans notre examen, nous nous concentrerons sur la complexité temporaire, bien que l'optimiseur calcule le «coût» dans les ressources du processeur, de la mémoire et des opérations d'E / S. Il suffit de complexité temporelle - le concept est approximatif et de déterminer les ressources du processeur nécessaires, vous devez compter toutes les opérations, y compris l'addition, si les opérateurs, la multiplication, l'itération, etc.

En outre:

  • Pour effectuer chaque opération de haut niveau, le processeur effectue un nombre différent d'opérations de bas niveau.
  • Le coût des opérations de processeur (du point de vue des cycles) est différent de différents types de transformateurs, c'est-à-dire que cela dépend de l'architecture spécifique de la CPU.
Par conséquent, nous serons plus faciles à évaluer sous forme de difficulté. Mais rappelez-vous que le plus souvent, la performance de la base de données est limitée au sous-système de disque et non aux ressources du processeur.

Nous leur avons parlé lorsque nous avons été considérés dans les arbres. Comme vous vous en souvenez, les index sont déjà triés. Au fait, il existe d'autres types d'index, tels que bitmap (index bitmap). Mais ils ne gagnent pas du point de vue de l'utilisation du processeur, de la mémoire et du sous-système de disque par rapport aux index des arbres. De plus, de nombreuses bases de données modernes peuvent créer de manière dynamique des index temporaires pour les requêtes en cours, si cela aide à réduire le coût de l'exécution du plan.

4.4.2. Méthodes d'appel

Avant d'appliquer les opérateurs syndicaux, vous devez d'abord obtenir les données nécessaires. Cela peut être fait de la manière suivante.

  • Scan complet. La base de données lit simplement la table entière ou l'index. Comme vous le comprenez, l'index du sous-système de disque est moins cher que la table.
  • Balayage de la plage. Utilisé, par exemple, lorsque vous utilisez des prédicats comme où Âge\u003e 20 ans et âge< 40. Конечно, для сканирования диапазона индекса вам нужно иметь индекс для поля AGE.

    Dans la première partie de l'article, nous avons déjà découvert que la complexité temporelle de la demande de plage est définie comme m + journal (n), où n est la quantité de données dans l'index et m est un nombre estimé de lignes à l'intérieur. la gamme. Les valeurs de ces deux variables nous sont connues en raison de statistiques. Lors de la numérisation de la plage, seule une partie de l'index est lue, de sorte que cette opération coûte moins que la balayage complète.

  • Numérisation pour des valeurs uniques. Utilisé dans les cas où vous devez obtenir de l'index uniquement une certaine valeur.
  • Appel par identification de ligne. Si la base de données utilise l'index, il s'agira d'une question de temps pour rechercher des lignes associées. Par exemple, nous faisons une telle demande:

    Sélectionnez Nom, prénom de la personne où Âge \u003d 28
    Si nous avons un index pour la colonne d'âge, l'optimiseur utilisera l'index pour rechercher tous les 28 ans, puis demande l'ID des lignes de table correspondantes, car l'index contient uniquement des informations.

    Supposons que nous ayons une autre demande:

    Sélectionnez Type_Person.Category à partir de personne, Type_Person où Person.age \u003d Type_Person.age
    Pour combiner avec Type_Person, une index sur la colonne Personne. Mais puisque nous n'avons pas demandé des informations à la table de la personne, personne ne s'allumera sur ID ID.

    Cette approche n'est bonne qu'avec un petit nombre d'appels, car il est cher du point de vue des E / S. Si vous avez besoin de contacter souvent ID, il est préférable d'utiliser une balayage complète.

  • Autres méthodes. Vous pouvez lire sur la documentation Oracle. Différentes bases de données peuvent utiliser différents noms, mais les principes partout sont les mêmes.
4.4.3. Opérations de communication

Nous savons donc obtenir des données, il est temps de les combiner. Mais d'abord, décidons de nouveaux termes: dépendances intérieures et dépendances externes. La dépendance peut être:

  • tableau,
  • indice,
  • résultat intermédiaire de l'opération précédente (par exemple, l'association précédente).
Lorsque nous combinons deux dépendances, les algorithmes d'association les contrôlent de différentes manières. Supposons qu'une jointure B est une association A et B, où a est une dépendance externe et intérieure.

Le plus souvent coûte une jointure B n'est pas égal à la valeur de b joint A.

Supposons que la dépendance externe contienne n éléments et interne - M. Comment vous souvenez-vous que ces valeurs sont connues de l'optimiseur en raison de statistiques. N et m sont des dépendances fondamentales.

  • Combinaison avec des cycles imbriqués. C'est le moyen le plus simple de combiner.

    Cela fonctionne comme ceci: pour chaque ligne de dépendance externe, la coïncidence est saisie sur toutes les lignes de dépendance interne.

    Un exemple de pseudoduekode:

    Niché_loop_join (tableau extérieur, array intérieure) Pour chaque ligne A dans l'extérieur pour chaque rangée B en intérieur si (match_join_condition (A, B)) Write_Result_in_output (A, B) fin si fin pour fin
    Comme il y a une double itération, la complexité temporaire est définie comme O (n * m).

    Pour chacune des n chaînes de dépendance externe, il est nécessaire de considérer m lignes de dépendance externe. C'est-à-dire que cet algorithme nécessite n + n * m lectures du disque. Si la dépendance interne suffit, elle peut être placée entièrement en mémoire, puis seules les lectures M + N devront partager le sous-système de disque. Il est donc recommandé de faire une dépendance interne aussi compacte que possible de conduire en mémoire.

    Du point de vue de la différence de temps, aucune différence.

    Vous pouvez également remplacer la dépendance interne de l'index, cela permettra d'enregistrer une opération d'entrée / sortie.
    Si la dépendance interne ne rentre pas dans toute la mémoire, vous pouvez utiliser un autre algorithme, plus économiquement à l'aide du disque.

    • Au lieu de lire les deux centaines de dépendances, ils sont lus par des groupes de chaînes (BUNCH), tandis que dans la mémoire est stockée sur un groupe de chaque dépendance.
    • Les rangées de ces groupes sont comparées les unes aux autres et les coïncidences trouvées sont préservées séparément.
    • Ensuite, de nouveaux groupes sont chargés en mémoire et sont également comparés.
    Et ainsi de suite, alors que les groupes ne sont pas terminés.

    Un exemple de l'algorithme:

    // Version améliorée pour réduire le disque I / O. niché_loop_join_v2 (fichier extérieur, fichier intérieur) pour chaque bouquet BA dans extérieur // BA est maintenant en mémoire pour chaque bouquet BB dans interne // BB est maintenant en mémoire pour chaque ligne A en BA pour chaque_join_indition (A, B)) Write_Result_in_output ( a, b) fin si fin pour la fin pour la fin pour la fin pour
    Dans ce cas, la complexité de temps reste la même, mais le nombre d'appels au disque est réduit: (nombre de groupes de groupes externes + nombre de groupes de groupes externes * de groupes internes). Avec une taille croissante de groupe, le nombre d'appels au disque est encore plus réduit.

    Remarque: Dans cet algorithme, une plus grande quantité de données est lue à chaque fois, mais elle ne joue pas de rôles en tant que conversion de conversion.

  • HAS-Association. Il s'agit d'une opération plus complexe, mais dans de nombreux cas, sa valeur est plus faible.

    L'algorithme est le suivant:

    1. Tous les éléments sont lus de la dépendance interne.
    2. La mémoire crée une table de hachage.
    3. L'un après l'autre a lu tous les éléments de la dépendance externe.
    4. Le hachage est calculé pour chaque élément (en utilisant la fonction appropriée de la table de hachage) afin que le bloc correspondant puisse être trouvé dans la dépendance interne.
    5. Les éléments du bloc sont comparés aux éléments de la dépendance externe.
    Pour évaluer cet algorithme du point de vue de la complexité temporaire, vous devez faire plusieurs hypothèses:
    • La dépendance interne contient des blocs x.
    • La fonction de hachage distribue hashi presque également pour les deux dépendances. C'est-à-dire que tous les blocs sont identiques.
    • Le coût de la recherche de la correspondance entre les éléments de la dépendance extérieure et tous les éléments à l'intérieur du bloc est égal au nombre d'éléments à l'intérieur du bloc.
    Ensuite, la complexité temporelle sera égale à:

    (M / x) * (N / x) + COST_IVA_HASH-TABLE (M) + Fonction COST_HASH * N

    Et si la fonction de hachage crée suffisamment de petits blocs, la complexité de temps sera égale à (M + N).

    Il existe une autre façon d'une association de hash, de la mémoire de dépenser plus économiquement et n'exige pas plus d'opérations d'E / S:

    1. Les tables de hachage sont calculées pour les deux dépendances.
    2. Achat au disque.
    3. Puis comparé comportementalement les uns avec les autres (un bloc est chargé en mémoire et la deuxième ligne de lecture).
    Fusionner fusion. C'est le seul moyen de combiner, à la suite de laquelle les données sont obtenues triées. Dans le cadre de cet article, nous considérons un cas simplifié lorsque les dépendances ne sont pas divisées en externe et interne, car elles se comportent de manière égale. Cependant, dans la vie, ils peuvent varier, disons quand travailler avec des doublons.

    L'opération de combinaison peut être divisée en deux étapes:

    1. (Facultatif) Tout d'abord, le tri est mis en œuvre pour la première fois lorsque les deux ensembles de données d'entrée sont triés en combinant les touches.
    2. Ensuite, la fusion est effectuée.
    Tri

    L'algorithme de tri de fusion a déjà été discuté ci-dessus, dans ce cas, il se justifie, s'il est important pour vous de sauvegarder la mémoire.

    Mais il arrive que les ensembles de données arrivent déjà triés, par exemple:

    • Si la table est organisée de manière native.
    • Si la dépendance est un index s'il y a une condition de combinaison.
    • Si le syndicat se produit avec un résultat trié intermédiaire.
    Combiner la fusion

    Cette opération est très similaire à la fonctionnement de la fusion avec une procédure de tri fusionnée. Mais au lieu de choisir tous les éléments des deux dépendances, nous ne sélectionnons que des éléments égaux.

    1. Deux éléments actuels des deux dépendances sont comparés.
    2. S'ils sont égaux, ensuite enregistrés dans la table résultante, puis les deux éléments suivants sont comparés, une de chaque dépendance.
    3. S'ils ne sont pas égaux, la comparaison est répétée, mais au lieu du plus petit des deux éléments, l'élément suivant est extrait de la même dépendance, car la probabilité de coïncidence dans ce cas est plus élevée.
    4. Les étapes 1 à 3 sont répétées jusqu'à ce que les éléments d'une dépendance soient terminés.
    Si les deux dépendances sont déjà triées, la complexité de temps est égale à (N + M).

    Si les deux dépendances doivent encore être triées, la complexité temporelle est égale à O (n * journal (n) + m * journal (m)).

    Cet algorithme fonctionne bien, car les deux dépendances sont déjà triées et que nous n'avons pas à vous déplacer. Cependant, une certaine simplification est autorisée ici: l'algorithme ne procède pas à des situations lorsque les mêmes données sont trouvées à plusieurs reprises, c'est-à-dire lorsque plusieurs correspondances se produisent. En réalité, une version plus complexe de l'algorithme est utilisée. Par example:

    Mergejoin (Relation A, relation B) Relation Sortie Integer A_Key: \u003d 0; INTEGER B_KEY: \u003d 0; Tandis que (a! \u003d Null et b! \u003d Null) si (a< b) a_key++; else if (a > b) b_key ++; Else // joindre prédicat satisfait Write_Result_in_output (A, B) // Nous devons faire attention lorsque nous augmentons les pointeurs entier A_KEY_TEMP: \u003d A_KEY; INTEGER B_KEY_TEMP: \u003d B_KEY; Si (A! \u003d B) B_KEY_TEMP: \u003d B_KEY + 1; Fin si si (b! \u003d A) a_key_temp: \u003d a_key + 1; Fin si si (b \u003d\u003d a && b \u003d\u003d a) a_key_temp: \u003d a_key + 1; B_KEY_TEMP: \u003d B_KEY + 1; Fin si a_key: \u003d a_key_tem; B_key: \u003d b_key_temp; Fin si fin pendant

Quel algorithme choisir?

S'il y avait le meilleur moyen de fusionner, toutes ces variétés existeraient. La réponse à cette question dépend donc du tas de facteurs:

  • Le volume de la mémoire disponible. Si ce n'est pas suffisant, oubliez une puissante association de hash. Au moins sur son accomplissement de la mémoire entière.
  • La taille de deux ensembles d'entrée. Si vous avez une table importante et la seconde est très petite, l'Union travaillera plus rapidement avec des cycles imbriqués, car l'association Hash implique une procédure coûteuse de création d'un hachage. Si vous avez deux très grandes tables, l'association utilisant des cycles imbriquées absorbera toutes les ressources du processeur.
  • La présence d'index. Si vous avez deux index dans des arbres, il est préférable d'utiliser la fusion de fusion.
  • Est-il nécessaire de trier le résultat? Vous voudrez peut-être utiliser une combinaison de fusion coûteuse (avec tri) si vous travaillez avec des ensembles de données non formés. Ensuite, à la sortie, vous recevrez des données assorties plus pratiques à combiner avec les résultats d'un autre syndicat. Ou parce que la demande indique indirectement ou clairement l'obtention de données triés par ordre par / groupe par / des opérateurs distincts.
  • Les dépendances de sortie sont-elles triées. Dans ce cas, il est préférable d'utiliser Merge Union.
  • Quels types de dépendances que vous utilisez. Combinaison d'équivalence (table. Solonka1 \u003d tableb.Colonka2)? Dépendances intérieures, travail externe, décartienne ou auto-relief (auto-join)? Dans différentes situations, certaines méthodes d'union ne fonctionnent pas.
  • Distribution de données. Si les données sont rejetées par la condition de l'association (par exemple, vous combinez des personnes par leur nom, mais parfois il y a des nabases), en aucun cas ne peut utiliser l'association de hasch. Sinon, la fonction de hachage créera des paniers avec une très mauvaise distribution interne.
  • Avez-vous besoin de fusionner dans plusieurs processus / ruisseaux?
Les connaissances habituelles peuvent approfondir la documentation DB2, Oracle et SQL Server.

4.4.4. Exemples simplifiés

Supposons que nous ayons besoin de combiner cinq tables pour obtenir une idée complète de certaines personnes. Tout le monde peut avoir:

  • Plusieurs numéros de téléphone mobile.
  • Plusieurs adresses électroniques.
  • Plusieurs adresses physiques.
  • Plusieurs numéros de compte bancaire.
C'est-à-dire que vous devez répondre rapidement à cette demande:

Sélectionnez * à partir de personne, mobiles, mails, adresses, bank_accounts où Person.person_id \u003d mobiles.person_id et personne.person_id \u003d mails.person_id et personne.Person_id \u003d adressesseSess.person_id et personne.Person_id \u003d Bank_accounts.Person_ID
Optimizer besoin de trouver meilleur moyen Traitement de l'information. Mais il y a deux problèmes:

  1. Quel est le moyen d'utiliser? Il existe trois options (association de hash, fusion, combinaison avec des cycles imbriqués), avec la possibilité d'utiliser 0, 1 ou 2 index. Sans parler du fait que les indices peuvent également être différents.
  2. Quel ordre doit être fait?
Par exemple, ce qui suit sont des plans possibles pour trois associations de quatre tables:

Basé sur les décrits, quelles sont les options d'action?

  1. Utilisez Brutfors-approche. Avec l'aide de statistiques, calculez le coût de chacun des plans d'exécution possibles et choisissez le moins cher. Mais il y a beaucoup d'options. Pour chaque commande de combinaison, vous pouvez utiliser trois de différentes manières Association, Total 34 \u003d 81 plans d'exécution possibles. Dans le cas d'un arbre binaire, la tâche de sélectionner une commande de combinaison se transforme en une tâche de permutation et le nombre d'options est égal à (2 * 4)! / (4 + 1) !. En conséquence, dans cet exemple très simplifié, le nombre total de plans possibles d'exécution de la demande est de 34 * (2 * 4)! / (4 + 1)! \u003d 27 216. Si vous ajoutez à cette option lorsque la fusion est utilisée 0, 1 ou 2 indice en bois, le nombre de plans possibles augmente à 210 000. Nous avons déjà mentionné qu'il s'agit d'une demande très simple?
  2. Swamp and Quittez. Très séduisant, mais improductif et de l'argent est nécessaire.
  3. Essayez plusieurs plans et choisissez le moins cher. Une fois qu'il est impossible de calculer le coût de toutes les options possibles, vous pouvez prendre un jeu de données de test arbitraire et conduire toutes sortes de plans pour évaluer leurs coûts et choisir le meilleur.
  4. Appliquez des règles «intelligentes» pour réduire le nombre de plans possibles.
    Il existe deux types de règles:
    1. "Logique", avec laquelle vous pouvez exclure des options inutiles. Mais ils ne sont pas toujours applicables. Par exemple, "lorsqu'il est combiné avec des cycles imbriqués, la dépendance interne doit être le plus petit ensemble de données."
    2. Vous ne pouvez pas rechercher la solution la plus favorable et appliquer des règles plus strictes pour réduire le nombre de plans possibles. Disons: "Si la dépendance est petite, nous utilisons la combinaison avec l'aide de cycles imbriqués, mais n'entraîne jamais une combinaison de fusion ni de hasch."
Même un exemple aussi simple nous libère devant une énorme sélection. Et d'autres opérateurs de relations peuvent être présents en quantités réelles: une jointure extérieure, une jointure croisée, un groupe par, l'ordre par, la projection, l'union, l'intersection, distinct, etc. C'est-à-dire que le nombre de plans d'exécution possibles sera encore plus.

Alors, comment choisit la base de données?

4.4.5. Programmation dynamique, algorithme "gourmand" et heuristique

La base de données relationnelle utilise différentes approches mentionnées ci-dessus. Et la tâche de l'optimiseur est de rechercher une solution appropriée pour un temps limité. Dans la plupart des cas, l'optimiseur ne cherche pas le meilleur, mais juste une bonne solution.

Brutfors peut convenir en cas de petites demandes. Et grâce à des méthodes d'exclusion des calculs inutiles, même pour les demandes de taille moyenne peuvent être utilisées par la force masculine grossière. Ceci s'appelle une programmation dynamique.

Son essence réside dans le fait que de nombreux plans d'exécution sont très similaires.

Sur cette illustration, les quatre plans sont utilisés par le soutien d'une jointure B. Au lieu de calculer sa valeur pour chaque plan, nous ne pouvons le calculer qu'une fois, puis utiliser ces données autant que nécessaire. En d'autres termes, avec l'aide de la mémoisation, nous résolvons le problème du chevauchement, c'est-à-dire éviter l'informatique inutile.

Grâce à cette approche au lieu de la complexité (2 * N)! / (N + 1)! Nous obtenons "juste" 3 n. En ce qui concerne l'exemple précédent avec quatre associations, cela signifie une diminution du nombre d'options de 336 à 81. Si vous prenez une demande avec 8 associations (une petite demande), une diminution de la complexité sera de 57 657 600 à 6 561.

Si vous connaissez déjà une programmation dynamique ou une algorithmisation, vous pouvez vous y jouer avec cet algorithme:

Procédure FindBestPlan (s) Si (Bestplan [S] .Cost Infinite) Retour Bestplan [S] // Sinon Bestplan [S] n'a pas été calculé plus tôt, calculez-le maintenant si (S contient seulement 1 relation) Set Bestplan [S]. Plan et bestplan [s] .cost basé sur la meilleure façon d'accéder à S / * à l'aide de sélections sur s et indices sur s * / else pour chaque sous-ensemble non vide S1 de s tel que S1! \u003d S P1 \u003d FindBestplan (S1) P2 \u003d FindBestPlan (S - S1) A \u003d meilleur algorithme de joignant Résultats de P1 et P2 Coût \u003d P1.Cost + P2.Cost + Coût de A si coût< bestplan[S].cost bestplan[S].cost = cost bestplan[S].plan = “execute P1.plan; execute P2.plan; join results of P1 and P2 using A” return bestplan[S]
La programmation dynamique peut également être utilisée pour des questions plus vastes, mais devra introduire des règles supplémentaires (heuristiques) afin de réduire le nombre de plans possibles:


Algorithmes gourmands

Mais si la demande est très importante ou si nous devons obtenir rapidement une réponse, une autre classe d'algorithmes sont utilisées - des algorithmes gourmands.

Dans ce cas, le plan d'exécution de la requête est résolu avec une certaine règle (heuristique). Grâce à lui, l'algorithme gourmand cherche meilleure solution Pour chaque étape séparément. Le plan commence par la déclaration de jointure, puis à chaque étape, la nouvelle jointure est ajoutée conformément à la règle.

Considérer un exemple simple. Prenez une demande avec 4 associations 5 tables (A, B, C, D et E). Plusieurs simplifie la tâche et imaginez que la seule option est de combiner à l'aide d'algorithmes imbriqués. Nous utiliserons la règle "Appliquer une association avec le coût le plus bas".

  • Nous commençons par l'une des tables, par exemple, A.
  • Calculez le coût de chaque syndicat avec un (il sera à la fois dans le rôle de la dépendance externe et interne).
  • Nous constatons que les moins chers nous allons nous coûter à nous rejoindre B.
  • Ensuite, nous calculons le coût de chaque combinaison avec le résultat A rejoint B (il est également pris en compte dans deux rôles).
  • Nous constatons que le plus rentable sera (une join B) rejoindre C.
  • Encore une fois, nous procédons à une évaluation des options possibles.
  • À la fin, nous obtenons un tel plan d'exécution de requête: ((((join B) rejoindre c) JOIN D) JOIN E) /
Le même algorithme peut être appliqué pour estimer les options à partir du tableau B, puis avec C, etc. En conséquence, nous obtenons cinq plans à partir desquels vous choisissez le moins cher.

Cet algorithme s'appelle "l'algorithme du voisin le plus proche".

Nous ne ferons pas approfondir les détails, mais avec une bonne modélisation de la complexité du tri * log (n), ce problème peut être. La complexité de temps de l'algorithme est égale à (n * log (n)) au lieu de (3 N) pour version complète Avec programmation dynamique. Si vous avez une grande demande avec 20 associations, elle sera 26 contre 3 486 784 401. Une grande différence, non?

Mais il y a une nuance. Nous supposons que si vous trouvez la meilleure façon de combiner deux tables, nous obtenons le coût le plus bas lorsque vous combinez le résultat d'associations précédentes avec les tableaux suivants. Cependant, même si une jointure B est l'option la moins chère, alors (une jointure C) rejoindre B peut avoir un coût inférieur à (une join B) rejoindre C.

Donc, si vous devez trouver le plan le moins cher pour tous les temps et les peuples, vous pouvez consulter plusieurs algorithmes gourmands à l'aide de règles différentes.

Autres algorithmes

Si vous êtes déjà alimenté par tous ces algorithmes, vous pouvez ignorer ce chapitre. Il n'est pas nécessaire d'assimiler le reste du matériel.

De nombreux chercheurs sont engagés dans le problème de la recherche du meilleur plan d'exécution de la requête. Essayez souvent de trouver des solutions pour certaines tâches et modèles spécifiques. Par exemple, pour les associations d'étoiles, l'exécution de demandes parallèles, etc.

Les options pour remplacer la programmation dynamique sont recherchées pour l'exécution de grandes requêtes. Les mêmes algorithmes gourmands sont un sous-ensemble d'algorithmes heuristiques. Ils agissent selon la règle, rappelez-vous le résultat d'une étape et utilisez-le pour rechercher une meilleure option pour la prochaine étape. Et des algorithmes qui n'utilisent pas toujours la solution trouvée pour la scène précédente sont appelés heuristiques.

Par exemple, des algorithmes génétiques peuvent être apportés:

  • Chaque solution est un plan d'exécution complète.
  • Au lieu d'une solution (plan), l'algorithme à chaque étape forme x solutions.
  • Tout d'abord, il est créé x plans, cela se fait au hasard.
  • Seuls ces plans, dont le coût satisfait à certains critères.
  • Ensuite, ces plans sont mélangés pour créer x nouveaux plans.
  • Certains des nouveaux plans sont modifiés au hasard.
  • Les trois étapes précédentes sont répétées y fois.
  • Parmi les plans du dernier cycle, nous obtenons le meilleur.
Que plus de cyclesDe plus, le plan le moins cher peut être calculé. Sélection naturelle, signes de fixation, c'est tout cela.
À propos, des algorithmes génétiques sont intégrés à PostgreSQL.

Les algorithmes eureux sont utilisés dans la base de données comme recuit simulé, amélioration itérative (amélioration itérative), optimisation à deux phases (optimisation en deux phases). Mais pas le fait qu'ils soient appliqués dans systèmes d'entreprisePeut-être que leur lot est des produits de recherche.

4.4.6. Véritables optimiseurs

Aussi un chapitre facultatif, vous pouvez sauter.

Tirons de théoriser et de considérer des exemples réels. Par exemple, comment fonctionne l'optimiseur SQLITE. Il s'agit d'une base de données "lumière" utilisant une optimisation simple basée sur l'algorithme gourmand avec des règles supplémentaires:

  • SQLite ne modifie jamais l'ordre des tables dans les opérations de jointure croisée.
  • Une combinaison avec des cycles imbriqués est utilisée.
  • Les associations externes sont toujours évaluées dans l'ordre dans lequel elles ont été réalisées.
  • Jusqu'à la version 3.8.0 Pour rechercher le meilleur plan de requête, un algorithme gourmand "voisin le plus proche" est utilisé (voisin près). Et à partir de la version 3.8.0, "N voisins à proximité" est utilisé (N3, N voisins les plus proches).
Mais un autre exemple. Si vous lisez la documentation IBM DB2, nous apprenons que son optimiseur utilise 7 niveaux d'optimisation différents:
  • Algorithmes gourmands:
    • 0 - Optimisation minimale. Une analyse d'index est utilisée, combinant avec des cycles imbriqués et une exclusion écrasant certaines demandes.
    • 1 - Faible optimisation
    • 2 - Optimisation complète
  • Programmation dynamique:
    • 3 - Optimisation moyenne et approximation rudée
    • 5 - Optimisation complète, utilisez toutes les techniques heuristiques
    • 7 - le même, mais sans heuristique
    • 9 - Optimisation maximale à tout prix, sans tenir compte des efforts déployés. Tout est évalué méthodes possibles Association, y compris des œuvres cartésiennes.
Le niveau par défaut est appliqué 5. Cela inclut:
  • Collecter toutes les statistiques possibles, y compris fréquence des distributions Et quantil.
  • Appliquez toutes les règles de réécriture de la requête, y compris la création d'une route tabulaire pour des requêtes matérialisées). L'exception concerne les règles nécessitant une informatique intensive utilisée pour très nombre limité Cas.
  • Lors de la combinaison de modes de réalisation à l'aide de la programmation dynamique:
    • La dépendance interne composite est limitée.
    • Pour les schémas en forme d'étoile avec des tables de conversion, des œuvres cartésiennes sont limitées.
  • Une large gamme de méthodes d'accès est prise en compte, y compris une liste de prévisualisation de la liste (à propos de celle-ci ci-dessous), une opération spéciale avec des index et compiler une route tabulaire pour des requêtes matérialisées.
Bien entendu, les développeurs ne sont pas divisés par les détails des heuristiques utilisées dans leur produit, car l'optimiseur n'est guère la partie la plus importante de la base de données. Cependant, il est connu que par défaut, une programmation dynamique limitée aux heuristiques est utilisée pour déterminer la commande de combinaison.

D'autres conditions (groupe par distinctes, etc.) sont traitées par des règles simples.

4.4.7. Demandes de plan de cache

Étant donné que la préparation du plan prend du temps, la majeure partie de la base de données stocke le plan dans le cache du plan de demande. Il aide à éviter des calculs inutiles des mêmes étapes. La base de données devrait savoir quand elle doit mettre à jour les plans obsolètes. Pour cela, un certain seuil est installé et si des modifications de ses statistiques dépassent, le plan relatif à ce tableau est supprimé du cache.

Demandes de l'entrepreneur

À ce stade, notre plan est déjà optimisé. Il est recompanté dans le code exécutable et, si les ressources suffisent, exécutées. Les opérateurs contenus dans le plan (jointure, trier par, etc.) peuvent être traités à la fois en succession et en parallèle, la décision prend l'entrepreneur. Pour recevoir et écrire des données, il interagit avec le répartiteur de données.

5. Gestionnaire de données


Le gestionnaire de demandes exécute la demande et nécessite des données des tables et des index. Il les demande au répartiteur de données, mais il y a deux difficultés:

  • Les bases de données relationnelles utilisent un modèle transactionnel. Il est impossible d'obtenir des données souhaitées à un point particulier, car à ce moment-là, ils peuvent être utilisés / modifiés par une personne.
  • L'extraction des données est l'opération la plus lente de la base de données. Par conséquent, le répartiteur de données doit pouvoir prédire ses travaux afin de remplir le tampon de la mémoire de manière en temps utile.

5.1. Dispatteur de cache

Comme déjà mentionné, l'endroit le plus étroit de la base de données est le sous-système de disque. Par conséquent, le répartiteur de cache est utilisé pour augmenter les performances.

Au lieu d'obtenir des données directement à partir du système de fichiers, la requête se réfère à celle-ci au répartiteur de cache. Il utilise la piscine tampon contenue dans la mémoire, ce qui permet d'augmenter radicalement les performances de la base de données. En chiffres, il est difficile d'apprécier, car beaucoup dépend de ce dont vous avez besoin:

  • Accès série (numérisation complète) ou aléatoire (accès via ID).
  • Lire ou enregistrer.
Il est également d'une grande importance pour le type de lecteurs utilisés dans le système de disque: "Winchesters" avec vitesse différente Rotation de la broche, SSD, présence RAID dans différentes configurations. Mais nous pouvons dire que l'utilisation de la mémoire 100-100 000 fois plus rapidement que le disque.

Cependant, ici, nous sommes confrontés à un autre problème. Le répartiteur de cache doit être mis en mémoire avant d'avoir besoin d'un exécuteur exécutif de demandes. Sinon, cela devra les attendre d'un disque lent.

5.1.1. Nu

L'exécuteur des demandes sait quelles données seront nécessaires, car elles sont connues de lui l'ensemble du plan, quelles données sont contenues sur le disque et les statistiques.

Lorsque l'interprète traite la première partie des données, il demande au répartiteur du cache à l'avance de charger la partie suivante. Et quand il passe à son traitement, demande à DC de charger le troisième et confirme que la première partie peut être retirée du cache.

Le responsable du cache stocke ces données dans le pool tampon. Il y ajoute également des informations de service (déclencheur, verrou) pour savoir si elles ont besoin de même dans le tampon.

Parfois, l'artiste ne sais pas quelles données seront nécessaires, ou certaines bases de données n'ont pas de ce fonctionnement. Ensuite, la préparation spécifique (par exemple, si l'entrepreneur demande des données 1, 3, 5, alors demande sûrement 7, 9, 11) ou une préparation séquentielle (préfet séquentielle) (dans ce cas, le CC charge simplement les éléments suivants par l'ordre de disque partie de données.

Nous ne devons pas oublier que le tampon est limité par le volume de la mémoire disponible. C'est-à-dire de télécharger certaines données, nous devons supprimer périodiquement les autres. Remplissage et nettoyage Le cache consomme certaines des ressources du sous-système de disque et du réseau. Si vous avez une demande fréquemment exécutable, ce serait une contre-productive à chaque fois pour télécharger et nettoyer les données utilisées par elle. Pour résoudre ce problème dans la base de données moderne, une stratégie de remplacement tampon est utilisée.

5.1.2. Stratégies de remplacement tampon

La plupart des bases de données (au moins SQL Server, MySQL, Oracle et DB2) utilisent l'algorithme LRU pour cela (moins récemment utilisé). Il est conçu pour maintenir dans le cache de ces données récemment utilisées, ce qui signifie la plus grande probabilité qu'ils puissent avoir besoin à nouveau.

Pour faciliter la compréhension du fonctionnement de l'algorithme, nous allons que les données de la mémoire tampon ne soient pas bloquées par des déclencheurs (verrouillage) et peuvent donc être supprimés. Dans notre exemple, la mémoire tampon peut stocker trois portions de données:

  1. Le responsable du cache utilise les données 1 et les met dans un tampon vide.
  2. Ensuite, il utilise les données 4 et les envoie également au tampon.
  3. La même chose est faite avec les données 3.
  4. Ensuite, les données sont prises 9. Mais le tampon est déjà rempli. Par conséquent, les données 1 sont supprimées de celle-ci, car elles n'ont pas utilisé le plus long. Après cela, les données 9 sont placées sur le tampon.
  5. Le responsable du cache utilise à nouveau des données 4. Ils sont déjà dans le tampon, ainsi marqué comme le dernier utilisé.
  6. Les données sont devenues à la demande 1. Pour le mettre dans le tampon, les données 3 sont supprimées de celle-ci, comme non utilisé plus longtemps.
C'est un bon algorithme, mais il a des restrictions. Et si nous avons pleinement numérisé d'une grande table? Que se passera-t-il si la taille de la table / index dépasse le volume de la mémoire tampon? Dans ce cas, l'algorithme supprimera tout son contenu du cache, les données de balayage complètes ne seront donc probablement utilisées qu'une fois.

Algorithme d'amélioration

À cela pas arriver, une base de données utilise des règles spéciales. Selon Oracle Documentation:

"Pour de très grandes tables, l'accès direct est généralement utilisé, c'est-à-dire que les blocs de données sont lus directement pour éviter le débordement du tampon de cache. Pour les tables de taille moyenne, l'accès direct et la lecture du cache peuvent être utilisés. Si le système décide d'utiliser le cache, la base de données place les blocs de données à la fin de la liste de pattes pour empêcher le nettoyant tampon. "

La version améliorée de LRU-LRU-K est également utilisée. Le serveur SQL utilise LRU-K avec K \u003d 2. L'essence de cet algorithme est que lors de l'évaluation de la situation, il prend en compte plus d'informations sur les opérations passées et ne se souvient pas seulement des dernières données utilisées. La lettre au titre signifie que l'algorithme prend en compte les données utilisées par la dernière fois. Ils se voient attribuer un certain poids. Lorsque de nouvelles données sont chargées dans le cache, puis ancrées, mais souvent utilisées ne sont pas supprimées, car leur poids est plus élevé. Bien sûr, si les données ne sont plus utilisées, elles seront toujours supprimées. Et plus les données restent longtemps non réclamées, plus le poids au fil du temps diminue.

Le calcul de poids est tout à fait cohérent. Par conséquent, le serveur SQL utilise LRU-K avec même uniquement 2. Une augmentation de la valeur de l'efficacité de l'algorithme s'améliore. Vous pouvez vous rapprocher de vous familiariser avec lui grâce.

Autres algorithmes

Bien sûr, LRU-K n'est pas la seule solution. Il y a aussi 2Q et une horloge (les deux sont similaires à LRU-K), MOS (le plus récemment utilisé, qui utilise la logique de pattes, mais s'applique à une autre règle, LRFU (moins récemment et fréquemment utilisée), etc. dans certaines bases de données que vous pouvez Choisissez quel algorithme sera utilisé.

5.1.3. Enregistrement tampon

Nous avons parlé uniquement de la mémoire tampon de lecture, mais de la base de données utilise et enregistrez des tampons qui accumulent des données et réinitialisés aux parties de disque, au lieu d'une entrée cohérente. Cela permet d'économiser des opérations d'entrée / sortie.
N'oubliez pas que les tampons stockent pages (Unités de données indivisibles), et non des rangs des tables. La page de la balle tampon s'appelle "sale", si elle est modifiée, mais non enregistrée sur le disque. Il existe de nombreux algorithmes différents avec lesquels le temps d'enregistrement des pages sales est sélectionné. Mais cela est en grande partie dû au concept de transactions.

5.2. Gestionnaire de transactions

Ses responsabilités incluent le suivi afin que chaque demande soit effectuée à l'aide de votre propre transaction. Mais avant de parler du répartiteur, clarifions le concept de transactions acides.

5.2.1. "Sous l'acide" (le jeu de mots, si quelqu'un n'a pas compris)

La transaction acide (atomicité, isolement, durabilité, la cohérence) est une opération élémentaire, une unité de travail qui satisfait 4 conditions:

  • Atomicité. Il n'y a rien de "moins" de transaction, aucune opération plus petite. Même si la transaction dure 10 heures. En cas d'exécution des transactions infructueuse, le système revient à l'état "avant", c'est-à-dire que la transaction est renvoyée.
  • Isolement (isolement). Si, à une fois, deux transactions A et B sont effectuées, leur résultat ne devrait pas dépendre de la fin de l'une d'entre elles avant, pendant ou après l'exécution de l'autre.
  • Fiabilité (durabilité). Lorsque la transaction est corrigée (commise), c'est-à-dire terminé, les données utilisées par elle restent dans la base de données, quels que soient les incidents possibles (erreurs, chutes).
  • Cohérence (cohérence). Seules les données valides sont enregistrées dans la base de données (du point de vue des connexions relationnelles et fonctionnelles). La cohérence dépend de l'atomicité et de l'isolement.

Au cours de l'exécution de toute transaction, vous pouvez effectuer diverses lectures de SQL pour la lecture, la création, la mise à jour et la suppression de données. Les problèmes commencent lorsque deux transactions utilisent les mêmes données. L'exemple classique est le transfert d'argent du compte et à la dépense B. Supposons que nous avons deux transactions:

  • T1 prend 100 $ du compte A et les envoie à B.
  • T2 prend 50 $ du compte A et les envoie également à B.
Maintenant, considérons cette situation en termes de propriétés acides:
  • Atomitude Vous permet d'être sûr que tout ce qui se passe pendant T1 (une chute de serveur, une défaillance du réseau) ne peut pas arriver que 100 $ seront écrits avec un, mais ne viendront pas à B (sinon, ils disent à propos de «l'état incompatible»).
  • Isolation Il suggère que même si les T1 et T2 sont effectués simultanément, 100 $ seront décrits et le même montant ira à B. Dans tous les autres cas, ils parlent de l'État incohérent.
  • Fiabilité Vous permet de ne pas vous inquiéter du fait que T1 disparaîtra si la base tombe immédiatement après le comité T1.
  • Cohérence Empêche la capacité de créer de l'argent ou de leur destruction dans le système.
Ci-dessous, vous ne pouvez pas lire, il n'est plus important de comprendre le reste du matériel.

De nombreuses bases de données ne fournissent pas d'isolement par défaut complet, car cela conduit à d'énormes coûts de performance. SQL utilise 4 niveaux d'isolation:

  • Sérialisable sérialisable. Le plus haut niveau d'isolement. La valeur par défaut est utilisée dans SQLite. Chaque transaction est effectuée dans son milieu entièrement isolé.
  • Lecture répétable (lecture répétable). La valeur par défaut est utilisée dans MySQL. Chaque transaction a son propre milieu, à l'exception d'une situation: si la transaction ajoute de nouvelles données Et complète avec succès, ils seront visibles pour d'autres, en cours d'exécution. Mais si la transaction modifie les données Et complète avec succès, ces modifications ne seront pas visibles pour les transactions toujours exécutées. C'est-à-dire que les nouvelles données, le principe de l'isolement est cassé.

    Par exemple, la transaction a effectue

    Sélectionnez Compte (1) de TABLE_X
    Ensuite, la transaction B ajoute à la table X et commute de nouvelles données. Et si, après que cette transaction effectue à nouveau le nombre (1), le résultat sera différent.

    Ceci s'appelle la lecture fantôme.

  • Lire des données commises (lecture commitée). La valeur par défaut est utilisée dans Oracle, PostgreSQL et SQL Server. C'est la même chose que la lecture répétée, mais avec une perturbation supplémentaire de l'isolement. Supposons qu'une transaction a lit les données; Ensuite, ils sont modifiés ou supprimés par la transaction B, qui englobe ces actions. Si et examine encore ces données, cela verra des modifications (ou le retrait), fabriquée par B.

    Ceci s'appelle une lecture non répétable (lecture non répétable).

  • Lire des données non promises (lecture non initiale). Le plus bas niveau d'isolement. Un nouveau trouble est ajouté pour lire les données enregistrées. Supposons qu'une transaction a lit les données; Ensuite, ils sont modifiés par la transaction B (les modifications ne sont pas en concurrence, B est toujours en cours d'exécution). Si je considère à nouveau les données, vous verrez les modifications apportées. Si B sera pompé, puis lors de la lecture répétée, cela ne verra pas les modifications, comme si rien n'était.

    Ceci s'appelle la lecture sale.

La plupart des bases de données ajoutent leurs propres niveaux d'isolation (par exemple, basés sur des instantanés, à la fois dans PostgreSQL, Oracle et SQL Server). Également dans de nombreuses bases de données, tous les quatre niveaux décrits ci-dessus ne sont pas mis en œuvre, en particulier la lecture de données non fixées.

Un utilisateur ou un développeur peut immédiatement après avoir établi une connexion pour remplacer le niveau d'isolement par défaut. Pour ce faire, il suffit d'ajouter une ligne de code très simple.

5.2.2. Contrôle du parallélisme

La principale chose est de savoir pourquoi nous avons besoin d'isolement, de cohérence et d'atomicité sont la possibilité d'enregistrer des enregistrements sur les mêmes données (ajouter, mettre à jour et supprimer).

Si toutes les transactions ne lisent que les données, nous pouvons travailler simultanément sans affecter d'autres transactions.
Si au moins une transaction modifie les données lues par d'autres transactions, la base de données doit trouver un moyen de masquer ces changements d'eux. Il est également nécessaire de s'assurer que les modifications apportées ne seront pas supprimées par d'autres transactions qui ne voient pas les données modifiées.

Ceci est appelé contrôle parallèle.

Le moyen le plus simple d'effectuer simplement des transactions est alternativement. Mais cette approche est généralement inefficace (un seul noyau d'un processeur est engagé), ainsi que la possibilité de la mise à l'échelle est perdue.

Le moyen idéal de résoudre le problème ressemble à ceci (chaque fois que vous créez ou annule une transaction):

  • Surveillez toutes les opérations de chaque transaction.
  • Si deux transactions ou plus de conflit en raison de la lecture / de modification des mêmes données, changez la scène des opérations dans les participants au conflit afin de minimiser le nombre de raisons.
  • Effectuer des parties contradictoires des transactions dans un certain ordre. Les transactions non infligées à ce stade sont effectuées en parallèle.
  • N'oubliez pas que les transactions peuvent être annulées.
Si vous abordez la question plus formellement, c'est le problème du conflit de l'annexe. Il est très difficile de le résoudre et l'optimisation nécessite de grandes ressources de processeur. Les bases de données de la société ne peuvent pas se permettre d'accueillir le meilleur horaire de chaque nouvelle transaction. Par conséquent, des approches moins parfaites sont utilisées dans lesquelles plus de temps est dépensé pour les conflits.

5.2.3. Blocage du réparateur

Pour résoudre le problème ci-dessus, les blocs (verrous) et / ou la version de données sont utilisés dans de nombreuses données.
Si des transactions sont nécessaires certaines données, cela les bloque. S'ils avaient également besoin d'une autre transaction, il devra attendre que la première transaction soit supprimée.

Ceci s'appelle une serrure exclusive.

Mais aussi le déchet des verrous exclusifs dans les cas où les transactions ne doivent être considérées que des données. Pourquoi interférer avec les données de lecture? Dans de tels cas, le blocage conjoint est utilisé. Si la transaction doit être considérée comme des données, elles s'appliquent à leur blocage et lit conjointement. Cela n'interfère pas avec d'autres transactions utilise également des données de blocage et de lecture conjointe. Si certains d'entre eux doivent être changés, il devra attendre que toutes les serrures articulaires soient supprimées. Seulement après cela, il peut appliquer une serrure exclusive. Et puis toutes les autres transactions devront attendre que sa suppression ait lu ces données.

Le gestionnaire de verrouillage est un processus qui utilise et supprime les blocages. Ils sont stockés dans la table HASH (les clés sont bloquées des données). Le répartiteur sait pour toutes les données que les transactions ont été utilisées ou attendent leur retrait.

Blocage mutuel (impasse)

L'utilisation de serrures peut entraîner une situation où deux transactions sont infiniment attendues de la suppression des serrures:

Voici la transaction et les données bloquantes exclusivement des données 1 et s'attend à la libération de données 2. Dans le même temps, la transaction B bloquant exclusivement les données 2 et prévoit la libération de données 1.

Avec blocage mutuel, le répartiteur sélectionne la transaction à annuler (rouler en arrière). Et la décision d'accepter n'est pas si simple:

  • Sera-t-il préférable de tuer la transaction qui a changé le dernier ensemble de données (ce qui signifie que le retour sera le moins douloureux)?
  • Sera-t-il préférable de tuer la plus jeune transaction, car les autres utilisateurs de transactions attendaient-ils plus longtemps?
  • Sera-t-il préférable de tuer la transaction qui a besoin de moins de temps à compléter?
  • Combien d'autres transactions affecteront la restauration?
Mais avant de décider, le répartiteur doit s'assurer que le blocage mutuel s'est réellement survenu.

Imaginez une table de hachage sous la forme d'un graphique, comme dans l'illustration ci-dessus. Si une connexion cyclique est présente dans le diagramme, le blocage mutuel est confirmé. Mais comme il sera assez important pour la présence de cycles (après tout, le diagramme sur lequel tous les serrures sont reflétés est assez grand), utilise souvent une approche plus simple: l'utilisation des délais d'attente. Si le blocage n'est pas retiré dans un certain temps, la transaction est entrée dans un état de blocage mutuel.

Avant de bloquer le blocage, le répartiteur peut également vérifier si cela conduira à l'émergence d'un blocage mutuel. Mais pour répondre sans ambiguïté, ils devront également dépenser de l'argent sur les calculs. Par conséquent, ces PRESDVERVERTLES sont souvent présentés sous la forme d'un ensemble de règles de base.

Blocage en deux phases

L'isolement complet le plus facile est due lorsque le blocage est utilisé au début et enlevé à la fin de la transaction. Cela signifie que les transactions avant de commencer, c'est attendre la suppression de tous les verrous et que le blocage utilisé par celui-ci n'est supprimé qu'après l'achèvement. Cette approche peut être appliquée, mais une quantité de temps est perdue sur toutes ces attentes de l'élimination des serrures.

Le serveur DB2 et SQL applique un protocole de bloc à deux phases dans lequel la transaction est divisée en deux phases:

  • Phase de culture)Lorsqu'une transaction ne peut appliquer que des serrures, mais ne pas les supprimer.
  • Phase de schrinking)Lorsque la transaction ne peut supprimer que les blocages (des données déjà traitées et ne seront plus traitées), mais ne pas utiliser de nouvelles.
Conflit fréquent, qui arrive en l'absence de blocage en deux phases:

Avant la transaction A x \u003d 1 et y \u003d 1. Il traite les données Y \u003d 1, qui ont été modifiées par la transaction déjà après le début de la transaction A. En raison du principe de l'isolance, la transaction A devrait traiter y \u003d 2.

Objectifs résolus avec l'aide de ces deux règles simples:

  • Supprimer les blocages qui ne sont plus nécessaires pour réduire le temps d'attente d'autres transactions.
  • Prévenir les cas où la transaction est obtenue par des données modifiées par une transaction précédemment exécutée. Ces données ne coïncident pas avec la demande.
Ce protocole fonctionne bien, à l'exception de la situation lorsque la transaction a modifié les données et supprimé le blocage d'eux, après quoi elle a été annulée. Dans ce cas, une autre transaction peut lire et modifier les données, qui seront ensuite rejetées. Pour éviter une situation similaire, toutes les serrures exclusives doivent être supprimées à la fin de la transaction.

Bien sûr, les véritables bases de données utilisent des systèmes plus complexes, davantage de types de serrures et une plus grande granularité (cordes de blocage, pages, cloisons, tables, tables espaces), mais l'essence de la même chose.

Version de données

Une autre façon de résoudre le problème du conflit de transaction est l'utilisation de la version de données.

  • Toutes les transactions peuvent modifier les mêmes données simultanément.
  • Chaque transaction fonctionne avec sa propre copie (version) des données.
  • Si deux transactions changent les mêmes données, une seule des modifications est prises, l'autre sera rejetée, et la transaction a fait qu'il sera disparu (et peut-être redémarré).
Cela vous permet d'accroître la productivité car:
  • Les transactions de lecture ne bloquent pas l'enregistrement et inversement.
  • Le gestionnaire de blocage nerveux n'affecte pas.
En général, tout sera meilleur que le blocage, sauf lorsque deux transactions enregistrent les mêmes données. De plus, cela peut conduire à une énorme dépassement d'espace disque.

Les deux approches sont bloquantes et la version de la version - ont des plus et des inconvénients, beaucoup dépend de la situation qu'ils appliquent (plus de lectures ou d'autres enregistrements). Vous pouvez explorer une très bonne présentation dédiée à la mise en œuvre du contrôle multi-dense du parallélisme dans PostgreSQL.

Dans certaines bases de données (DB2 à la version 9.7, SQL Server), seuls les verrous sont utilisés. D'autres, comme PostgreSQL, MySQL et Oracle, des approches combinées sont utilisées.

Remarque: la version affecte un effet intéressant sur les index. Parfois, des doublons apparaissent dans l'index unique, l'index peut contenir plus d'enregistrements que les lignes de la table, etc.

Si une partie des données est lue à un niveau de niveau, puis il augmente, le nombre de serrures augmente, ce qui signifie qu'il y a plus de temps pour attendre les transactions. Par conséquent, la plupart des bases de données n'utilisent pas le niveau d'isolement par défaut.

Comme d'habitude pour plus des informations détaillées Reportez-vous à la documentation: MySQL, PostgreSQL, Oracle.

5.2.4. Responsable de chien

Comme nous le savons déjà, l'augmentation de la performance de la base de données stocke une partie des données dans la mémoire tampon. Mais si le serveur tombe pendant la transaction commit, les données de la mémoire seront perdues. Et cela viole le principe de la fiabilité des transactions.

Bien sûr, vous pouvez tout écrire sur le disque, mais à l'automne, vous resterez avec les données désabustées, ce qui constitue déjà une violation du principe d'atomicité.

Toute modification enregistrée par la transaction doit être annulée ou complétée.

Ceci est fait de deux manières:

  • Copies d'ombre / pages. Chaque transaction crée sa propre copie de la base de données (ou une partie de celui-ci) et fonctionne avec cette copie. En cas d'erreur, la copie est supprimée. Si tout s'est passé avec succès, la base de données bascule instantanément aux données de la copie en utilisant un tour au niveau du système de fichiers, puis supprime les données "anciennes".
  • Journal des transactions. Ceci est un stockage spécial. Avant que chaque entrée sur le disque DB écrit des informations dans le journal des transactions. Donc, en cas d'échec de la base de données, je saurai comment supprimer ou compléter une transaction inachevée.
Wal.

Dans de grandes bases de données avec de nombreuses transactions, des copies d'ombres / pages occupent un espace incroyablement beaucoup dans le sous-système de disque. Par conséquent, le journal des transactions est utilisé dans la base de données moderne. Il devrait être placé dans le stockage protégé des défaillances.

La plupart des produits (en particulier, Oracle, SQL Server, DB2, PostgreSQL, MySQL et SQLITE) fonctionnent avec le journal de transaction via le protocole WAL (journalisation en écriture de l'avenir). Ce protocole contient trois règles:

  1. Chaque modification de la base de données doit être accompagnée d'une entrée de journalisation et doit être effectuée avant que les données ne soient enregistrées sur le disque.
  2. Les entrées dans le journal doivent être situées conformément à la formation des événements correspondants.
  3. Lorsque la transaction vient, l'enregistrement doit être entré dans le journal jusqu'à ce que la transaction soit terminée avec succès.

L'exécution de ces règles est surveillée par le gestionnaire de journal. Logiquement, il est situé entre le responsable du cache et le gestionnaire d'accès aux données. Le répartiteur de journal enregistre chaque opération effectuée par des transactions jusqu'à ce que l'enregistrement soit enregistré. Il semble vrai?

TORT! Après tout, je serais passé dans cet article, il serait temps de se rappeler que tout ce qui est lié à la base de données est en train d'être malédiction "effet de base de données". Si sérieusement, le problème est que vous devez trouver un moyen d'écrire dans le journal, tout en conservant de bonnes performances. Après tout, si le journal des transactions fonctionne lentement, il ralentit tous les autres processus.

Bélier.

En 1992, des chercheurs d'IBM ont créé une version étendue de WALL, qui a appelé. Dans l'une ou l'autre, les Béliers sont utilisés par la plupart des entables modernes. Si vous voulez plus profond pour explorer ce protocole, vous pouvez obturer le travail approprié.

Alors, Aries déchiffrer comme UNE.lglorithmes pour. RÉcoovery et. JE.sollection E.xploiting S.Émances. Cette technologie a deux tâches:

  1. Fournir de bonnes performances lorsque vous écrivez des journaux.
  2. Fournir une récupération rapide et fiable.
Il y a plusieurs raisons pour lesquelles la base de données doit faire rouler la transaction:
  1. L'utilisateur l'a annulé.
  2. Erreur de serveur ou réseau.
  3. La transaction a cassé l'intégrité de la base de données. Par exemple, vous avez appliqué une condition unique de colonne et la transaction a ajouté un duplicata.
  4. La présence de serrures mutuelles.
Mais parfois, la base de données peut et rétablir la transaction, par exemple, dans le cas d'une erreur réseau.

Comment est-ce possible? Pour répondre à cela, vous devez d'abord déterminer quelles informations sont stockées dans le journal.

Enregistrer
Chaque opération (Ajouter / Supprimer / Modification) pendant la transaction passe à l'apparence d'un enregistrement dans le journal. L'enregistrement contient:

  • LSN (numéro de séquence de journal). Ceci est un numéro unique, dont la valeur est déterminée par ordre chronologique. C'est-à-dire que si l'opération a eu lieu avant l'opération B, LSN pour A sera inférieure à la LSN pour B. En réalité, le procédé de génération d'un LSN est plus compliqué, car il est connecté et avec la manière de stocker le journal.
  • Transid. Un identifiant de transaction de fonctionnement.
  • Pages. Un espace disque dans lequel les données modifiées sont.
  • Prevlsn.. Lien vers l'entrée précédente dans le journal créé par la même transaction.
  • annuler. La méthode d'opération de restauration.

    Par exemple, si une opération de mise à jour a été effectuée, la valeur / l'état de l'élément modifié (annulation physique) ou une opération inverse, ce qui vous permet de revenir à l'état précédent (annulation logique) dans Annuler. Seul logique est utilisé dans le Bélier, il est très difficile de travailler avec physique.

  • Refaire. Méthode de répétition de l'opération.
De plus, chaque page sur le disque (pour stocker des données, pas un journal) contient le LSN de la dernière opération, les données contenues dans ce document.

En ce qui est connu, annuler n'est pas utilisé uniquement dans PostgreSQL. Au lieu de cela, un collecteur de déchets, éliminant les anciennes versions des données, est utilisée. Cela est dû à la mise en œuvre de la version de la version des données dans ce SGBD.

Pour vous faciliter la possibilité de présenter la composition de l'enregistrement dans le journal, voici un exemple visuel simplifié dans lequel la mise à jour de la personne définie Age \u003d 18 est exécutée. Laissez-le être exécuté en transaction numéro 18:

Chaque journal a un LSN unique. Les journaux associés font référence à la même transaction et sont lancés dans l'ordre chronologique (le dernier journal de la liste concerne la dernière opération).

Journaux tampons
Pour écrire sur le journal, le tampon de journal est utilisé.

Lorsque l'artiste requête demande les données modifiées:

  1. Le répartiteur de cache les stocke dans le tampon.
  2. Logs Manager stocke le journal approprié dans son propre tampon.
  3. L'exécutif des demandes détermine si l'opération est terminée et, en conséquence, est-il possible de demander une modification des données.
  4. Logs Manager enregistre information nécessaire Dans le journal des transactions. Le moment de faire de cet enregistrement est défini par l'algorithme.
  5. Le responsable du cache écrit des modifications apportées au disque. Le moment de l'enregistrement est également défini par l'algorithme.
Lorsque la transaction arrive, cela signifie que toutes les étapes sont fabriquées à partir de 1 à 5. L'enregistrement dans le journal des transactions est effectué rapidement, car il s'agit de "ajouter un journal de bord du journal de transaction". Dans le même temps, l'enregistrement des données sur le disque est une procédure plus complexe, alors qu'elle est prise en compte que les données doivent ensuite être lues rapidement.

Voler et forcer les politiques

Pour augmenter les performances, l'étape numéro 5 doit être effectuée après la validation, car en cas de défaillance, il est toujours possible de restaurer la transaction à l'aide de REDO. Ceci est appelé politique sans force.

Mais la base de données peut choisir la stratégie de force pour une charge réduite pendant la récupération. Ensuite, l'étape numéro 5 est effectuée avant la validation.

En outre, la base de données choisit de savoir s'il faut écrire des données à l'étape par étape (stratégie de vol) ou si le répartiteur tampon doit attendre le commit, écrivez partout (non volé). Le choix dépend de ce dont vous avez besoin: enregistrement rapide avec une longue récupération ou une récupération rapide?

Comme mentionné les politiciens affectent le processus de récupération:

  • Pour voler / sans force, annuler et refaire sont nécessaires. La performance est la structure la plus élevée, mais plus complexe de décompositions et de processus de récupération (comme Ares). Cette combinaison de politiques utilise la majeure partie de la base de données.
  • Pour voler / force, seul un annulation est nécessaire.
  • Pour non-voler / no-force - seulement refait.
  • Pour ne pas voler / force, rien ne nécessite. La performance dans ce cas est la plus faible et une énorme quantité de mémoire est requise.
Restauration

Alors, comment pouvons-nous utiliser nos merveilleuses journaux? Supposons que le nouvel employé a demandé à la base de données (règle numéro 1: Newbie est toujours à blâmer!). Vous le redémarrez et le processus de récupération commence.
Aries récupère en trois étapes:

  1. Analyse. L'ensemble du journal des transactions lit afin que vous puissiez restaurer la chronologie des événements survenus dans le processus de chute de la base. Il est utile de déterminer quelle transaction vous devez reculer. Toutes les transactions font rouler sans ordre de comute. En outre, le système décide que les données auraient dû être enregistrées sur le disque pendant l'échec.
  2. Répéter. Pour mettre à jour la base de données à l'état, Redo est utilisé avant de tomber. Ses journaux sont traités dans l'ordre chronologique. Pour chaque journal, les pages LSN sont lues sur le disque contenant les données à modifier.

    Si lsn (pages_d_dysk)\u003e \u003d lsn (enregistrements_log), les données ont déjà été écrites sur le disque avant l'échec. Mais la valeur a été écrasée par l'opération terminée après l'enregistrement dans le journal avant l'échec. Donc, rien n'est fait, en fait.

    Si LSN (Pages__Disk)

    La répétition est effectuée même pour des transactions qui seront dispersées car elle simplifie le processus de récupération. Mais la base de données moderne ne le fait probablement pas.

  3. Annuler. À ce stade, toute transaction inachevée est renvoyée. Le processus commence par les dernières journaux de chaque transaction et processus annulés dans l'ordre chronologique inverse à l'aide de PrevLSn.
Dans le processus de restauration du journal des transactions, vous devez savoir sur les actions effectuées lors de la récupération. Il est nécessaire de synchroniser les données stockées sur le disque enregistrées dans le journal des transactions. Vous pouvez supprimer des enregistrements de transaction qui reculez, mais il est très difficile de faire. Au lieu de cela, ALIES effectue des enregistrements de compensation dans le journal des transactions, annulant logiquement les enregistrements d'enregistrement des transactions de roulement.

Si la transaction est annulée "manuellement" ou le gestionnaire de verrouillage, ou en raison de la défaillance du réseau, l'étape d'analyse n'est pas nécessaire. Après tout, les informations pour REDO et UNDO sont contenues dans deux tables placées en mémoire:

  • Dans la table des transactions (les états de toutes les transactions en cours sont stockés ici).
  • Dans la table des pages sales (ici contient ici des informations sur les données dont vous avez besoin pour écrire sur le disque).
Dès qu'une nouvelle transaction apparaît, ces tables sont mises à jour par le responsable du cache et le répartiteur de transactions. Et puisque les tables sont stockées en mémoire, alors avec la chute de la base de données, ils disparaissent.

L'étape d'analyse est nécessaire pour restaurer les deux tables à l'aide des informations à partir du journal des transactions. Pour accélérer cette étape, les points de contrôle sont utilisés dans le Bélier. Sur le disque de temps en temps, le contenu des deux tables est enregistré, ainsi que le dernier au moment de l'enregistrement LSN. Donc, lors de la récupération, seuls les journaux sont analysés, suivant la LSN.

6. Conclusion

Selon une vue d'ensemble supplémentaire de la base de données, vous pouvez recommander l'architecture de l'article d'un système de base de données. C'est une bonne introduction au sujet écrit par une langue assez compréhensible.

Si vous lisez attentivement tout le matériel ci-dessus, vous avez sûrement une idée de la taille des capacités des bases de données. Cependant, d'autres problèmes importants ne sont pas affectés dans cet article:

  • Comment gérer des bases de données en cluster et des transactions globales.
  • Comment obtenir un instantané si la base fonctionne tout.
  • Comment stocker et compresser efficacement les données.
  • Comment gérer la mémoire.
Alors, réfléchissez à deux fois avant de choisir entre une nosql amusante et une base de données relationnelle solide. Ne soyez pas mal compris, certaines bases NOSQL sont très bonnes. Mais ils sont encore loin d'être excellent et ne peuvent que résoudre des problèmes spécifiques associés à certaines applications.

Donc, si quelqu'un vous demande, mais comment les bases de données fonctionnent, puis au lieu de cracher et de partir, vous pouvez répondre:

Tags: Ajouter des tags

Avez-vous aimé l'article? Partager avec des amis: