Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Paramètres table et usage de la mémoire

3 réponses
Avatar
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

3 réponses

Avatar
Geoffroy GABEL
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" a écrit dans le message de groupe
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


Avatar
Fred BROUARD
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 *************************
Avatar
Geoffroy GABEL
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" a écrit dans le message de groupe
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 *************************