J'ai une table reprenant des futurs mouvements de stocks pour des articles.
3 des colonnes sont en fait des cumuls de stock afin d'isoler le plus
rapidement possible les problèmes de stocks.
Les colonnes sont les suivantes :
Codearticle, Date1, heure, Ordre, Variation, CumulStock
La colonne XXX devrait reprende la valeur stock d'une AUTRE TABLE + la somme
de toutes les lignes ayant une date et une heure inférieures. J'ai un
Trigger qui fait cela mais la vitesse n'est pas au rendez-vous dès que le
nombre de lignes de la table augmente.
comment optimatliser cela ?
ci-dessous, le code du Trigger actuel.
La table qui comprend les cumuls s'appelle DISPON
La table avec la valeur du stock de référence s'appelle ARTICLE
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO
ALTER TRIGGER [dbo].[TR_DISPON_INSERT] ON [dbo].[DISPON]
FOR INSERT
AS
BEGIN
UPDATE DISPON SET QTYCUMUL=((SELECT ARTICLE.QUANTITE FROM ARTICLE where
ARTICLE.CODEARTICL=DISPON.codearticl)
+(SELECT SUM(DISPON2.QUANTITE) FROM DISPON DISPON2 WHERE
DISPON2.CODEARTICL=DISPON.CODEARTICL AND DISPON2.CODESTATUS>2 AND
((DISPON2.DATE1+DISPON2.TIME1)<=(DISPON.DATE1+DISPON.TIME1)) )),
QTYCUMULOPT=((SELECT ARTICLE.QUANTITE FROM ARTICLE where
ARTICLE.CODEARTICL=DISPON.codearticl)
+(SELECT SUM(DISPON2.QUANTOPT) FROM DISPON DISPON2 WHERE
DISPON2.CODEARTICL=DISPON.CODEARTICL AND DISPON2.CODESTATUS>1 AND
((DISPON2.DATE1+DISPON2.TIME1)<=(DISPON.DATE1+DISPON.TIME1)) )),
QTYCUMULWS=((SELECT ISNULL(SUM(ARTSTK.QUANTITE),0) FROM ARTSTK where
ARTSTK.CODEARTICL=DISPON.codearticl AND ARTSTK.WACLEUNIK=DISPON.WACLEUNIK
AND ARTSTK.STOREID=DISPON.STOREID)
+(SELECT ISNULL(SUM(DISPON2.QUANTITE),0) FROM DISPON DISPON2 WHERE
DISPON2.CODEARTICL=DISPON.CODEARTICL AND DISPON2.CODESTATUS>2 AND
((DISPON2.DATE1+DISPON2.TIME1)<=(DISPON.DATE1+DISPON.TIME1)) AND
DISPON2.WACLEUNIK=DISPON.WACLEUNIK AND DISPON2.STOREID=DISPON.STOREID)),
QTYCUMULNORET=((SELECT ARTICLE.QUANTITE FROM ARTICLE where
ARTICLE.CODEARTICL=DISPON.codearticl)
+(SELECT SUM(DISPON2.QUANTITE) FROM DISPON DISPON2 WHERE
DISPON2.CODEARTICL=DISPON.CODEARTICL AND DISPON2.CODESTATUS>2 AND
((DISPON2.DATE1<DISPON.DATE1) OR (
(DISPON2.DATE1+DISPON2.TIME1)<=(DISPON.DATE1+DISPON.TIME1) and
ORDRE='Z' )) ))
WHERE DISPON.IDDISPON IN (SELECT DISPON.IDDISPON FROM DISPON INNER JOIN
INSERTED ON INSERTED.CODEARTICL=DISPON.CODEARTICL WHERE
DISPON.DATE1>=INSERTED.DATE1)
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Yann L'ARVOR
Je ne vois pas comment remplacer le curseur vu la complexité du traitement mais vous pouvez optimiser avec une indexation appropriée les requetes de votre trigger, pour une grosse base de données, vous avez des gains possibles...
"B. Neve" a écrit dans le message de news: 4896f83d$0$2863$
Bonjour à tous,
J'ai une table reprenant des futurs mouvements de stocks pour des articles. 3 des colonnes sont en fait des cumuls de stock afin d'isoler le plus rapidement possible les problèmes de stocks. Les colonnes sont les suivantes : Codearticle, Date1, heure, Ordre, Variation, CumulStock
La colonne XXX devrait reprende la valeur stock d'une AUTRE TABLE + la somme de toutes les lignes ayant une date et une heure inférieures. J'ai un Trigger qui fait cela mais la vitesse n'est pas au rendez-vous dès que le nombre de lignes de la table augmente. comment optimatliser cela ?
ci-dessous, le code du Trigger actuel.
La table qui comprend les cumuls s'appelle DISPON La table avec la valeur du stock de référence s'appelle ARTICLE
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO
ALTER TRIGGER [dbo].[TR_DISPON_INSERT] ON [dbo].[DISPON]
FOR INSERT
AS
BEGIN
UPDATE DISPON SET QTYCUMUL=((SELECT ARTICLE.QUANTITE FROM ARTICLE where ARTICLE.CODEARTICL=DISPON.codearticl)
+(SELECT SUM(DISPON2.QUANTITE) FROM DISPON DISPON2 WHERE DISPON2.CODEARTICL=DISPON.CODEARTICL AND DISPON2.CODESTATUS>2 AND ((DISPON2.DATE1+DISPON2.TIME1)<=(DISPON.DATE1+DISPON.TIME1)) )),
QTYCUMULOPT=((SELECT ARTICLE.QUANTITE FROM ARTICLE where ARTICLE.CODEARTICL=DISPON.codearticl)
+(SELECT SUM(DISPON2.QUANTOPT) FROM DISPON DISPON2 WHERE DISPON2.CODEARTICL=DISPON.CODEARTICL AND DISPON2.CODESTATUS>1 AND ((DISPON2.DATE1+DISPON2.TIME1)<=(DISPON.DATE1+DISPON.TIME1)) )),
QTYCUMULWS=((SELECT ISNULL(SUM(ARTSTK.QUANTITE),0) FROM ARTSTK where ARTSTK.CODEARTICL=DISPON.codearticl AND ARTSTK.WACLEUNIK=DISPON.WACLEUNIK AND ARTSTK.STOREID=DISPON.STOREID)
+(SELECT ISNULL(SUM(DISPON2.QUANTITE),0) FROM DISPON DISPON2 WHERE DISPON2.CODEARTICL=DISPON.CODEARTICL AND DISPON2.CODESTATUS>2 AND ((DISPON2.DATE1+DISPON2.TIME1)<=(DISPON.DATE1+DISPON.TIME1)) AND DISPON2.WACLEUNIK=DISPON.WACLEUNIK AND DISPON2.STOREID=DISPON.STOREID)),
QTYCUMULNORET=((SELECT ARTICLE.QUANTITE FROM ARTICLE where ARTICLE.CODEARTICL=DISPON.codearticl)
+(SELECT SUM(DISPON2.QUANTITE) FROM DISPON DISPON2 WHERE DISPON2.CODEARTICL=DISPON.CODEARTICL AND DISPON2.CODESTATUS>2 AND ((DISPON2.DATE1<DISPON.DATE1) OR ( (DISPON2.DATE1+DISPON2.TIME1)<=(DISPON.DATE1+DISPON.TIME1) and ORDRE='Z' )) ))
WHERE DISPON.IDDISPON IN (SELECT DISPON.IDDISPON FROM DISPON INNER JOIN INSERTED ON INSERTED.CODEARTICL=DISPON.CODEARTICL WHERE DISPON.DATE1>=INSERTED.DATE1)
END
Merci d'avance pour vos réponses...
B. Neve
Je ne vois pas comment remplacer le curseur vu la complexité du traitement
mais vous pouvez optimiser avec une indexation appropriée les requetes de
votre trigger, pour une grosse base de données, vous avez des gains
possibles...
"B. Neve" <bne@dagico.com> a écrit dans le message de news:
4896f83d$0$2863$ba620e4c@news.skynet.be...
Bonjour à tous,
J'ai une table reprenant des futurs mouvements de stocks pour des
articles.
3 des colonnes sont en fait des cumuls de stock afin d'isoler le plus
rapidement possible les problèmes de stocks.
Les colonnes sont les suivantes :
Codearticle, Date1, heure, Ordre, Variation, CumulStock
La colonne XXX devrait reprende la valeur stock d'une AUTRE TABLE + la
somme
de toutes les lignes ayant une date et une heure inférieures. J'ai un
Trigger qui fait cela mais la vitesse n'est pas au rendez-vous dès que le
nombre de lignes de la table augmente.
comment optimatliser cela ?
ci-dessous, le code du Trigger actuel.
La table qui comprend les cumuls s'appelle DISPON
La table avec la valeur du stock de référence s'appelle ARTICLE
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO
ALTER TRIGGER [dbo].[TR_DISPON_INSERT] ON [dbo].[DISPON]
FOR INSERT
AS
BEGIN
UPDATE DISPON SET QTYCUMUL=((SELECT ARTICLE.QUANTITE FROM ARTICLE where
ARTICLE.CODEARTICL=DISPON.codearticl)
+(SELECT SUM(DISPON2.QUANTITE) FROM DISPON DISPON2 WHERE
DISPON2.CODEARTICL=DISPON.CODEARTICL AND DISPON2.CODESTATUS>2 AND
((DISPON2.DATE1+DISPON2.TIME1)<=(DISPON.DATE1+DISPON.TIME1)) )),
QTYCUMULOPT=((SELECT ARTICLE.QUANTITE FROM ARTICLE where
ARTICLE.CODEARTICL=DISPON.codearticl)
+(SELECT SUM(DISPON2.QUANTOPT) FROM DISPON DISPON2 WHERE
DISPON2.CODEARTICL=DISPON.CODEARTICL AND DISPON2.CODESTATUS>1 AND
((DISPON2.DATE1+DISPON2.TIME1)<=(DISPON.DATE1+DISPON.TIME1)) )),
QTYCUMULWS=((SELECT ISNULL(SUM(ARTSTK.QUANTITE),0) FROM ARTSTK where
ARTSTK.CODEARTICL=DISPON.codearticl AND ARTSTK.WACLEUNIK=DISPON.WACLEUNIK
AND ARTSTK.STOREID=DISPON.STOREID)
+(SELECT ISNULL(SUM(DISPON2.QUANTITE),0) FROM DISPON DISPON2 WHERE
DISPON2.CODEARTICL=DISPON.CODEARTICL AND DISPON2.CODESTATUS>2 AND
((DISPON2.DATE1+DISPON2.TIME1)<=(DISPON.DATE1+DISPON.TIME1)) AND
DISPON2.WACLEUNIK=DISPON.WACLEUNIK AND DISPON2.STOREID=DISPON.STOREID)),
QTYCUMULNORET=((SELECT ARTICLE.QUANTITE FROM ARTICLE where
ARTICLE.CODEARTICL=DISPON.codearticl)
+(SELECT SUM(DISPON2.QUANTITE) FROM DISPON DISPON2 WHERE
DISPON2.CODEARTICL=DISPON.CODEARTICL AND DISPON2.CODESTATUS>2 AND
((DISPON2.DATE1<DISPON.DATE1) OR (
(DISPON2.DATE1+DISPON2.TIME1)<=(DISPON.DATE1+DISPON.TIME1) and
ORDRE='Z' )) ))
WHERE DISPON.IDDISPON IN (SELECT DISPON.IDDISPON FROM DISPON INNER JOIN
INSERTED ON INSERTED.CODEARTICL=DISPON.CODEARTICL WHERE
DISPON.DATE1>=INSERTED.DATE1)
Je ne vois pas comment remplacer le curseur vu la complexité du traitement mais vous pouvez optimiser avec une indexation appropriée les requetes de votre trigger, pour une grosse base de données, vous avez des gains possibles...
"B. Neve" a écrit dans le message de news: 4896f83d$0$2863$
Bonjour à tous,
J'ai une table reprenant des futurs mouvements de stocks pour des articles. 3 des colonnes sont en fait des cumuls de stock afin d'isoler le plus rapidement possible les problèmes de stocks. Les colonnes sont les suivantes : Codearticle, Date1, heure, Ordre, Variation, CumulStock
La colonne XXX devrait reprende la valeur stock d'une AUTRE TABLE + la somme de toutes les lignes ayant une date et une heure inférieures. J'ai un Trigger qui fait cela mais la vitesse n'est pas au rendez-vous dès que le nombre de lignes de la table augmente. comment optimatliser cela ?
ci-dessous, le code du Trigger actuel.
La table qui comprend les cumuls s'appelle DISPON La table avec la valeur du stock de référence s'appelle ARTICLE
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO
ALTER TRIGGER [dbo].[TR_DISPON_INSERT] ON [dbo].[DISPON]
FOR INSERT
AS
BEGIN
UPDATE DISPON SET QTYCUMUL=((SELECT ARTICLE.QUANTITE FROM ARTICLE where ARTICLE.CODEARTICL=DISPON.codearticl)
+(SELECT SUM(DISPON2.QUANTITE) FROM DISPON DISPON2 WHERE DISPON2.CODEARTICL=DISPON.CODEARTICL AND DISPON2.CODESTATUS>2 AND ((DISPON2.DATE1+DISPON2.TIME1)<=(DISPON.DATE1+DISPON.TIME1)) )),
QTYCUMULOPT=((SELECT ARTICLE.QUANTITE FROM ARTICLE where ARTICLE.CODEARTICL=DISPON.codearticl)
+(SELECT SUM(DISPON2.QUANTOPT) FROM DISPON DISPON2 WHERE DISPON2.CODEARTICL=DISPON.CODEARTICL AND DISPON2.CODESTATUS>1 AND ((DISPON2.DATE1+DISPON2.TIME1)<=(DISPON.DATE1+DISPON.TIME1)) )),
QTYCUMULWS=((SELECT ISNULL(SUM(ARTSTK.QUANTITE),0) FROM ARTSTK where ARTSTK.CODEARTICL=DISPON.codearticl AND ARTSTK.WACLEUNIK=DISPON.WACLEUNIK AND ARTSTK.STOREID=DISPON.STOREID)
+(SELECT ISNULL(SUM(DISPON2.QUANTITE),0) FROM DISPON DISPON2 WHERE DISPON2.CODEARTICL=DISPON.CODEARTICL AND DISPON2.CODESTATUS>2 AND ((DISPON2.DATE1+DISPON2.TIME1)<=(DISPON.DATE1+DISPON.TIME1)) AND DISPON2.WACLEUNIK=DISPON.WACLEUNIK AND DISPON2.STOREID=DISPON.STOREID)),
QTYCUMULNORET=((SELECT ARTICLE.QUANTITE FROM ARTICLE where ARTICLE.CODEARTICL=DISPON.codearticl)
+(SELECT SUM(DISPON2.QUANTITE) FROM DISPON DISPON2 WHERE DISPON2.CODEARTICL=DISPON.CODEARTICL AND DISPON2.CODESTATUS>2 AND ((DISPON2.DATE1<DISPON.DATE1) OR ( (DISPON2.DATE1+DISPON2.TIME1)<=(DISPON.DATE1+DISPON.TIME1) and ORDRE='Z' )) ))
WHERE DISPON.IDDISPON IN (SELECT DISPON.IDDISPON FROM DISPON INNER JOIN INSERTED ON INSERTED.CODEARTICL=DISPON.CODEARTICL WHERE DISPON.DATE1>=INSERTED.DATE1)
END
Merci d'avance pour vos réponses...
B. Neve
Fred BROUARD
Bonjour,
B. Neve a écrit :
Bonjour à tous,
J'ai une table reprenant des futurs mouvements de stocks pour des articles. 3 des colonnes sont en fait des cumuls de stock afin d'isoler le plus rapidement possible les problèmes de stocks. Les colonnes sont les suivantes : Codearticle, Date1, heure, Ordre, Variation, CumulStock
La colonne XXX devrait reprende la valeur stock d'une AUTRE TABLE + la somme de toutes les lignes ayant une date et une heure inférieures. J'ai un Trigger qui fait cela mais la vitesse n'est pas au rendez-vous dès que le nombre de lignes de la table augmente. comment optimatliser cela ?
Il serait beaucoup plus performant de supprimer votre colonne CumulStock et de passer à une vue indexée. C'est fait pour cela.
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 *********************** http://www.sqlspot.com *************************
ci-dessous, le code du Trigger actuel.
La table qui comprend les cumuls s'appelle DISPON La table avec la valeur du stock de référence s'appelle ARTICLE
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO
ALTER TRIGGER [dbo].[TR_DISPON_INSERT] ON [dbo].[DISPON]
FOR INSERT
AS
BEGIN
UPDATE DISPON SET QTYCUMUL=((SELECT ARTICLE.QUANTITE FROM ARTICLE where ARTICLE.CODEARTICL=DISPON.codearticl)
+(SELECT SUM(DISPON2.QUANTITE) FROM DISPON DISPON2 WHERE DISPON2.CODEARTICL=DISPON.CODEARTICL AND DISPON2.CODESTATUS>2 AND ((DISPON2.DATE1+DISPON2.TIME1)<=(DISPON.DATE1+DISPON.TIME1)) )),
QTYCUMULOPT=((SELECT ARTICLE.QUANTITE FROM ARTICLE where ARTICLE.CODEARTICL=DISPON.codearticl)
+(SELECT SUM(DISPON2.QUANTOPT) FROM DISPON DISPON2 WHERE DISPON2.CODEARTICL=DISPON.CODEARTICL AND DISPON2.CODESTATUS>1 AND ((DISPON2.DATE1+DISPON2.TIME1)<=(DISPON.DATE1+DISPON.TIME1)) )),
QTYCUMULWS=((SELECT ISNULL(SUM(ARTSTK.QUANTITE),0) FROM ARTSTK where ARTSTK.CODEARTICL=DISPON.codearticl AND ARTSTK.WACLEUNIK=DISPON.WACLEUNIK AND ARTSTK.STOREID=DISPON.STOREID)
+(SELECT ISNULL(SUM(DISPON2.QUANTITE),0) FROM DISPON DISPON2 WHERE DISPON2.CODEARTICL=DISPON.CODEARTICL AND DISPON2.CODESTATUS>2 AND ((DISPON2.DATE1+DISPON2.TIME1)<=(DISPON.DATE1+DISPON.TIME1)) AND DISPON2.WACLEUNIK=DISPON.WACLEUNIK AND DISPON2.STOREID=DISPON.STOREID)),
QTYCUMULNORET=((SELECT ARTICLE.QUANTITE FROM ARTICLE where ARTICLE.CODEARTICL=DISPON.codearticl)
+(SELECT SUM(DISPON2.QUANTITE) FROM DISPON DISPON2 WHERE DISPON2.CODEARTICL=DISPON.CODEARTICL AND DISPON2.CODESTATUS>2 AND ((DISPON2.DATE1<DISPON.DATE1) OR ( (DISPON2.DATE1+DISPON2.TIME1)<=(DISPON.DATE1+DISPON.TIME1) and ORDRE='Z' )) ))
WHERE DISPON.IDDISPON IN (SELECT DISPON.IDDISPON FROM DISPON INNER JOIN INSERTED ON INSERTED.CODEARTICL=DISPON.CODEARTICL WHERE DISPON.DATE1>=INSERTED.DATE1)
END
Merci d'avance pour vos réponses...
B. Neve
Bonjour,
B. Neve a écrit :
Bonjour à tous,
J'ai une table reprenant des futurs mouvements de stocks pour des articles.
3 des colonnes sont en fait des cumuls de stock afin d'isoler le plus
rapidement possible les problèmes de stocks.
Les colonnes sont les suivantes :
Codearticle, Date1, heure, Ordre, Variation, CumulStock
La colonne XXX devrait reprende la valeur stock d'une AUTRE TABLE + la
somme
de toutes les lignes ayant une date et une heure inférieures. J'ai un
Trigger qui fait cela mais la vitesse n'est pas au rendez-vous dès que le
nombre de lignes de la table augmente.
comment optimatliser cela ?
Il serait beaucoup plus performant de supprimer votre colonne CumulStock
et de passer à une vue indexée. C'est fait pour cela.
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
*********************** http://www.sqlspot.com *************************
ci-dessous, le code du Trigger actuel.
La table qui comprend les cumuls s'appelle DISPON
La table avec la valeur du stock de référence s'appelle ARTICLE
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO
ALTER TRIGGER [dbo].[TR_DISPON_INSERT] ON [dbo].[DISPON]
FOR INSERT
AS
BEGIN
UPDATE DISPON SET QTYCUMUL=((SELECT ARTICLE.QUANTITE FROM ARTICLE where
ARTICLE.CODEARTICL=DISPON.codearticl)
+(SELECT SUM(DISPON2.QUANTITE) FROM DISPON DISPON2 WHERE
DISPON2.CODEARTICL=DISPON.CODEARTICL AND DISPON2.CODESTATUS>2 AND
((DISPON2.DATE1+DISPON2.TIME1)<=(DISPON.DATE1+DISPON.TIME1)) )),
QTYCUMULOPT=((SELECT ARTICLE.QUANTITE FROM ARTICLE where
ARTICLE.CODEARTICL=DISPON.codearticl)
+(SELECT SUM(DISPON2.QUANTOPT) FROM DISPON DISPON2 WHERE
DISPON2.CODEARTICL=DISPON.CODEARTICL AND DISPON2.CODESTATUS>1 AND
((DISPON2.DATE1+DISPON2.TIME1)<=(DISPON.DATE1+DISPON.TIME1)) )),
QTYCUMULWS=((SELECT ISNULL(SUM(ARTSTK.QUANTITE),0) FROM ARTSTK where
ARTSTK.CODEARTICL=DISPON.codearticl AND ARTSTK.WACLEUNIK=DISPON.WACLEUNIK
AND ARTSTK.STOREID=DISPON.STOREID)
+(SELECT ISNULL(SUM(DISPON2.QUANTITE),0) FROM DISPON DISPON2 WHERE
DISPON2.CODEARTICL=DISPON.CODEARTICL AND DISPON2.CODESTATUS>2 AND
((DISPON2.DATE1+DISPON2.TIME1)<=(DISPON.DATE1+DISPON.TIME1)) AND
DISPON2.WACLEUNIK=DISPON.WACLEUNIK AND DISPON2.STOREID=DISPON.STOREID)),
QTYCUMULNORET=((SELECT ARTICLE.QUANTITE FROM ARTICLE where
ARTICLE.CODEARTICL=DISPON.codearticl)
+(SELECT SUM(DISPON2.QUANTITE) FROM DISPON DISPON2 WHERE
DISPON2.CODEARTICL=DISPON.CODEARTICL AND DISPON2.CODESTATUS>2 AND
((DISPON2.DATE1<DISPON.DATE1) OR (
(DISPON2.DATE1+DISPON2.TIME1)<=(DISPON.DATE1+DISPON.TIME1) and
ORDRE='Z' )) ))
WHERE DISPON.IDDISPON IN (SELECT DISPON.IDDISPON FROM DISPON INNER JOIN
INSERTED ON INSERTED.CODEARTICL=DISPON.CODEARTICL WHERE
DISPON.DATE1>=INSERTED.DATE1)
J'ai une table reprenant des futurs mouvements de stocks pour des articles. 3 des colonnes sont en fait des cumuls de stock afin d'isoler le plus rapidement possible les problèmes de stocks. Les colonnes sont les suivantes : Codearticle, Date1, heure, Ordre, Variation, CumulStock
La colonne XXX devrait reprende la valeur stock d'une AUTRE TABLE + la somme de toutes les lignes ayant une date et une heure inférieures. J'ai un Trigger qui fait cela mais la vitesse n'est pas au rendez-vous dès que le nombre de lignes de la table augmente. comment optimatliser cela ?
Il serait beaucoup plus performant de supprimer votre colonne CumulStock et de passer à une vue indexée. C'est fait pour cela.
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 *********************** http://www.sqlspot.com *************************
ci-dessous, le code du Trigger actuel.
La table qui comprend les cumuls s'appelle DISPON La table avec la valeur du stock de référence s'appelle ARTICLE
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO
ALTER TRIGGER [dbo].[TR_DISPON_INSERT] ON [dbo].[DISPON]
FOR INSERT
AS
BEGIN
UPDATE DISPON SET QTYCUMUL=((SELECT ARTICLE.QUANTITE FROM ARTICLE where ARTICLE.CODEARTICL=DISPON.codearticl)
+(SELECT SUM(DISPON2.QUANTITE) FROM DISPON DISPON2 WHERE DISPON2.CODEARTICL=DISPON.CODEARTICL AND DISPON2.CODESTATUS>2 AND ((DISPON2.DATE1+DISPON2.TIME1)<=(DISPON.DATE1+DISPON.TIME1)) )),
QTYCUMULOPT=((SELECT ARTICLE.QUANTITE FROM ARTICLE where ARTICLE.CODEARTICL=DISPON.codearticl)
+(SELECT SUM(DISPON2.QUANTOPT) FROM DISPON DISPON2 WHERE DISPON2.CODEARTICL=DISPON.CODEARTICL AND DISPON2.CODESTATUS>1 AND ((DISPON2.DATE1+DISPON2.TIME1)<=(DISPON.DATE1+DISPON.TIME1)) )),
QTYCUMULWS=((SELECT ISNULL(SUM(ARTSTK.QUANTITE),0) FROM ARTSTK where ARTSTK.CODEARTICL=DISPON.codearticl AND ARTSTK.WACLEUNIK=DISPON.WACLEUNIK AND ARTSTK.STOREID=DISPON.STOREID)
+(SELECT ISNULL(SUM(DISPON2.QUANTITE),0) FROM DISPON DISPON2 WHERE DISPON2.CODEARTICL=DISPON.CODEARTICL AND DISPON2.CODESTATUS>2 AND ((DISPON2.DATE1+DISPON2.TIME1)<=(DISPON.DATE1+DISPON.TIME1)) AND DISPON2.WACLEUNIK=DISPON.WACLEUNIK AND DISPON2.STOREID=DISPON.STOREID)),
QTYCUMULNORET=((SELECT ARTICLE.QUANTITE FROM ARTICLE where ARTICLE.CODEARTICL=DISPON.codearticl)
+(SELECT SUM(DISPON2.QUANTITE) FROM DISPON DISPON2 WHERE DISPON2.CODEARTICL=DISPON.CODEARTICL AND DISPON2.CODESTATUS>2 AND ((DISPON2.DATE1<DISPON.DATE1) OR ( (DISPON2.DATE1+DISPON2.TIME1)<=(DISPON.DATE1+DISPON.TIME1) and ORDRE='Z' )) ))
WHERE DISPON.IDDISPON IN (SELECT DISPON.IDDISPON FROM DISPON INNER JOIN INSERTED ON INSERTED.CODEARTICL=DISPON.CODEARTICL WHERE DISPON.DATE1>=INSERTED.DATE1)