Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Code SQL dans plusieurs requête plus rapide que le même code dans une seule requête ?

1 réponse
Avatar
Herve MAILLARD
bonjour,

J'ai codé une requête SQL (un peu complexe...)

Si j'execute le code SQL dans un seul requête, le résultat est très très
long à venir (plusieurs minutes).

Par contre si je cinde en 2 requêtes et que j'appelle le résultat dans un
3em, le résultat est presque instantané. Comment règler ce probleme?
En effet, mon soucis c'est que ce code SQL est généré par un prog C# en
fonction de pleins de critère.
Fais-je être obligé de créer des requettes temporaires? C'est possible
d'ailleur ?

Merci de votre aide.

PS: : Voilà le code SQL de la requête :

CREATE TABLE Data_var(ID_var CHAR(4) NOT NULL, date_heure DATETIME NOT
NULL, ValeurINTEGER NOT NULL, PRIMARY KEY (ID_var,date_heure))

INSERT INTO Data_var VALUES ('var1', '2003-06-12T06:00:00', 18)
INSERT INTO Data_var VALUES ('var1', '2003-06-12T06:00:05', 21)
INSERT INTO Data_var VALUES ('var1', '2003-06-12T06:00:17', 23)
INSERT INTO Data_var VALUES ('var1', '2003-06-12T06:00:23', 89)
INSERT INTO Data_var VALUES ('var1', '2003-06-12T06:00:28', 56)
INSERT INTO Data_var VALUES ('var1', '2003-06-12T06:00:37', 23)
INSERT INTO Data_var VALUES ('var1', '2003-06-12T06:00:50', 23)

SELECT * FROM (SELECT date_heure,ISNULL(MIN([2]),0) AS '2' FROM
(SELECT (date_heure),CASE id_var WHEN '2' THEN valeur ELSE NULL END AS
'2'FROM (SELECT Date_heure, Valeur, ID_var FROM
(SELECT TOP 1 '2003-02-07 00:00:00' AS Date_heure, Valeur, ID_var,
Date_Heure AS ExprTP FROM dbo.Data_var
WHERE (Date_Heure <= CONVERT(DATETIME, '2003-07-02 00:00:00',
102))
AND (id_var = 2) ORDER BY Date_Heure DESC)AS TBLTEMP
UNION
SELECT Date_Heure, isnull(Valeur,0), ID_var FROM data_var
WHERE (id_var = 2) AND (Date_Heure >= CONVERT(DATETIME,
'2003-07-02 00:00:00', 102)
AND Date_Heure <= CONVERT(DATETIME,'2003-07-10 00:00:00',
102))) DERIVEDTBL) DERIVEDTBL
GROUP BY date_heure) AS S1
INNER JOIN
(SELECT MIN(Date_Heure) AS Date_Heure FROM (
SELECT date_heure,ISNULL(MIN([2]),0) AS '2' FROM (SELECT
(date_heure),CASE id_var WHEN '2' THEN valeur ELSE NULL END AS '2'
FROM (SELECT Date_heure, Valeur, ID_var FROM
(SELECT TOP 1 '2003-02-07 00:00:00' AS Date_heure, Valeur, ID_var,
Date_Heure AS ExprTP FROM dbo.Data_var
WHERE (Date_Heure <= CONVERT(DATETIME, '2003-07-02 00:00:00', 102))
AND (id_var = 2) ORDER BY Date_Heure DESC)AS TBLTEMP
UNION
SELECT Date_Heure, isnull(Valeur,0), ID_var FROM data_var WHERE
(id_var = 2)
AND (Date_Heure >= CONVERT(DATETIME, '2003-07-02 00:00:00', 102)
AND Date_Heure <= CONVERT(DATETIME,'2003-07-10 00:00:00', 102)))
DERIVEDTBL) DERIVEDTBL
GROUP BY date_heure) DERIVEDTBL
GROUP BY FLOOR(DATEDIFF(SECOND, '20000101', Date_Heure) / 60)) S2
ON S1.Date_Heure = S2.Date_Heure order by S2.date_heure

Ouf... Voilà.

1 réponse

Avatar
nick
Là où tu aurais scindé en plusieur requête, essaye de
mettre un "go".

Ca devrait aider, surtout après le create table et après
les insert.

-----Message d'origine-----
bonjour,

J'ai codé une requête SQL (un peu complexe...)

Si j'execute le code SQL dans un seul requête, le


résultat est très très
long à venir (plusieurs minutes).

Par contre si je cinde en 2 requêtes et que j'appelle le


résultat dans un
3em, le résultat est presque instantané. Comment règler


ce probleme?
En effet, mon soucis c'est que ce code SQL est généré par


un prog C# en
fonction de pleins de critère.
Fais-je être obligé de créer des requettes temporaires?


C'est possible
d'ailleur ?

Merci de votre aide.

PS: : Voilà le code SQL de la requête :

CREATE TABLE Data_var(ID_var CHAR(4) NOT NULL, date_heure


DATETIME NOT
NULL, ValeurINTEGER NOT NULL, PRIMARY KEY


(ID_var,date_heure))

INSERT INTO Data_var VALUES ('var1', '2003-06-


12T06:00:00', 18)
INSERT INTO Data_var VALUES ('var1', '2003-06-


12T06:00:05', 21)
INSERT INTO Data_var VALUES ('var1', '2003-06-


12T06:00:17', 23)
INSERT INTO Data_var VALUES ('var1', '2003-06-


12T06:00:23', 89)
INSERT INTO Data_var VALUES ('var1', '2003-06-


12T06:00:28', 56)
INSERT INTO Data_var VALUES ('var1', '2003-06-


12T06:00:37', 23)
INSERT INTO Data_var VALUES ('var1', '2003-06-


12T06:00:50', 23)

SELECT * FROM (SELECT date_heure,ISNULL(MIN([2]),0)


AS '2' FROM
(SELECT (date_heure),CASE id_var WHEN '2' THEN valeur


ELSE NULL END AS
'2'FROM (SELECT Date_heure, Valeur, ID_var FROM
(SELECT TOP 1 '2003-02-07 00:00:00' AS


Date_heure, Valeur, ID_var,
Date_Heure AS ExprTP FROM dbo.Data_var
WHERE (Date_Heure <= CONVERT(DATETIME, '2003-


07-02 00:00:00',
102))
AND (id_var = 2) ORDER BY Date_Heure DESC)


AS TBLTEMP
UNION
SELECT Date_Heure, isnull(Valeur,0), ID_var


FROM data_var
WHERE (id_var = 2) AND (Date_Heure >=


CONVERT(DATETIME,
'2003-07-02 00:00:00', 102)
AND Date_Heure <= CONVERT(DATETIME,'2003-


07-10 00:00:00',
102))) DERIVEDTBL) DERIVEDTBL
GROUP BY date_heure) AS S1
INNER JOIN
(SELECT MIN(Date_Heure) AS Date_Heure FROM (
SELECT date_heure,ISNULL(MIN([2]),0) AS '2' FROM


(SELECT
(date_heure),CASE id_var WHEN '2' THEN valeur ELSE NULL


END AS '2'
FROM (SELECT Date_heure, Valeur, ID_var FROM
(SELECT TOP 1 '2003-02-07 00:00:00' AS


Date_heure, Valeur, ID_var,
Date_Heure AS ExprTP FROM dbo.Data_var
WHERE (Date_Heure <= CONVERT(DATETIME, '2003-07-


02 00:00:00', 102))
AND (id_var = 2) ORDER BY Date_Heure DESC)AS


TBLTEMP
UNION
SELECT Date_Heure, isnull(Valeur,0), ID_var FROM


data_var WHERE
(id_var = 2)
AND (Date_Heure >= CONVERT(DATETIME, '2003-07-02


00:00:00', 102)
AND Date_Heure <= CONVERT(DATETIME,'2003-07-10


00:00:00', 102)))
DERIVEDTBL) DERIVEDTBL
GROUP BY date_heure) DERIVEDTBL
GROUP BY FLOOR(DATEDIFF(SECOND, '20000101',


Date_Heure) / 60)) S2
ON S1.Date_Heure = S2.Date_Heure order by S2.date_heure

Ouf... Voilà.




.