Si vous voulez des performances il faut abandonner tout ce qui est itératif et ne faire que de l'ensembliste. De plus utilisez des tables instanciées et non des table temporaires ou des variables tables
Donc débarrassez vous :
1) du XML
2) de la table #clientList
Pour faire passer votre liste d'argument, vous pouvez opérer comme ceci :
1) créez une table dans la base de données, structurée comme suit :
1 2 3 4 5 6
| CREATE TABLE dbo.T_PARA_LIST_TPL
(TPL_ID BIGINT IDENTITY NOT NULL PRIMARY KEY,
TPL_USER_TRAN UNIQUEIDENTIFIER NOT NULL,
TPL_USER_VALUE INT NOT NULL);
CREATE INDEX X_TPL_RN_VLU ON dbo.T_PARA_LIST_TPL (TPL_USER_TRAN, TPL_USER_VALUE); |
2) Au niveau du client, calculez un GUID (par exemple EDA006BC-C661-48CD-A091-B8116E02851F) et insérez les valeurs dans cette table comme suit :
1 2 3 4 5 6 7
| INSERT INTO dbo.T_PARA_LIST_TPL
(TPL_USER_TRAN, TPL_USER_VALUE)
VALUES ('EDA006BC-C661-48CD-A091-B8116E02851F', 123),
('EDA006BC-C661-48CD-A091-B8116E02851F', 456),
('EDA006BC-C661-48CD-A091-B8116E02851F', 789),
...
('EDA006BC-C661-48CD-A091-B8116E02851F', 951); |
3) Dans votre proc stock, passez en argument le GUID (EDA006BC-C661-48CD-A091-B8116E02851F), et récrivez la comme suit :
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
| CREATE PROCEDURE dbo.P_SELECT_OPERATION_CLIENTS
@GUID_TRAN UNIQUEIDENTIFIER,
@DateDebut DATETIME,
@DateFin DATETIME
AS
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 dbo.T_PARA_LIST_TPL AS pl
ON pl.TPL_USER_VALUE = c.ClientID
WHERE TPL_USER_TRAN = @GUID_TRAN;
DELETE FROM dbo.T_PARA_LIST_TPL
WHERE @GUID_TRAN;
GO |
4) Lancez la avec les paramètres adéquats, par exemple :
EXECUTE dbo.P_SELECT_OPERATION_CLIENTS 'EDA006BC-C661-48CD-A091-B8116E02851F', '2010-07-27', '2010-08-27';
Enfin, suivez les articles que j'ai écrit à ce sujet pour bien indexer les données de vos tables eut égard à cette requête :
http://sqlpro.developpez.com/cours/quoi-indexer/
http://sqlpro.developpez.com/optimisation/indexation/
http://sqlpro.developpez.com/cours/optimiser/
http://sqlpro.developpez.com/optimisation/
A +
Partager