2009-09-19 5 views
7

Supposons que j'ai des procédures stockées qui effectuent des opérations d'insertion/mise à jour/suppression sur la table.Les déclencheurs diminuent-ils les performances? Des tables insérées et supprimées?

En fonction de certains critères, je souhaite effectuer certaines opérations.

Dois-je créer un déclencheur ou effectuer l'opération dans la procédure stockée elle-même?

L'utilisation des déclencheurs réduit-elle les performances?

Est-ce que ces deux tableaux à savoir Inséré et supprimé existe (persistante) ou sont créés dynamiquement?

Si elles sont créées dynamiquement, cela pose un problème de performances.

S'il s'agit de tables persistantes, où sont-elles?

Aussi, s'ils exixts alors puis-je accéder Inséré et Deleted tables dans les procédures stockées?

+0

Les performances ne sont pas dégradées car les tables insérées et supprimées sont créées dynamiquement et les enregistrements sont insérés dans ces tables dans les déclencheurs. Si nous faisons la même chose dans une procédure stockée, ces tables ne sont pas en image, ce qui augmente les performances. – Panache

Répondre

0

Performance sur quoi? le déclencheur effectuera une mise à jour sur la base de données après l'événement, de sorte que l'utilisateur de votre système ne saura même pas qu'il se passe. Cela arrive en arrière-plan.

Votre question est formulée d'une manière assez difficile à comprendre.

+1

Je pense que la question fait référence à la présence des tables insérées et effacées. Y a-t-il un impact sur les performances en ayant ces structures disponibles? Mon instinct dit non, mais je ne suis pas sûr. –

7

Oui, une table avec un déclencheur ne fonctionnera pas aussi bien qu'elle le ferait sans elle. La logique dicte que faire quelque chose est plus cher que de ne rien faire.

Je pense que votre question serait plus pertinente si vous demandiez si elle est plus performante qu'une autre approche que vous n'avez pas spécifiée. En fin de compte, je choisirais l'outil le plus approprié pour le travail et ne m'inquiéterais des performances qu'en cas de problème, pas avant même que vous n'ayez implémenté une solution.

Les tables insérées et supprimées sont disponibles dans le déclencheur. Il est donc interdit de les appeler à partir de procédures stockées.

+0

Vous m'avez raison je veux savoir "si c'est plus performant que toute autre approche" Je veux savoir que si les tables insérées et supprimées ne sont accessibles que dans les déclencheurs, sont-ils créés lorsque les déclencheurs sont déclenchés ou sont-ils tables permanentes? et si ce sont des tables permanentes, pourquoi ne pouvons-nous pas y accéder dans les procédures stockées? – Panache

+3

INSERTED et DELETED sont des tables temporaires qui résident en mémoire pendant la durée d'exécution de votre trigger. Une fois que votre déclencheur a fini de s'exécuter, ils sont partis jusqu'à ce que quelque chose déclenche le déclencheur – Cory

+0

Parfois, penser à la performance avant d'entrer dans une solution est une bonne chose, il n'y a rien de pire que de se rendre compte que vous devez commencer encore une fois - La performance est quelque chose à considérer dans le choix de la bonne solution __avant__ vous avez mis en œuvre la mauvaise solution –

1

Il diminue les performances sur la requête par définition: la requête fait alors quelque chose qu'elle ne ferait pas autrement.

L'autre façon de voir cela est la suivante: si vous deviez faire manuellement tout ce que le déclencheur fait de toute façon, alors ils augmentent les performances en économisant un aller-retour. Faites un peu plus loin: cet avantage disparaît si vous utilisez une procédure stockée et que vous exécutez un aller-retour sur un serveur de toute façon.

Cela dépend de la façon dont vous le regardez.

6

Sera-t-il moins performant que de faire la même chose dans un proc stocké? Probablement pas mais avec toutes les questions de performance, la seule façon de vraiment savoir est de tester les deux approches avec un ensemble de données réaliste (si vous avez une table d'enregistrement de 2.000.000, ne testez pas avec une table avec 100 enregistrements!Cela dit, le choix entre un déclencheur et un autre procédé dépend entièrement de la nécessité que l'action en question se produise, peu importe la façon dont les données sont mises à jour, supprimées ou insérées. S'il s'agit d'une règle commerciale qui doit toujours se produire, peu importe quoi, un déclencheur est le meilleur endroit pour cela ou vous aurez éventuellement des problèmes d'intégrité des données. Les données dans les bases de données sont fréquemment modifiées à partir de sources autres que l'interface graphique. Lors de l'écriture d'un déclencheur, il y a plusieurs choses à prendre en compte. Tout d'abord, le déclencheur se déclenche une fois pour chaque lot. Ainsi, que vous ayez inséré un enregistrement ou 100 000 enregistrements, le déclencheur ne se déclenche qu'une fois. Vous ne pouvez pas supposer jamais qu'un seul enregistrement sera affecté. Vous ne pouvez pas non plus supposer que ce sera toujours un petit ensemble d'enregistrements. C'est pourquoi il est essentiel d'écrire tous les déclencheurs comme si vous alliez insérer, mettre à jour ou supprimer un million de lignes. Cela signifie une logique basée sur un ensemble et pas de curseurs ou en boucles si possible. Ne prenez pas un proc stocké écrit pour gérer un enregistrement et l'appeler dans un curseur dans un déclencheur.

De même, n'envoyez pas d'e-mails à partir d'un curseur, vous ne souhaitez pas arrêter tous les insertions, mises à jour ou suppressions si le serveur de messagerie est arrêté.

Questions connexes