2010-11-22 11 views
3

J'ai lu que les curseurs sont assez slow et il faut le faire, sauf si les options les évitent. J'essaie d'optimiser mes procédures stockées et l'une d'elles utilise un curseur. Il est fréquemment appelé par mon application et avec beaucoup d'utilisateurs (20000) et les lignes à mettre à jour. Je pensais que je devrais peut-être utiliser autre chose comme une alternative. Tout ce que j'essaie de faire ou de vouloir, c'est d'obtenir une liste d'enregistrements, puis d'opérer selon la valeur de chaque ligne. Donc, pour nous dire par exemple -Quelle est la lenteur des curseurs et quelles seraient les meilleures alternatives?

Employee - Id,Name,BenefitId,StartDate,EndDate 

donc basée sur benefitId je dois faire le calcul différent en utilisant les dates entre StartDate et EndDate et mettre à jour les détails des employés. Je fais juste cet exemple artificiel pour donner une idée de ma situation.

Que pensez-vous de cela? Existe-t-il de meilleures alternatives pour les curseurs comme les tables temporaires ou les fonctions définies par l'utilisateur? Quand devriez-vous vraiment opter pour eux ou devrions-nous ne jamais utiliser des curseurs? Merci à tous pour leur aide.

Répondre

2

J'ai une fois changé une procédure stockée de curseurs à la logique basée sur l'ensemble. Le temps de fonctionnement est passé de 8 heures à 22 secondes. C'est le genre de différence dont nous parlons. Au lieu de prendre un enregistrement différent à la fois, utilisez plusieurs passages sur les données. Mettez à jour et définissez field1 = A où field2 est X, puis mettez à jour et définissez field1 = B où field2 est Y, etc.

1

Un curseur effectue un traitement ligne par ligne ou "Row by Agonizing Row" si votre nom est Jeff Moden.

Ceci est juste one example de la façon de faire la programmation SQL à base de set par opposition à RBAR, mais cela dépend finalement de ce que fait votre curseur.

En outre, un coup d'oeil à ce sur StackOverflow:

RBAR vs. Set based programming for SQL

-1

Tout d'abord, il semble que vous essayez de mélanger la logique métier dans vos procs stockés. C'est généralement quelque chose que vous voulez éviter. Une meilleure solution serait d'avoir une couche intermédiaire qui encapsule cette logique métier. De cette façon, votre couche de données reste purement des données.

Pour répondre à votre question initiale, cela dépend vraiment de ce que vous utilisez pour les curseurs. Dans certains cas, vous pouvez utiliser une variable de table ou une table temporaire. Vous devez vous rappeler de libérer des tables temporaires, alors je suggère d'utiliser des variables de table autant que possible. Parfois, cependant, il n'y a aucun moyen d'utiliser des curseurs. Peut-être que les DBA d'origine n'ont pas assez normalisé (ou trop normalisé) et vous êtes obligé d'utiliser un curseur pour traverser plusieurs tables sans aucune relation de clé étrangère.

+1

De nombreux endroits nécessitent que toutes les bases de données soient accessibles via des procédures stockées. Et c'est une meilleure pratique de faire un traitement complexe dans un proc stocké que le dba peut ajuster les performances que de mettre des choses comme ça sur l'application. De plus, presque tous les curseurs exécutés à partir de l'application peuvent facilement être remplacés par une logique basée sur un ensemble. Les curseurs sont rarement nécessaires, sauf pour certaines tâches administratives orientées dba.Si vous insérez, mettez à jour ou supprimez à partir d'une ou de plusieurs tables, vous pouvez le faire d'une manière basée sur des ensembles à près de 100% du temps. – HLGEM

+0

Je n'ai jamais compris pourquoi les gens insistent tellement pour garder la logique métier hors de la base de données. Je n'ai pas encore rencontré un système où les données pourraient vraiment être manipulées de manière significative sans cette logique. Peu importe le fait que nous changions beaucoup plus de langages de programmation que nous ne le faisons pour les fournisseurs de bases de données. – NotMe

+2

C'est probablement une question de perspective et un choix de langue. La langue maternelle des programmeurs sera le langage HL dans lequel ils sont programmés à ce moment-là. La langue maternelle de DBA est SQL. Il est logique que l'on se rabat sur le familier. – SRM