Code SQL dans plusieurs requête plus rapide que le même code dans une seule requête ?
1 réponse
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
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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à.
.
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
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