Quels sont les avantages de l'utilisation de la base de données de curseur?
Il est basé sur la question de l'entrevue que j'ai rencontrés.
Très courte définition peut être
Il peut être utilisé pour manipuler les lignes
renvoyées par une requête.
En plus de l'utilisation du curseur (Points sont énumérés ici sur MSDN), j'ai une question dans mon esprit que si nous pouvons effectuer toutes les opérations à l'aide d'une requête ou une procédure stockée (si je ne me trompe pas, Comme on peut utiliser des instructions Transact-SQL pour ms-sql), est-il un lieu concret que nous devrions utiliser le curseur?
- Quassnoi du lien contient un bon résumé de ce paragraphe: "les Curseurs peuvent servir comme foreach substituts et ajouter un peu de procédure capacités d'un ensemble à base de language (SQL). Les programmeurs de ne pas expérimenté avec SQL ont tendance à abuser de cette fonction, ils ne sont pas habitués à l'ensemble du paradigme basé sur du SQL et ils essaient de faire ce qu'ils ont appris à faire: ouvrir un cycle, une boucle à travers elle, de faire quelque chose avec une variable, fermer la boucle, tester, déboguer, check-in, fermeture de session, rentrer à la maison."
Vous devez vous connecter pour publier un commentaire.
De l'utilisation de curseurs par rapport à de gros jeux de résultats, c'est comme l'utilisation de la vidéo en streaming au lieu de télécharger une vidéo en un seul coup, et de le regarder quand il a téléchargé.
Si vous téléchargez, vous devez avoir quelques concerts de l'espace et de la patience d'attendre jusqu'à ce que le téléchargement terminé. Maintenant, à n'importe quelle vitesse de votre ordinateur ou un réseau peut être, tout le monde regarde un film à la même vitesse.
Normalement, la requête est envoyée au serveur, exécuté, et le jeu de résultats envoyés sur le réseau à vous, dans un sursaut d'activité.
Le curseur va vous donner accès à des données ligne par ligne et les flux de chaque ligne uniquement lorsque vous en faites la demande (peut effectivement le voir).
Qui nous apporte quelques mises en garde, cependant:
De cohérence: à l'Aide d'un curseur, vous n' (généralement) pas fonctionner sur une sauvegarde instantanée des données, mais sur une ligne. Si votre simultanéité/cohérence/l'isolement garantit la baisse de l'ensemble de la base de données (ACIDE) à une seule ligne. Vous pouvez généralement informer votre SGBD quel est le niveau de la concurrence que vous voulez, mais si vous êtes trop tâtillon (verrouillage de la table que vous êtes), vous jeter beaucoup de l'économie des ressources sur le serveur.
La transmission de chaque ligne par lui-même peut être très inefficace, puisque chaque paquet de négociation, les frais généraux que vous pourriez éviter d'envoyer de gros, peut-être compressés, des blocs de données par paquet. ( Pas de serveur de base de données ou un client de la bibliothèque est assez stupide pour transmettre chaque ligne individuellement, il y a la mise en cache et de segmentation sur les deux extrémités, c'est toujours pertinente.)
Les curseurs sont plus difficiles à faire. Considérons une requête avec un grand jeu de résultats, vous motiver à utiliser un curseur, qui utilise une clause GROUP BY avec des fonctions d'agrégation. (Ces requêtes sont courantes dans les entrepôts de données). Le GROUPE a PAR peut complètement corbeille de votre serveur, car il a pour générer et stocker l'ensemble du jeu de résultats à la fois, peut-être même la tenue des verrous sur les autres tables.
Règle de base:
"Nature séquentielle" il n'y a pas de fonctions d'agrégation lourd dans les clauses GROUP BY dans ta requête. Le serveur peut paresseusement décider de calculer les 10 lignes de votre curseur à consommer à partir d'un cache et faire d'autres choses pendant ce temps.
HTH
Un curseur est un outil qui vous permet de parcourir les enregistrements dans un jeu. Il a des notions de ordre et enregistrement en cours.
Généralement,
SQL
fonctionne avec multisets: ce sont des ensembles de peut-être répéter les enregistrements dans aucun ordre donné, pris dans leur ensemble.Dire, cette requête:
fonctionne sur multisets
a
etb
.Rien dans cette requête fait des hypothèses sur l'ordre des dossiers, la façon dont ils sont stockés, l'ordre dans lequel ils doivent être accessibles, etc.
Cela permet de faire abstraction des détails de mise en œuvre et de laisser le système essayez de choisir le meilleur algorithme pour exécuter cette requête.
Cependant, après avoir transformé l'ensemble de vos données, en fin de compte, vous aurez besoin d'accéder aux enregistrements d'une façon ordonnée et un par un.
Vous n'avez pas de soins sur comment exactement les entrées d'un répertoire sont stockés sur un disque dur, mais l'imprimante ne les obligent à se nourrir dans l'ordre alphabétique; et les balises de mise en forme doit être appliquée à chaque dossier individuellement.
Qui est exactement là où les curseurs entrent en jeu. Chaque fois que vous traitez d'un jeu de résultats sur le côté client, vous êtes à l'aide d'un curseur. Vous n'obtenez pas de méga-octets de données non triées sur le serveur: vous obtenez juste une petite variable: un jeu de résultats descripteur, et il suffit d'écrire quelque chose comme ceci:
C'est le curseur qui met en œuvre tout cela pour vous.
Bien sûr, cela concerne la base de données-l'interaction avec le client.
Comme pour la base de données elle-même: à l'intérieur de la base de données, vous aurez rarement besoin de les curseurs, puisque, comme je l'ai dit ci-dessus, presque toutes les transformations de données peuvent être mises en œuvre à l'aide des opérations définies de manière plus efficace.
Cependant, il y a des exceptions:
SQL Server
sont mises en œuvre très mal. Une somme cumulative, par exemple, pourrait être calculé de manière beaucoup plus efficace avec un curseur que l'aide de l'ensemble des opérations à base deVous pouvez également trouver cet article mérite d'être lu:
100M
lignes dans une seuleFETCH
?À l'aide d'un curseur, il est possible de lire dans l'ordre, par le biais d'un ensemble de données, de la programmation, de sorte qu'il se comporte de manière similaire à la classique d'accès au fichier, plutôt que l'ensemble du comportement fondé sur les caractéristiques de SQL.
Il y a quelques situations où cela peut être utile:
Où il est nécessaire de simuler le fichier de documentation sur l'accès comportement - par exemple, lorsqu'une base de données relationnelle est utilisé comme mécanisme de stockage des données pour un morceau de code qui a été écrit précédemment à l'utilisation de fichiers indexés pour le stockage de données.
Où il est nécessaire de traiter les données de manière séquentielle - un exemple simple pourrait être de calculer le total de bilan d'un client spécifique. (Un certain nombre de bases de données relationnelles comme Oracle et SQLServer, maintenant à l'analyse des extensions de SQL qui devrait réduire considérablement la nécessité pour cela.)
Inévitablement, wikipédia a plus: http://en.wikipedia.org/wiki/Database_cursor
Avec le curseur, vous accédez à une rangée à la fois. Il est donc possible de l'utiliser lorsque vous voulez manipuler avec beaucoup de lignes, mais avec un seul à un moment donné.
Me l'a dit lors de mes cours, la raison d'utiliser le curseur est vous souhaitez accéder à plus de lignes que vous pouvez adapter à votre mémoire de sorte que vous ne pouvez pas simplement obtenir toutes les lignes dans une collection et ensuite une boucle à travers elle.
Parfois un jeu basé sur la logique peut être assez complexe et opaque. Dans ces cas, et si la performance n'est pas une question un curseur côté serveur peut être utilisé pour remplacer la logique relationnelle avec un plus gérable et familier (pour un non relationnelle penseur) logique procédurale qui facilite la maintenance.