Bonjour,

J'ai un comportement que je ne m explique pas avec un "IF EXISTS": celui-ci prend plusieurs minutes d'exécution... alors que "SELECT @Counter" + "IF @Counter..." ne prend que quelques millisecondes.
PS:Le script "SELECT ..." est exactement le même (copier/coller)

Code "IF EXISTS":
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
 
IF EXISTS (SELECT NULL
					FROM AVGV300 WITH (NOLOCK)
						INNER JOIN PRMD000 sk WITH (NOLOCK) ON sk.RECORDID = AVGV300.REF_RECID AND AVGV300.FELDNAME = 'ZeichnungGedruckt'
						INNER JOIN CTI_Trig_PRMD0x0 ae WITH (NOLOCK) ON ae.BDE_NR = sk.BDE_NR AND ae.TableName = 'PRMD000'
					WHERE ISNULL(AVGV300.PAR_VALUE, '0.0') <> '10.0'
						AND sk.Auftrag NOT LIKE '60%'
						AND LTRIM(RTRIM(ISNULL(sk.Zeichnung, ''))) <> ''
						AND (ISNULL(ae.Zeichnung_N, '') <> ISNULL(ae.Zeichnung_O, '')
									OR ISNULL(ae.Zeich_Idx_N, '') <> ISNULL(ae.Zeich_Idx_O, '')
							)
						AND ISNULL(AVGV300.DAT_AEN, AVGV300.DAT_NEU) IS NOT NULL
						AND ae.InsertDate IS NOT NULL
						AND ae.InsertDate > ISNULL(AVGV300.DAT_AEN, AVGV300.DAT_NEU)
					)
BEGIN
	PRINT 'Exists...'
END
ELSE
BEGIN
	PRINT 'Not exists...'
END
(> 9 minutes !)

Code "SELECT @Counter" + "IF @Counter...":
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
 
DECLARE @Counter INTEGER
SELECT @Counter = COUNT(*)
	FROM AVGV300 WITH (NOLOCK)
		INNER JOIN PRMD000 sk WITH (NOLOCK) ON sk.RECORDID = AVGV300.REF_RECID AND AVGV300.FELDNAME = 'ZeichnungGedruckt'
		INNER JOIN CTI_Trig_PRMD0x0 ae WITH (NOLOCK) ON ae.BDE_NR = sk.BDE_NR AND ae.TableName = 'PRMD000'
	WHERE ISNULL(AVGV300.PAR_VALUE, '0.0') <> '10.0'
		AND sk.Auftrag NOT LIKE '60%'
		AND LTRIM(RTRIM(ISNULL(sk.Zeichnung, ''))) <> ''
		AND (ISNULL(ae.Zeichnung_N, '') <> ISNULL(ae.Zeichnung_O, '')
					OR ISNULL(ae.Zeich_Idx_N, '') <> ISNULL(ae.Zeich_Idx_O, '')
			)
		AND ISNULL(AVGV300.DAT_AEN, AVGV300.DAT_NEU) IS NOT NULL
		AND ae.InsertDate IS NOT NULL
		AND ae.InsertDate > ISNULL(AVGV300.DAT_AEN, AVGV300.DAT_NEU)
SELECT @Counter
IF @Counter > 0
BEGIN
	PRINT 'Exists...'
END
ELSE
BEGIN
	PRINT 'Not exists...'
END
(< 1 seconde)

Je travaille sur SQL-Server 2008 (Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (X64) Jul 9 2008 14:17:44 Copyright (c) 1988-2008 Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7600: ) )

Quelqu'un peut il m'expliquer ?

Merci d'avance


(AVGV300 -> 17780 rows ; CTI_Trig_PRMD0x0 -> 293.788 rows)