Paramètres table et usage de la mémoire

Le
Geoffroy GABEL
Bonjour
Dans une procédure stockée, j'utilise 3 paramètres tables. Cette procédure
charge des données dans ces 3 tables puis effectue une série de calcul sur
l'une d'entre elles. La procédure retourne une somme sur un champ de cette
dernière, qui est le résultat de tous les calculs précédents.
J'appelle ensuite cette procédure dans une boucle qui effectue environ 900
itérations. Je n'ai pas trouvé de moyen autre que la boucle pour faire mon
calcul pour toutes mes entités.
Bref, au 2/3 environ des itérations, j'ai droit à cette erreur :
Une erreur s'est produite lors de l'exécution du lot. Message d'erreur : Une
exception de type 'System.OutOfMemoryException' a été levée.

Mais ceci n'est pas systématique, parfois toute la boucle se déroule sans
problème.
J'en déduit donc que je sollicite trop la mémoire du serveur. Peux t'on
forcer SQL Server à libérer la mémoire utilisée par ces paramètres table à
la fin de l'exécution de la procédure?
Merci
Geoffroy
Questions / Réponses high-tech
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Geoffroy GABEL
Le #20693391
Bon à priori l'erreur ne viendrait que du fait de l'exécution de la requête
dans SSMS. Avec SqlCmd, je n'ai pas de soucis.
Merci

"Geoffroy GABEL" de discussion : #
Bonjour
Dans une procédure stockée, j'utilise 3 paramètres tables. Cette procédure
charge des données dans ces 3 tables puis effectue une série de calcul sur
l'une d'entre elles. La procédure retourne une somme sur un champ de cette
dernière, qui est le résultat de tous les calculs précédents.
J'appelle ensuite cette procédure dans une boucle qui effectue environ 900
itérations. Je n'ai pas trouvé de moyen autre que la boucle pour faire mon
calcul pour toutes mes entités.
Bref, au 2/3 environ des itérations, j'ai droit à cette erreur :
Une erreur s'est produite lors de l'exécution du lot. Message d'erreur :
Une exception de type 'System.OutOfMemoryException' a été levée.

Mais ceci n'est pas systématique, parfois toute la boucle se déroule sans
problème.
J'en déduit donc que je sollicite trop la mémoire du serveur. Peux t'on
forcer SQL Server à libérer la mémoire utilisée par ces paramètres table à
la fin de l'exécution de la procédure?
Merci
Geoffroy


Fred BROUARD
Le #20702701
Salut geoffroy

Geoffroy GABEL a écrit :
Bonjour
Dans une procédure stockée, j'utilise 3 paramètres tables. Cette
procédure charge des données dans ces 3 tables puis effectue une série
de calcul sur l'une d'entre elles. La procédure retourne une somme sur
un champ de cette dernière, qui est le résultat de tous les calculs
précédents.



et les CTE alors ???? Ne serait-ce pas une bonne idée que de commencer
ta requête par 3 CTE :

WITH
T1 AS
(SELECT ...),
T2 AS
(SELECT ...),
T3 AS
(SELECT ...),
...


J'appelle ensuite cette procédure dans une boucle qui effectue environ
900 itérations. Je n'ai pas trouvé de moyen autre que la boucle pour
faire mon calcul pour toutes mes entités.



Avec la CTE ce sera peut être plus clair !


Bref, au 2/3 environ des itérations, j'ai droit à cette erreur :
Une erreur s'est produite lors de l'exécution du lot. Message d'erreur :
Une exception de type 'System.OutOfMemoryException' a été levée.



Lorsque tu utilise des variables table ou des tables temporaires, il y a
déversement des données de l'un (la base) dans l'autre (la table locale)
ce qui impose une utilisation de la mémoire et des espaces de stockage
de la tempdb.
Alors qu'avec la CTE c'est SQL Server sui choisit la meilleure tectique !


Mais ceci n'est pas systématique, parfois toute la boucle se déroule
sans problème.
J'en déduit donc que je sollicite trop la mémoire du serveur. Peux t'on
forcer SQL Server à libérer la mémoire utilisée par ces paramètres table
à la fin de l'exécution de la procédure?
Merci
Geoffroy



A +
--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
Enseignant aux Arts & Métiers PACA et à L'ISEN Toulon - Var Technologies
*********************** http://www.sqlspot.com *************************
Geoffroy GABEL
Le #20714831
Bonjour Fred
Oui mais la CTE impose son utilisation après sa déclaration.
WITH
T1 AS
(SELECT ...),
T2 AS
(SELECT ...),
T3 AS
(SELECT ...)
SELECT ... FROM T1... T2

Alors que là je fais plusieurs accès au fur et à mesure de ma procédure
stockée à mes tables paramètres.
Bon je vais quand même regardé si je peux modifier ça.
Merci
Geoffroy

"Fred BROUARD" de discussion :
Salut geoffroy

Geoffroy GABEL a écrit :
Bonjour
Dans une procédure stockée, j'utilise 3 paramètres tables. Cette
procédure charge des données dans ces 3 tables puis effectue une série de
calcul sur l'une d'entre elles. La procédure retourne une somme sur un
champ de cette dernière, qui est le résultat de tous les calculs
précédents.



et les CTE alors ???? Ne serait-ce pas une bonne idée que de commencer ta
requête par 3 CTE :

WITH
T1 AS
(SELECT ...),
T2 AS
(SELECT ...),
T3 AS
(SELECT ...),
...


J'appelle ensuite cette procédure dans une boucle qui effectue environ
900 itérations. Je n'ai pas trouvé de moyen autre que la boucle pour
faire mon calcul pour toutes mes entités.



Avec la CTE ce sera peut être plus clair !


Bref, au 2/3 environ des itérations, j'ai droit à cette erreur :
Une erreur s'est produite lors de l'exécution du lot. Message d'erreur :
Une exception de type 'System.OutOfMemoryException' a été levée.



Lorsque tu utilise des variables table ou des tables temporaires, il y a
déversement des données de l'un (la base) dans l'autre (la table locale)
ce qui impose une utilisation de la mémoire et des espaces de stockage de
la tempdb.
Alors qu'avec la CTE c'est SQL Server sui choisit la meilleure tectique !


Mais ceci n'est pas systématique, parfois toute la boucle se déroule sans
problème.
J'en déduit donc que je sollicite trop la mémoire du serveur. Peux t'on
forcer SQL Server à libérer la mémoire utilisée par ces paramètres table
à la fin de l'exécution de la procédure?
Merci
Geoffroy



A +
--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
Enseignant aux Arts & Métiers PACA et à L'ISEN Toulon - Var Technologies
*********************** http://www.sqlspot.com *************************


Publicité
Poster une réponse
Anonyme