83 votes

Une requête rapide s'exécute lentement dans SSRS

J'ai un rapport SSRS qui fait appel à une procédure stockée. Si j'exécute la procédure stockée directement à partir d'une fenêtre de requête, elle est renvoyée en moins de 2 secondes. Cependant, la même requête exécutée à partir d'un rapport SSRS 2005 prend jusqu'à 5 minutes. Cela ne se produit pas seulement lors de la première exécution, mais à chaque fois. De plus, je ne vois pas ce même problème dans d'autres environnements.

Avez-vous une idée de la raison pour laquelle le rapport SSRS est si lent dans cet environnement particulier ?

1 votes

Votre sp a-t-il des paramètres ?

1 votes

Oui, il y a environ 9 paramètres. Les types de paramètres du rapport correspondent aux types de paramètres de la procédure stockée.

0 votes

N'hésitez pas à accepter votre propre réponse afin que la question puisse être utilisée en double.

119voto

user275554 Points 456

Merci pour les suggestions fournies ici. Nous avons trouvé une solution et il s'est avéré que le problème était lié aux paramètres. Le serveur SQL produisait un plan d'exécution alambiqué lorsqu'il était exécuté à partir du rapport SSRS en raison du "reniflage des paramètres". La solution consistait à déclarer des variables dans la procédure stockée et à affecter les paramètres entrants aux variables. La requête utilisait alors les variables plutôt que les paramètres. Ainsi, la requête s'exécute de manière cohérente, qu'elle soit appelée depuis SQL Server Manager ou depuis le rapport SSRS.

0 votes

Il s'agit d'un problème connu de SQL Server... qui n'est pas lié à SSRS lui-même.

0 votes

Grrr ! Merci de poster la solution et le problème. Il a été optimisé correctement Fri, venir et c'est DOA, réaffecter les paramètres à de nouvelles variables et c'est de retour à la normale.

3 votes

Plutôt que de réaffecter toutes les variables, vous pouvez également marquer la requête OPTIMIZE FOR UNKNOWN. Voir stackoverflow.com/questions/12979493/

16voto

Brian Smedley Points 41

Ajoutez ceci à la fin de votre proc : option(recompile)

Cela permettra au rapport de s'exécuter presque aussi rapidement que la procédure stockée.

0 votes

Cela recompilera la procédure stockée à chaque fois que vous l'exécuterez. Je ne suis pas sûr que ce soit une bonne solution car cela va à l'encontre de l'objectif des procédures stockées.

6 votes

Si une requête individuelle est lente, l'ajout d'une option (recompilation) au niveau de la requête peut faire une grande différence. N'oubliez pas : recompilation = optimisation. Si vous avez besoin que la requête s'exécute en un temps très court (100 ms ou moins, par exemple), le temps de recompilation peut être inacceptable, et le contournement du reniflage des paramètres peut être plus efficace pour vous. Mais sur les grands rapports qui prennent des minutes, le coût de la recompilation est négligeable par rapport à la pénalité d'avoir un mauvais plan de requête.

0 votes

J'ai eu le même problème et j'ai ajouté option(recompile) à la fin du SP. Le rapport s'est affiché en moins d'une seconde. Je l'ai ensuite supprimé et le rapport s'affiche toujours aussi rapidement.

16voto

JHFB Points 182

J'ajouterai que j'ai eu le même problème avec une requête sans procédure stockée - juste une simple instruction de sélection. Pour résoudre ce problème, j'ai déclaré une variable dans l'instruction SQL de l'ensemble de données et je l'ai définie comme étant égale au paramètre SSRS.

Quelle solution de rechange ennuyeuse ! Merci quand même à tous de m'avoir permis de me rapprocher de la réponse !

4 votes

Merci de partager cela. J'utilisais également la méthode de la procédure non stockée et cela m'a fait gagner beaucoup de temps.

1 votes

Le reniflage des paramètres ; en particulier si le front-end a un tas de paramètres. les redéfinir en paramètres internes a fait l'affaire pour moi dans le passé, donc je vote pour cette réponse. L'option recompilée n'a pas fonctionné dans mon cas où j'avais 8 paramètres de rapport, dont 3 avec des valeurs multi-paramètres.

12voto

Redroidmator Points 51

J'ai eu le même problème, voici ma description du problème

"J'ai créé une procédure de stockage qui génère 2200 lignes et s'exécute en presque 2 secondes. Cependant, après avoir appelé la procédure de stockage à partir de SSRS 2008 et exécuté le rapport, elle ne s'est jamais exécutée et j'ai finalement dû tuer le BIDS (Business Intelligence development Studio) à partir du gestionnaire de tâches.

Ce que j'ai essayé : J'ai essayé d'exécuter le SP à partir du Login de l'utilisateur du rapport mais le SP fonctionnait normalement pour cet utilisateur aussi, j'ai vérifié le Profiler mais rien n'a fonctionné.

Solution :

En fait, le problème est que même si le SP génère le résultat, le moteur SSRS prend du temps pour lire ces nombreuses lignes et les restituer. J'ai donc ajouté l'option WITH RECOMPILE dans SP et j'ai exécuté le rapport. C'est alors que le miracle s'est produit et que mon problème a été résolu.

6voto

Rod C Points 11

J'ai eu le même scénario Un rapport très basique, le SP (qui ne prend en compte qu'un seul paramètre) prenait 5 secondes pour ramener 10K enregistrements, mais le rapport prenait 6 minutes à s'exécuter. Selon le profileur et la table ExecutionLogStorage de RS, le rapport passait tout son temps sur la requête. Le commentaire de Brian S. m'a conduit à la solution : j'ai simplement ajouté WITH RECOMPILE avant l'instruction AS dans le SP, et maintenant le temps du rapport correspond à peu près au temps d'exécution du SP.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X