OVH Cloud OVH Cloud

Quelle est la bonne requête sous SQL2K

9 réponses
Avatar
okpwal
Bonjour,
Soit la requête (a):

SELECT Q2.b7prev222q,Q2.libelle,Q2.code,Q2.abrev
FROM PREV222Q Q2
WHERE NOT EXISTS (
SELECT *
FROM PREV331R R1
WHERE R1.b7prev222q=Q2.b7prev222q )

vs la requête (b):

SELECT Q2.b7prev222q, Q2.libelle, Q2.code, Q2.abrev
FROM PREV222Q Q2
WHERE Q2.b7prev222q IN (
SELECT b7prev222q FROM PREV222Q
EXCEPT
SELECT b7prev222q FROM PREV331R )

Si un spécialiste du SQL peut m'orienter vers la bonne rédaction ; je
soupconne que l'une d'elle consomme plus de temps en exécution.
Merci.
G.

--
okpwal
la perdrix !

9 réponses

Avatar
Patrice
Le mieux est sans doute de tester sur ta propre config (?)

Ma préférence serait (faire un LEFT JOIN et garder les lignes sans
correspondance):

SELECT Q2.b7prev222q,Q2.libelle,Q2.code,Q2.abrev
FROM PREV222Q Q2
LEFT JOIN PREV331R R1 ON R1.b7prev222q=Q2.b7prev222q
WHERE R1.b7prev222q IS NULL

--
Patrice

"okpwal" a écrit dans le message de
news:
Bonjour,
Soit la requête (a):

SELECT Q2.b7prev222q,Q2.libelle,Q2.code,Q2.abrev
FROM PREV222Q Q2
WHERE NOT EXISTS (
SELECT *
FROM PREV331R R1
WHERE R1.b7prev222q=Q2.b7prev222q )

vs la requête (b):

SELECT Q2.b7prev222q, Q2.libelle, Q2.code, Q2.abrev
FROM PREV222Q Q2
WHERE Q2.b7prev222q IN (
SELECT b7prev222q FROM PREV222Q
EXCEPT
SELECT b7prev222q FROM PREV331R )

Si un spécialiste du SQL peut m'orienter vers la bonne rédaction ; je
soupconne que l'une d'elle consomme plus de temps en exécution.
Merci.
G.

--
okpwal
la perdrix !




Avatar
PePiCK
Je ne pourrrais vous dire la meilleur syntaxe, cependant, regarder les
statistiques peut en dire long.

Petit exemple sur un COUNT(*) et une autre syntaxe plus rapide pour obtenir
le résultat.

SET STATISTICS TIME ON
GO
SET STATISTICS IO ON
GO
SELECT rows FROM sysindexes WHERE id = OBJECT_ID('unetable') AND indid < 2
GO
SELECT COUNT(*) FROM unetable
GO
SET STATISTICS TIME OFF
GO
SET STATISTICS IO OFF
GO

Résultat:

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 1 ms.
rows
-----------
279040

(1 row(s) affected)

Table 'sysindexes'. Scan count 1, logical reads 2, physical reads 0,
read-ahead reads 0.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.

-----------
279040

(1 row(s) affected)

Table 'unetable'. Scan count 1, logical reads 1571, physical reads 0,
read-ahead reads 0.

SQL Server Execution Times:
CPU time = 36 ms, elapsed time = 36 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.



"okpwal" wrote in message
news:
Bonjour,
Soit la requête (a):

SELECT Q2.b7prev222q,Q2.libelle,Q2.code,Q2.abrev
FROM PREV222Q Q2
WHERE NOT EXISTS (
SELECT *
FROM PREV331R R1
WHERE R1.b7prev222q=Q2.b7prev222q )

vs la requête (b):

SELECT Q2.b7prev222q, Q2.libelle, Q2.code, Q2.abrev
FROM PREV222Q Q2
WHERE Q2.b7prev222q IN (
SELECT b7prev222q FROM PREV222Q
EXCEPT
SELECT b7prev222q FROM PREV331R )

Si un spécialiste du SQL peut m'orienter vers la bonne rédaction ; je
soupconne que l'une d'elle consomme plus de temps en exécution.
Merci.
G.

--
okpwal
la perdrix !




Avatar
okpwal
> Le mieux est sans doute de tester sur ta propre config (?)

Ma préférence serait (faire un LEFT JOIN et garder les lignes sans
correspondance):

SELECT Q2.b7prev222q,Q2.libelle,Q2.code,Q2.abrev
FROM PREV222Q Q2
LEFT JOIN PREV331R R1 ON R1.b7prev222q=Q2.b7prev222q
WHERE R1.b7prev222q IS NULL

--
Patrice

"okpwal" a écrit dans le message de
news:
Bonjour,
Soit la requête (a):

SELECT Q2.b7prev222q,Q2.libelle,Q2.code,Q2.abrev
FROM PREV222Q Q2
WHERE NOT EXISTS (
SELECT *
FROM PREV331R R1
WHERE R1.b7prev222q=Q2.b7prev222q )

vs la requête (b):

SELECT Q2.b7prev222q, Q2.libelle, Q2.code, Q2.abrev
FROM PREV222Q Q2
WHERE Q2.b7prev222q IN (
SELECT b7prev222q FROM PREV222Q
EXCEPT
SELECT b7prev222q FROM PREV331R )

Si un spécialiste du SQL peut m'orienter vers la bonne rédaction ; je
soupconne que l'une d'elle consomme plus de temps en exécution.
Merci.
G.

--
okpwal
la perdrix !





merci Patrice,
Dans mon apprentissage du SQL, je recherche sans cesse de nouvelles
voies d'amélioration.

--
okpwal
la perdrix !
Avatar
Fred BROUARD
Bonjour,

vous n'avez pas le choix, l'opérateur ensembliste EXCEPT n'existe pas en SQL
server 2000. Il a été introduit avec la version 2005 !

okpwal a écrit:
Bonjour,
Soit la requête (a):

SELECT Q2.b7prev222q,Q2.libelle,Q2.code,Q2.abrev
FROM PREV222Q Q2
WHERE NOT EXISTS (
SELECT *
FROM PREV331R R1
WHERE R1.b7prev222q=Q2.b7prev222q )

vs la requête (b):

SELECT Q2.b7prev222q, Q2.libelle, Q2.code, Q2.abrev
FROM PREV222Q Q2
WHERE Q2.b7prev222q IN (
SELECT b7prev222q FROM PREV222Q
EXCEPT
SELECT b7prev222q FROM PREV331R )

Si un spécialiste du SQL peut m'orienter vers la bonne rédaction ; je
soupconne que l'une d'elle consomme plus de temps en exécution.
Merci.
G.




--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Avatar
Fred BROUARD
Mon message n'a pas été posté correctement...

pas le choix en v 2000 car EXCEPT n'existe pas.

A +

okpwal a écrit:
Bonjour,
Soit la requête (a):

SELECT Q2.b7prev222q,Q2.libelle,Q2.code,Q2.abrev
FROM PREV222Q Q2
WHERE NOT EXISTS (
SELECT *
FROM PREV331R R1
WHERE R1.b7prev222q=Q2.b7prev222q )

vs la requête (b):

SELECT Q2.b7prev222q, Q2.libelle, Q2.code, Q2.abrev
FROM PREV222Q Q2
WHERE Q2.b7prev222q IN (
SELECT b7prev222q FROM PREV222Q
EXCEPT
SELECT b7prev222q FROM PREV331R )

Si un spécialiste du SQL peut m'orienter vers la bonne rédaction ; je
soupconne que l'une d'elle consomme plus de temps en exécution.
Merci.
G.




--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Avatar
Ch.
bonjour,

si je comprends bien vous voulez récuperer les enregistrements de votre
table A qui ne sont pas present dans votre table B ?

dans tous les cas execmpt n'est valable que pour SQL 2005 il n'existe pas en
SQL 2000

Personellement j'opterais pour cette solution qui doit marcher sous 2000 &
2005
le left outer join aura le merite de renvoyer toute les lignes de la table A
Moins le filtre where a savoir celle qui sont null sur la table B
dans le from de la table R1 autant ne renvoyer que la cle primaire etant
donné que l'etoile va renvoyer bien trop de donnée inutiles !

SELECT Q2.b7prev222q,Q2.libelle,Q2.code,Q2.abrev
FROM PREV222Q as Q2 left outer join
(
SELECT b7prev222q
FROM PREV331R
) R1
on R1.b7prev222q=Q2.b7prev222q
where r1.b7prev222q is null


Si un expert peut confirmer !
Merci







"okpwal" a écrit dans le message de news:

Bonjour,
Soit la requête (a):

SELECT Q2.b7prev222q,Q2.libelle,Q2.code,Q2.abrev
FROM PREV222Q Q2
WHERE NOT EXISTS (
SELECT *
FROM PREV331R R1
WHERE R1.b7prev222q=Q2.b7prev222q )

vs la requête (b):

SELECT Q2.b7prev222q, Q2.libelle, Q2.code, Q2.abrev
FROM PREV222Q Q2
WHERE Q2.b7prev222q IN (
SELECT b7prev222q FROM PREV222Q
EXCEPT
SELECT b7prev222q FROM PREV331R )

Si un spécialiste du SQL peut m'orienter vers la bonne rédaction ; je
soupconne que l'une d'elle consomme plus de temps en exécution.
Merci.
G.

--
okpwal
la perdrix !




Avatar
Fred BROUARD
NOT EXISTS est généralement plus rapide.

A +

Ch. a écrit:
bonjour,

si je comprends bien vous voulez récuperer les enregistrements de votre
table A qui ne sont pas present dans votre table B ?

dans tous les cas execmpt n'est valable que pour SQL 2005 il n'existe pas en
SQL 2000

Personellement j'opterais pour cette solution qui doit marcher sous 2000 &
2005
le left outer join aura le merite de renvoyer toute les lignes de la table A
Moins le filtre where a savoir celle qui sont null sur la table B
dans le from de la table R1 autant ne renvoyer que la cle primaire etant
donné que l'etoile va renvoyer bien trop de donnée inutiles !

SELECT Q2.b7prev222q,Q2.libelle,Q2.code,Q2.abrev
FROM PREV222Q as Q2 left outer join
(
SELECT b7prev222q
FROM PREV331R
) R1
on R1.b7prev222q=Q2.b7prev222q
where r1.b7prev222q is null


Si un expert peut confirmer !
Merci







"okpwal" a écrit dans le message de news:


Bonjour,
Soit la requête (a):

SELECT Q2.b7prev222q,Q2.libelle,Q2.code,Q2.abrev
FROM PREV222Q Q2
WHERE NOT EXISTS (
SELECT *
FROM PREV331R R1
WHERE R1.b7prev222q=Q2.b7prev222q )

vs la requête (b):

SELECT Q2.b7prev222q, Q2.libelle, Q2.code, Q2.abrev
FROM PREV222Q Q2
WHERE Q2.b7prev222q IN (
SELECT b7prev222q FROM PREV222Q
EXCEPT
SELECT b7prev222q FROM PREV331R )

Si un spécialiste du SQL peut m'orienter vers la bonne rédaction ; je
soupconne que l'une d'elle consomme plus de temps en exécution.
Merci.
G.

--
okpwal
la perdrix !










--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Avatar
okpwal
> NOT EXISTS est généralement plus rapide.

A +

Ch. a écrit:
bonjour,

si je comprends bien vous voulez récuperer les enregistrements de votre
table A qui ne sont pas present dans votre table B ?

dans tous les cas execmpt n'est valable que pour SQL 2005 il n'existe pas
en SQL 2000

Personellement j'opterais pour cette solution qui doit marcher sous 2000 &
2005
le left outer join aura le merite de renvoyer toute les lignes de la table
A Moins le filtre where a savoir celle qui sont null sur la table B
dans le from de la table R1 autant ne renvoyer que la cle primaire etant
donné que l'etoile va renvoyer bien trop de donnée inutiles !

SELECT Q2.b7prev222q,Q2.libelle,Q2.code,Q2.abrev
FROM PREV222Q as Q2 left outer join
(
SELECT b7prev222q
FROM PREV331R
) R1
on R1.b7prev222q=Q2.b7prev222q
where r1.b7prev222q is null


Si un expert peut confirmer !
Merci







"okpwal" a écrit dans le message de news:


Bonjour,
Soit la requête (a):

SELECT Q2.b7prev222q,Q2.libelle,Q2.code,Q2.abrev
FROM PREV222Q Q2
WHERE NOT EXISTS (
SELECT *
FROM PREV331R R1
WHERE R1.b7prev222q=Q2.b7prev222q )

vs la requête (b):

SELECT Q2.b7prev222q, Q2.libelle, Q2.code, Q2.abrev
FROM PREV222Q Q2
WHERE Q2.b7prev222q IN (
SELECT b7prev222q FROM PREV222Q
EXCEPT
SELECT b7prev222q FROM PREV331R )

Si un spécialiste du SQL peut m'orienter vers la bonne rédaction ; je
soupconne que l'une d'elle consomme plus de temps en exécution.
Merci.
G.

-- okpwal
la perdrix !












Je vous remercie tous pour ces éclaircissements.
G.

--
okpwal
la perdrix !
Avatar
Ch.
Mais fred quand il y'a un grand nombres d'enregistrements dans les tables
c'est tjrs plus rapide que de faire une jointure le not exist ?




"Fred BROUARD" a écrit dans le message de news:
uS$
NOT EXISTS est généralement plus rapide.

A +

Ch. a écrit:
bonjour,

si je comprends bien vous voulez récuperer les enregistrements de votre
table A qui ne sont pas present dans votre table B ?

dans tous les cas execmpt n'est valable que pour SQL 2005 il n'existe pas
en SQL 2000

Personellement j'opterais pour cette solution qui doit marcher sous 2000
& 2005
le left outer join aura le merite de renvoyer toute les lignes de la
table A Moins le filtre where a savoir celle qui sont null sur la table B
dans le from de la table R1 autant ne renvoyer que la cle primaire etant
donné que l'etoile va renvoyer bien trop de donnée inutiles !

SELECT Q2.b7prev222q,Q2.libelle,Q2.code,Q2.abrev
FROM PREV222Q as Q2 left outer join
(
SELECT b7prev222q
FROM PREV331R
) R1
on R1.b7prev222q=Q2.b7prev222q
where r1.b7prev222q is null


Si un expert peut confirmer !
Merci







"okpwal" a écrit dans le message de news:


Bonjour,
Soit la requête (a):

SELECT Q2.b7prev222q,Q2.libelle,Q2.code,Q2.abrev
FROM PREV222Q Q2
WHERE NOT EXISTS (
SELECT *
FROM PREV331R R1
WHERE R1.b7prev222q=Q2.b7prev222q )

vs la requête (b):

SELECT Q2.b7prev222q, Q2.libelle, Q2.code, Q2.abrev
FROM PREV222Q Q2
WHERE Q2.b7prev222q IN (
SELECT b7prev222q FROM PREV222Q
EXCEPT
SELECT b7prev222q FROM PREV331R )

Si un spécialiste du SQL peut m'orienter vers la bonne rédaction ; je
soupconne que l'une d'elle consomme plus de temps en exécution.
Merci.
G.

--
okpwal
la perdrix !










--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************