1

J'essaie d'optimiser une procédure stockée que je maintiens et je me demande si quelqu'un peut me donner une idée des avantages/pénalités de performance des options ci-dessous. Pour ma solution, j'ai fondamentalement besoin d'exécuter un programme de conversion sur une image stockée dans une colonne IMAGE dans une table. Le processus de conversion réside dans un fichier .EXE externe. Voici mes options:Curseur SQL avec procédure stockée et requête avec UDF

  1. Tirez sur les résultats de la table cible dans une table temporaire, puis utiliser un curseur pour aller sur chaque ligne de la table et exécuter une procédure stockée sur la colonne IMAGE. Le proc stocké appelle le fichier .EXE.

  2. Créez une fonction UDF qui appelle le fichier .EXE et exécutez une requête SQL similaire à "select UDFNAME (Image_Col) from TargetTable".

Je suppose que ce que je suis à la recherche est une idée de combien les frais généraux serait ajoutée par la création du curseur, au lieu de le faire comme un ensemble?

Quelques infos supplémentaires:

  • La taille de l'ensemble dans ce cas est max. 1000
  • En réponse à la question ci-dessous, si cela est fait avec un UDF, cela signifie-t-il que le programme externe est ouvert 1000 fois en même temps? Ou y at-il des optimisations en place pour cela? Évidemment, sur un système multiprocesseur, ce n'est peut-être pas une mauvaise chose d'avoir plusieurs instances du processus en cours, mais 1000 peut être un peu trop.

Répondre

1

J'ai fait un peu de tests et d'expérimentations, et quand cela est fait dans un UDF, il traite en effet chaque ligne à la fois - le serveur SQL n'exécute pas 100 processus pour chacune des 100 lignes (je ne pensais pas qu'il le ferait). Cependant, je crois toujours que faire cela comme un UDF plutôt que comme un curseur serait mieux, parce que mes recherches tendent à montrer que le surcoût d'avoir à retirer les données dans le curseur ralentirait les choses. Cela ne fait peut-être pas une grande différence, mais cela peut vous faire gagner du temps et vous éviter d'extraire toutes les données dans une table temporaire.

1

définir ensemble base dans ce contexte? Si vous avez 100 lignes cela ouvrira-t-il 100 fois l'application en une fois? Je dirais test et juste parce que vous pouvez appeler un proc étendu d'un UDF je voudrais toujours utiliser un curseur pour cela parce que setbased n'a pas d'importance dans ce cas puisque vous ne manipulez pas les données directement dans les tables

Questions connexes