Code SQL dans plusieurs requête plus rapide que le même code dans une seule requête ?
Le
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à.
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à.

Poser une question


mettre un "go".
Ca devrait aider, surtout après le create table et après
les insert.
résultat est très très
résultat dans un
ce probleme?
un prog C# en
C'est possible
DATETIME NOT
(ID_var,date_heure))
12T06:00:00', 18)
12T06:00:05', 21)
12T06:00:17', 23)
12T06:00:23', 89)
12T06:00:28', 56)
12T06:00:37', 23)
12T06:00:50', 23)
AS '2' FROM
ELSE NULL END AS
Date_heure, Valeur, ID_var,
07-02 00:00:00',
AS TBLTEMP
FROM data_var
CONVERT(DATETIME,
07-10 00:00:00',
(SELECT
END AS '2'
Date_heure, Valeur, ID_var,
02 00:00:00', 102))
TBLTEMP
data_var WHERE
00:00:00', 102)
00:00:00', 102)))
Date_Heure) / 60)) S2