Bonjour à vous tous. Je me tourne vers vous car après de longues recherches sur ce forum et sur le web je ne trouve pas de réponse à mon problème.

J'ai un Job en Transact SQL que je dois faire tourner sur une base à peu prêt toutes les 2 / 3 minutes. Ce job fait des Update de champs tout simple.

Mon job est trop long pour être directement implanté dans le SQL Agent j'ai donc créé une procédure stockée que j'appelle dans mon job.

Mais voilà mon job met à peu prêt 2 minutes / 2minutes 40 à tourner (pour 4 update sur 14 lignes en tout) et fait monter en flèche le proc de mon serveur alors que quand je le tourne dans l'analyseur de requêtes, sur le même jeu d'enregistrement il s'exécute sans aucun problème en 2 secondes.

L'utilisateur de mon Job est bien l'administrateur.

Donc je pense ne pas utiliser l'Agent SQL de ce fait mais lancer en batch avec sqlcmd ma requete avec tache planifiée pour voir si ça tourne mieux.

Sinon si vous savez pourquoi l'agent SQL est si lent et si gourmand je suis preneur.

Pour info voici mon Job, je travaille sur une BDD de SAGE Ligne 100 SQL. Je traite le verrouillage des lignes.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
 
SET NOCOUNT ON
DECLARE @DO_PIECE varchar(9)
DECLARE @DO_TYPE smallint
DECLARE @DO_DOMAINE smallint
DECLARE @DO_cbMarq int
DECLARE @DO_Dure_Contrat numeric
DECLARE @DO_majorachat numeric
DECLARE @lock int
 
set @DO_DOMAINE = 0 -- 0=ventes
set @DO_TYPE = 0 -- 0=devis
 
-- Table temporaire de jointure entre les do_cbmarq et les dl_cbmarq :
select do.cbMarq DOcbMarq, dl.cbMarq DLcbMarq
into #temp
from F_DOCENTETE do
inner join F_DOCLIGNE dl on do.DO_Domaine = dl.DO_Domaine
	and do.DO_Type = dl.DO_Type and do.DO_Piece = dl.DO_Piece
WHERE do.crmsync='linesnotok' and do.DO_Ref = 'QT-298/4'
and do.DO_Domaine = @DO_DOMAINE and do.DO_Type = @DO_TYPE
and isnull(dl.AR_Ref,'') <> ''
 
if((select count(*) from #temp) > 0)
BEGIN
 
	-- Connexion à la Gescom :
	exec CB_Connect 'CIAL'
 
	DECLARE MyCursor CURSOR FOR
	 SELECT do.DO_PIECE,do.cbMarq,do.Dure_Contrat,isnull(do.majorachat,0) majorachat FROM F_DOCENTETE do
	 inner join (select distinct DOcbMarq from #temp) tmp on do.cbMarq = tmp.DOcbMarq
	 ORDER BY do.cbMarq
 
	OPEN MyCursor -- j'initialise mon curseur 
 
	-- je le rempli avec la première ligne retournée par la requête 
	FETCH NEXT FROM MyCursor INTO @DO_PIECE, @DO_cbMarq, @DO_Dure_Contrat, @DO_majorachat 
 
	-- Tant que je n'ai pas traité tous les enregistrements de le requête 
	WHILE @@FETCH_STATUS  = 0 
	BEGIN 
		exec CB_IsRecordLock 'F_DOCENTETE', @DO_cbMarq, @lock OUTPUT --Test si l'enregistrement est locké
		-- Ne pas lever d'erreur afin de pouvoir continuer le traitement sur les autres documents éventuels :
		IF @lock = 0
		BEGIN
 
		  -- Verrouillage du document :
		  exec CB_LockRecord 'F_DOCENTETE', 3, @DO_cbMarq
 
		  if(@DO_majorachat<>0)
		  BEGIN
			--  1- Majoration des Lignes de Rachat
			UPDATE dl 
			SET dl.DL_QteBC = dl.DL_Qte*1.1,
			dl.DL_QteBL = dl.DL_Qte*1.1,
			dl.EU_Qte = dl.DL_Qte*1.1, 
			dl.DL_MontantHT = dl.DL_Qte*1.1, 
			dl.DL_MontantTTC = ROUND(dl.DL_Qte*1.1*(1+(dl.DL_Taxe1/100)),2), 
			dl.DL_Qte = dl.DL_Qte*1.1
			FROM F_DOCLIGNE dl
			INNER JOIN #temp tmp on dl.cbMarq = tmp.DLcbMarq
			WHERE tmp.DOcbMarq = @DO_cbMarq
			AND dl.AR_Ref = 'RACHVIDCST'
 
			--  2- Majoration Remise
			UPDATE dl 
			SET dl.DL_MontantHT = dl.DL_MontantHT-@DO_majorachat, 
			dl.DL_MontantTTC = dl.DL_MontantTTC-ROUND(@DO_majorachat*(1+(dl.DL_Taxe1/100)),2) 
			FROM F_DOCLIGNE dl
			INNER JOIN #temp tmp on dl.cbMarq = tmp.DLcbMarq
			WHERE tmp.DOcbMarq = @DO_cbMarq
			AND dl.AR_Ref = 'REM_VI'
		  END
 
		  --  3- Valorisation Loyer
		  UPDATE dl 
		  SET dl.DL_PoidsBrut = ROUND(((dl.DL_MontantHT/(@DO_Dure_Contrat/1.2))*1000),2) 
		  FROM F_DOCLIGNE dl
		  INNER JOIN #temp tmp on dl.cbMarq = tmp.DLcbMarq
		  WHERE tmp.DOcbMarq = @DO_cbMarq
 
		  -- 4 ReFlag de l'entête
		  UPDATE F_DOCENTETE 
		  SET crmsync='linesok', majorachat = 0
		  WHERE F_DOCENTETE.cbMarq = @DO_cbMarq
 
		  -- Déverrouillage du document :
		  exec CB_UnLockRecord 'F_DOCENTETE', 3, @DO_cbMarq
 
		END
		FETCH NEXT FROM MyCursor INTO @DO_PIECE, @DO_cbMarq, @DO_Dure_Contrat, @DO_majorachat 
	END 
 
	CLOSE myCursor -- je ferme mon curseur 
	DEALLOCATE myCursor -- je libère la mémoire allouée à ce curseur
 
	-- Déconnexion de la Gescom :
	exec CB_Disconnect
END
 
-- Suppression de la table temporaire :
drop table #temp
Merci à tous ceux qui auront la gentillesse de m'aider !

Bonne journée.