Bonjour à tous,

Tout d’abord désolé si un sujet semblable a déjà été posté, j’ai fais quelques recherches et j’ai trouvé des indices, mais rien précisément qui répondait exactement à ma question.

En fait j’aimerais avoir vos conseils par rapport à la formulation de cette requête :


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
DECLARE @client# XML
SET @client# = '<clients><id>234</id><id>231</id><id>228</id><id>1618</id><id>224</id><id>223</id><id>217</id><id>205</id></clients>'
 
DECLARE @DateDebut# DATETIME
SET @DateDebut# = '2010-07-27'
 
DECLARE @DateFin# DATETIME
SET @DateFin# = '2010-08-27'
 
 
SELECT  ParamValues.ID.value('.', 'INT') AS ID
INTO    #clientList
FROM    @client#.nodes('/clients/id') AS ParamValues ( ID )
 
 
SELECT  o.OperationID ,
        s.FKModuleID ,
        c.ClientID
FROM    dbo.Operation o
        INNER JOIN dbo.clients c ON c.ClientID = o.FKClientID
                                      AND o.OperationType IN ( 1, 10 )
                                      AND o.OperationState IN ( 0, 3 )
                                      AND c.Update = 1
                                      AND o.Update = 1
                                      AND ISNULL(c.Dead, 0) = 0
        INNER JOIN dbo.Stages s ON s.FkOperationID = o.OperationID
                                     AND s.UniqueID = ( SELECT  ISNULL(MAX(UniqueID), -1) AS ID
                                                        FROM    Stages
                                                        WHERE   FKOperationID = o.OperationID
                                                                AND StageState = 0
                                                      )
                                     AND s.DateStage >= @DateDebut#
                                     AND s.DateStage <= @DateFin#
        INNER JOIN #clientList pl ON pl.ID = c.ClientID
 
 
DROP TABLE #clientList

La partie dans le 2e « INNER JOIN » :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
AND s.UniqueID = ( SELECT  ISNULL(MAX(UniqueID), -1) AS ID
                                                        FROM    Stages
                                                        WHERE   FKOperationID = o.OperationID
                                                                AND StageState = 0
                                                      )
Cette partie, lorsque je passe une longue liste de clients, mais surtout lorsque j’allonge raisonnablement l’intervalle de dates, ralentit énormément le temps de réponse de la requête. Je me demandais, remarquez-vous quelque chose au niveau de la syntaxe qui pourrait être optimisé? Car à priori je semble procéder de la bonne façon, peut-être dois-je juste me résoudre à l’idée que le traitement prendra toujours un temps considérable en fonction de l’intervalle de dates et de la liste de clients.

Merci à l’avance des conseils que vous pourrez m’apporter à ce sujet!