J'utilise un curseur dans ma procédure stockée. Cela fonctionne sur une base de données qui a un grand nombre de données. pour chaque élément du curseur, je fais une opération de mise à jour. Cela prend énormément de temps à compléter. Presque 25min. :(.. Y at-il de toute façon je peux réduire le temps consommé pour cela?Pourquoi mon curseur SQL Server est-il très lent?
Répondre
Lorsque vous devez faire une opération plus complexe à chaque ligne que ce qu'une simple mise à jour vous permettra, vous pouvez essayer:
- Ecrire une fonction définie par l'utilisateur et l'utiliser dans la mise à jour (probablement encore lent)
- données Mettez dans une table temporaire et l'utiliser une mise à jour ... dE:
Saviez-vous que sur le UPDATE ... de la syntaxe? Il est assez puissant quand les choses deviennent plus complexes:
UPDATE
MyTable
SET
Col1 = CASE WHEN b.Foo = "Bar" THEN LOWER(b.Baz) ELSE "" END,
Col2 = ISNULL(c.Bling, 0) * 100/Col3
FROM
MyTable
INNER JOIN MySecondTable AS b ON b.Id = MyTable.SecondId
LEFT JOIN ##MyTempTable AS c ON c.Id = b.ThirdId
WHERE
MyTabe.Col3 > 0
AND b.Foo NOT IS NULL
AND MyTable.TheDate > GETDATE() - 10
L'exemple est complètement maquillé et ne peut pas faire beaucoup de sens, mais vous obtenez l'image de la façon de faire une mise à jour plus complexe sans avoir à utiliser un curseur . Bien sûr, une table temporaire ne serait pas nécessairement nécessaire pour que cela fonctionne. :-)
La réponse rapide est de ne pas utiliser un curseur.Le moyen le plus efficace de mettre à jour beaucoup d'enregistrements est d'utiliser une déclaration de mise à jour. Dans les cas où vous devez utiliser un curseur plutôt qu'une instruction de mise à jour, il vous suffit d'avoir une idée de la façon dont vous écrivez l'instruction de mise à jour
Si vous avez publié un instantané de votre SQL, vous pourriez obtenir de l'aide pour réaliser ce que vous voulez.
Garçon ai-je appris cela à la dure? Curseurs == lent || douloureux || db_death; –
Non, pas toujours. Il existe des situations où un curseur est le moyen le plus rapide/le plus élégant/unique de résoudre un problème en SQL. Comme toujours: Il s'agit d'utiliser le bon outil pour la tâche. – Tomalak
@Tomalak, je suis d'accord, parfois les curseurs sont la meilleure/seule façon de faire les choses, mais ils devraient être traités en dernier recours. Parfois, il suffit d'un œil supplémentaire pour voir la version UPDATE de la solution. – knightpfhor
Je voudrais éviter d'utiliser un curseur, et de travailler si possible avec des vues ou des vues matérialisées.Curseurs est quelque chose que Microsoft n'optimise pas beaucoup dans SQL Server, parce que la plupart du temps, vous devriez utiliser un instruction SQL générale (SELECT, INSERT, UPDATE, DELETE) qu'avec un curseur.
Si vous ne parvenez pas à obtenir le même résultat final même avec l'utilisation de vues ou de sous-requêtes, vous pouvez utiliser une table temporaire ou améliorer le modèle de données.
Vous ne fournissez pas beaucoup d'informations spécifiques, donc tout ce que je peux faire est de donner quelques conseils généraux.
Mettez-vous à jour les mêmes données que celles sur lesquelles le curseur fonctionne?
Quel type de curseur? transmettre seulement? statique? jeu de clés? dynamique?
La syntaxe UPDATE ... FROM mentionnée ci-dessus est la méthode préférée. Vous pouvez également faire une sous-requête comme celle-ci.
UPDATE t1
SET t1.col1 = (SELECT top 1 col FROM other_table WHERE t1_id = t1.ID AND ...)
WHERE ...
Parfois, cela est la seule façon de le faire, comme chaque mise à jour de la colonne peut dépendre d'un critère differant (ou une table diferant), et il peut y avoir un « meilleur des cas » que vous souhaitez conserver bysing la ordre par clause.
Pouvez-vous poster plus d'informations sur le type de mise à jour que vous faites? Les curseurs peuvent être très utiles dans le bon contexte (j'en utilise beaucoup), mais si vous avez le choix entre un curseur et une opération basée sur un ensemble, la base est presque toujours le chemin à parcourir.Mais si vous n'avez pas le choix, vous n'avez pas le choix.
Je ne peux pas dire sans plus de détails.
- 1. Très lent requêtes SQL Server
- 2. One in Ten requête dans SQL Server très lent
- 3. HTTPWebResponse + StreamReader Très lent
- 4. Pourquoi mon VS2008 est très lent à enregistrer et à renommer les fichiers
- 5. Pourquoi mon débogueur est-il si lent?
- 6. Jquery très lent dans IE7
- 7. TabControl Ajouter est très lent
- 8. Très lent WebResponse déclenchement TimeOut
- 9. Zend Framework et Mysql - très lent
- 10. ASP.NET MVC débogage très lent - problème de connexion SQL Server Express?
- 11. django est très lent sur ma machine
- 12. VisualStudio2005 très lent dans le débogage
- 13. svn repo pour Magento est très lent!
- 14. L'appendTo de JQuery est très lent!
- 15. php mysql db connect très lent
- 16. Requêtes SQL - Comment lent est trop lent?
- 17. Sélectionnez à partir de C# dans SQL Server 2008 trop lent dans Windows Server 2003 :(
- 18. application Windows très lent lors de l'utilisation de la transparence
- 19. Sql Server 2000 - tempdb en croissance très grande
- 20. application ASP.NET sur IIS7 - démarrage très lent après iisreset
- 21. Rails: rake db: migrate * très * lent sur Oracle
- 22. Telerik RadControls + JetBrains Resharper = TRÈS LENT, Quelqu'un peut-il aider?
- 23. Pourquoi ODBC est-il lent?
- 24. SQL Server interrogation XML à l'aide d'un curseur
- 25. Regex lent sur Windows Server 2008
- 26. Pourquoi mon LINQ INSERTS ne persiste-t-il pas dans SQL Server CE 3.5?
- 27. Pourquoi la connexion de Sql Server TimesOut
- 28. Pourquoi SQL Server désapprouve SET ANSI_PADDING OFF?
- 29. Pourquoi est-ce que coller un long-liner long est très lent dans le mode d'insertion de Vim?
- 30. Pourquoi l'intranet est-il si lent sur nos machines?
Veuillez fournir un exemple de code de ce que fait le curseur, Sinon, vous demandez combien de temps un morceau de corde est. – mjallday