Bonjour,
En considérant la table dont voici le DDL
Est-il correct de faire :
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 USE [GIFT_MANAGEMENT] GO /****** Object: Table [dbo].[T_SERIAL_SER] Script Date: 11/08/2012 09:52:29 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[T_SERIAL_SER]( [SER_ID] [int] IDENTITY(1,1) NOT NULL, CONSTRAINT [PK_T_SERIAL_SER] PRIMARY KEY CLUSTERED ( [SER_ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO
Plutôt que :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 SELECT TOP 1 SER_ID AS 'CRD_SERIAL' FROM DBO.T_SERIAL_SER SER WHERE SER_ID > @UNE_VALEUR AND SER_ID NOT IN ( @X,@Y,@Z )
Alors je sais qu'il n'y a pas d'ordre dans une table. Que c'est un sac de billes. Mais le fait d'introduire un index cluster n'apporte-t-il pas de l'ordre ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 SELECT MIN(SER_ID) AS 'CRD_SERIAL' FROM DBO.T_SERIAL_SER SER WHERE SER_ID > @UNE_VALEUR AND SER_ID NOT IN ( @X,@Y,@Z )
Je pose cette question car cette petite requête toute simple s'intègre dans en fait dans une plus grande et est le membre de droite d'une clause OUTER APPLY. Le truc est qu'avec le 2e bout de code, je ne vois jamais le bout de la requête... Alors qu'avec le 1e, c'est immédiat ou presque.
Pour info, voici la requête complete :
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 SELECT CRD.TCA_ID, CRD.CRD_RECHARGEABLE, MIN(CRD.CRD_SERIAL) AS 'MIN', MAX(CRD.CRD_SERIAL) AS 'MAX' FROM DBO.T_GIFT_COMMANDE_GFC GFC INNER JOIN dbo.T_CARD_CRD CRD ON GFC.GFT_ID = CRD.GFT_ID OUTER APPLY ( SELECT TOP 1 SER_ID AS 'CRD_SERIAL' FROM DBO.T_SERIAL_SER SER WHERE SER_ID > CRD.CRD_SERIAL AND SER_ID NOT IN ( SELECT CRD_SERIAL FROM DBO.T_GIFT_COMMANDE_GFC GFC2 INNER JOIN dbo.T_CARD_CRD CRD3 ON GFC2.GFT_ID = CRD3.GFT_ID WHERE CRD3.TCA_ID = CRD.TCA_ID AND GFC2.CMD_ID = @CMD_ID ) ) T WHERE GFC.CMD_ID = @CMD_ID GROUP BY CRD.TCA_ID, CRD.CRD_RECHARGEABLE, T.CRD_SERIAL ORDER BY CRD.TCA_ID, CRD.CRD_RECHARGEABLE, [MIN]
Partager