Tester l'existence d'une occurence le plus rapidement possible
7 réponses
Julien FOULQUIER
Je cherche à extraire la liste de mes clients ayant commandé une fois.
Quelle est donc la méthode la plus optimisée ?
- SELECT count(*)
- SELECT TOP 1 *
- SELECT NULL FROM
- IF EXISTS(SELECT MACHIN) SELECT 1 ELSE SELECT 0
Le problème c'est que, à ma connaissance, dans chacun de ces cas SQL Server
parcourt toute la table... Chose que je ne veux pas qu'il fasse !
Pardonnez ma jeunesse, mais comment lire une table sans la parcourir ?
Si les clients sont stockés dans une table et les commandes dans une autre, il faudra bien à mon sens lire les deux pour répondre à cette question.
Si c'est bien une LISTE qui est désirée, je pense que ceci conviendrait peut être (en admettant qu'il y ait 2 tables).
select codecli, nomcli, ... from T_CLIENTS where codecli in (select distinct(codecli) from T_COMMANDES)
Si c'est le nombre total qui est voulu, alors select count(distinct codecli) from T_COMMANDES me semble une bonne option.
HTH,
-----Message d'origine----- Je cherche à extraire la liste de mes clients ayant
commandé une fois.
Quelle est donc la méthode la plus optimisée ? - SELECT count(*) - SELECT TOP 1 * - SELECT NULL FROM - IF EXISTS(SELECT MACHIN) SELECT 1 ELSE SELECT 0
Le problème c'est que, à ma connaissance, dans chacun de
ces cas SQL Server
parcourt toute la table... Chose que je ne veux pas
qu'il fasse !
.
PhB
Bonjour
Une solution parmis d'autres :
DECLARE CUR1 CURSOR FOR select .............. FOR READ ONLY . . OPEN CUR1 FETCH CUR1 INTO @var1 if @@FETCH_STATUS = 0 print 'il existe au moins une ligne repondant à ce critère' . . CLOSE CUR1 DEALLOCATE CUR1
-----Message d'origine----- Je cherche à extraire la liste de mes clients ayant
commandé une fois.
Quelle est donc la méthode la plus optimisée ? - SELECT count(*) - SELECT TOP 1 * - SELECT NULL FROM - IF EXISTS(SELECT MACHIN) SELECT 1 ELSE SELECT 0
Le problème c'est que, à ma connaissance, dans chacun de
ces cas SQL Server
parcourt toute la table... Chose que je ne veux pas qu'il
fasse !
.
Bonjour
Une solution parmis d'autres :
DECLARE CUR1 CURSOR
FOR
select ..............
FOR READ ONLY
.
.
OPEN CUR1
FETCH CUR1 INTO @var1
if @@FETCH_STATUS = 0
print 'il existe au moins une ligne repondant à ce critère'
.
.
CLOSE CUR1
DEALLOCATE CUR1
-----Message d'origine-----
Je cherche à extraire la liste de mes clients ayant
commandé une fois.
Quelle est donc la méthode la plus optimisée ?
- SELECT count(*)
- SELECT TOP 1 *
- SELECT NULL FROM
- IF EXISTS(SELECT MACHIN) SELECT 1 ELSE SELECT 0
Le problème c'est que, à ma connaissance, dans chacun de
ces cas SQL Server
parcourt toute la table... Chose que je ne veux pas qu'il
DECLARE CUR1 CURSOR FOR select .............. FOR READ ONLY . . OPEN CUR1 FETCH CUR1 INTO @var1 if @@FETCH_STATUS = 0 print 'il existe au moins une ligne repondant à ce critère' . . CLOSE CUR1 DEALLOCATE CUR1
-----Message d'origine----- Je cherche à extraire la liste de mes clients ayant
commandé une fois.
Quelle est donc la méthode la plus optimisée ? - SELECT count(*) - SELECT TOP 1 * - SELECT NULL FROM - IF EXISTS(SELECT MACHIN) SELECT 1 ELSE SELECT 0
Le problème c'est que, à ma connaissance, dans chacun de
ces cas SQL Server
parcourt toute la table... Chose que je ne veux pas qu'il
fasse !
.
jmn
Pour exploiter une table (ou un ensemble de tables liées) sans les parcourir, il faut créer le ou les index qui vont bien ! Vu la formulation de la question j'imagine qu'il s'agit d'un traitement qui va être reproduit souvent.Il vous faut donc déterminer les bons critères d'indexation en fonction de la structure de votre base de données, puis écrire une requête qui applique prioritairement ses critères sur ces champs indexés. Et dans tous les cas, à moins que vos table contiennent moins de 10 ou 20 champs, n'utilisez pas * : donnez une liste stricte des champs dont vous avez besoin.
Avec cela votre traitement devrait être aussi rapide que possible.
Pour exploiter une table (ou un ensemble de tables liées) sans les
parcourir, il faut créer le ou les index qui vont bien !
Vu la formulation de la question j'imagine qu'il s'agit d'un traitement qui
va être reproduit souvent.Il vous faut donc déterminer les bons critères
d'indexation en fonction de la structure de votre base de données, puis
écrire une requête qui applique prioritairement ses critères sur ces champs
indexés.
Et dans tous les cas, à moins que vos table contiennent moins de 10 ou 20
champs, n'utilisez pas * : donnez une liste stricte des champs dont vous
avez besoin.
Avec cela votre traitement devrait être aussi rapide que possible.
Pour exploiter une table (ou un ensemble de tables liées) sans les parcourir, il faut créer le ou les index qui vont bien ! Vu la formulation de la question j'imagine qu'il s'agit d'un traitement qui va être reproduit souvent.Il vous faut donc déterminer les bons critères d'indexation en fonction de la structure de votre base de données, puis écrire une requête qui applique prioritairement ses critères sur ces champs indexés. Et dans tous les cas, à moins que vos table contiennent moins de 10 ou 20 champs, n'utilisez pas * : donnez une liste stricte des champs dont vous avez besoin.
Avec cela votre traitement devrait être aussi rapide que possible.
Michel Walsh
Salut,
SELECT COUNT(*) FROM NomDeLaTable peut, en théorie, être résolu en ne consultant que "l'entête" de la table, car on demande, en fait, le nombre d'enregistrement dans la table. Cela ne donne pas les clients ayant commandé au moins une fois, par contre. La formulation SQL la plus simple est probablement
SELECT DISTINCT client FROM commandes
Et si la table des commandes est indexée sur le champ client, seul l'index sera parcouru et on ne touchera pas du tout à la table elle-même, car cette requête est entièrement couverte par le(s) index impliqué(s). Cela, si, bien sûr, la table contient un nombre relativement important d'enregistrements. En effet, avec peu d'enregistrements, un parcour de la table sera plus rapide. C'est la beauté de SQL, le code "s'adapte" à la situation, contrairement à un code impératif, où le développeur développe du meilleur de son cru, une fois pour toutes, UN algorithme unique, fixant la procédure une fois pour toute, pour tous les cas.
La requête précédante ne retourne que l'identifiant du client, si on désire les informations accessoires qui lui sont associés, de par la table clients, une jointure fera l'affaire:
SELECT clients.* FROM clients INNER JOIN ( SELECT DISTINCT client FROM commandes ) As z ON clients.client = z.client
Espérant être utile, Vanderghast, Access MVP
"Julien FOULQUIER" wrote in message news:%234CLMxG$
Je cherche à extraire la liste de mes clients ayant commandé une fois. Quelle est donc la méthode la plus optimisée ? - SELECT count(*) - SELECT TOP 1 * - SELECT NULL FROM - IF EXISTS(SELECT MACHIN) SELECT 1 ELSE SELECT 0
Le problème c'est que, à ma connaissance, dans chacun de ces cas SQL
Server
parcourt toute la table... Chose que je ne veux pas qu'il fasse !
Salut,
SELECT COUNT(*) FROM NomDeLaTable peut, en théorie, être résolu
en ne consultant que "l'entête" de la table, car on demande, en fait, le
nombre d'enregistrement dans la table. Cela ne donne pas les clients ayant
commandé au moins une fois, par contre. La formulation SQL la plus simple
est probablement
SELECT DISTINCT client FROM commandes
Et si la table des commandes est indexée sur le champ client, seul l'index
sera parcouru et on ne touchera pas du tout à la table elle-même, car cette
requête est entièrement couverte par le(s) index impliqué(s). Cela, si, bien
sûr, la table contient un nombre relativement important d'enregistrements.
En effet, avec peu d'enregistrements, un parcour de la table sera plus
rapide. C'est la beauté de SQL, le code "s'adapte" à la situation,
contrairement à un code impératif, où le développeur développe du meilleur
de son cru, une fois pour toutes, UN algorithme unique, fixant la procédure
une fois pour toute, pour tous les cas.
La requête précédante ne retourne que l'identifiant du client, si on désire
les informations accessoires qui lui sont associés, de par la table clients,
une jointure fera l'affaire:
SELECT clients.*
FROM clients INNER JOIN
( SELECT DISTINCT client FROM commandes ) As z
ON clients.client = z.client
Espérant être utile,
Vanderghast, Access MVP
"Julien FOULQUIER" <ltopiq@presence-pc.com> wrote in message
news:%234CLMxG$DHA.2184@TK2MSFTNGP12.phx.gbl...
Je cherche à extraire la liste de mes clients ayant commandé une fois.
Quelle est donc la méthode la plus optimisée ?
- SELECT count(*)
- SELECT TOP 1 *
- SELECT NULL FROM
- IF EXISTS(SELECT MACHIN) SELECT 1 ELSE SELECT 0
Le problème c'est que, à ma connaissance, dans chacun de ces cas SQL
Server
parcourt toute la table... Chose que je ne veux pas qu'il fasse !
SELECT COUNT(*) FROM NomDeLaTable peut, en théorie, être résolu en ne consultant que "l'entête" de la table, car on demande, en fait, le nombre d'enregistrement dans la table. Cela ne donne pas les clients ayant commandé au moins une fois, par contre. La formulation SQL la plus simple est probablement
SELECT DISTINCT client FROM commandes
Et si la table des commandes est indexée sur le champ client, seul l'index sera parcouru et on ne touchera pas du tout à la table elle-même, car cette requête est entièrement couverte par le(s) index impliqué(s). Cela, si, bien sûr, la table contient un nombre relativement important d'enregistrements. En effet, avec peu d'enregistrements, un parcour de la table sera plus rapide. C'est la beauté de SQL, le code "s'adapte" à la situation, contrairement à un code impératif, où le développeur développe du meilleur de son cru, une fois pour toutes, UN algorithme unique, fixant la procédure une fois pour toute, pour tous les cas.
La requête précédante ne retourne que l'identifiant du client, si on désire les informations accessoires qui lui sont associés, de par la table clients, une jointure fera l'affaire:
SELECT clients.* FROM clients INNER JOIN ( SELECT DISTINCT client FROM commandes ) As z ON clients.client = z.client
Espérant être utile, Vanderghast, Access MVP
"Julien FOULQUIER" wrote in message news:%234CLMxG$
Je cherche à extraire la liste de mes clients ayant commandé une fois. Quelle est donc la méthode la plus optimisée ? - SELECT count(*) - SELECT TOP 1 * - SELECT NULL FROM - IF EXISTS(SELECT MACHIN) SELECT 1 ELSE SELECT 0
Le problème c'est que, à ma connaissance, dans chacun de ces cas SQL
Server
parcourt toute la table... Chose que je ne veux pas qu'il fasse !
lionelp
Bonjour,
Et select * from table where 1=2 ?
Cordialement, LionelP
"Julien FOULQUIER" wrote in message news:%234CLMxG$
Je cherche à extraire la liste de mes clients ayant commandé une fois. Quelle est donc la méthode la plus optimisée ? - SELECT count(*) - SELECT TOP 1 * - SELECT NULL FROM - IF EXISTS(SELECT MACHIN) SELECT 1 ELSE SELECT 0
Le problème c'est que, à ma connaissance, dans chacun de ces cas SQL
Server
parcourt toute la table... Chose que je ne veux pas qu'il fasse !
Bonjour,
Et select * from table where 1=2 ?
Cordialement,
LionelP
"Julien FOULQUIER" <ltopiq@presence-pc.com> wrote in message
news:%234CLMxG$DHA.2184@TK2MSFTNGP12.phx.gbl...
Je cherche à extraire la liste de mes clients ayant commandé une fois.
Quelle est donc la méthode la plus optimisée ?
- SELECT count(*)
- SELECT TOP 1 *
- SELECT NULL FROM
- IF EXISTS(SELECT MACHIN) SELECT 1 ELSE SELECT 0
Le problème c'est que, à ma connaissance, dans chacun de ces cas SQL
Server
parcourt toute la table... Chose que je ne veux pas qu'il fasse !
"Julien FOULQUIER" wrote in message news:%234CLMxG$
Je cherche à extraire la liste de mes clients ayant commandé une fois. Quelle est donc la méthode la plus optimisée ? - SELECT count(*) - SELECT TOP 1 * - SELECT NULL FROM - IF EXISTS(SELECT MACHIN) SELECT 1 ELSE SELECT 0
Le problème c'est que, à ma connaissance, dans chacun de ces cas SQL
Server
parcourt toute la table... Chose que je ne veux pas qu'il fasse !
lionelp
beau hors sujet ...
"lionelp" wrote in message news:
Bonjour,
Et select * from table where 1=2 ?
Cordialement, LionelP
"Julien FOULQUIER" wrote in message news:%234CLMxG$ > Je cherche à extraire la liste de mes clients ayant commandé une fois. > Quelle est donc la méthode la plus optimisée ? > - SELECT count(*) > - SELECT TOP 1 * > - SELECT NULL FROM > - IF EXISTS(SELECT MACHIN) SELECT 1 ELSE SELECT 0 > > Le problème c'est que, à ma connaissance, dans chacun de ces cas SQL Server > parcourt toute la table... Chose que je ne veux pas qu'il fasse ! > >
beau hors sujet ...
"lionelp" <lionelp@microsoft.re.mo.ve.com> wrote in message
news:uoVbLnFAEHA.1732@TK2MSFTNGP12.phx.gbl...
Bonjour,
Et select * from table where 1=2 ?
Cordialement,
LionelP
"Julien FOULQUIER" <ltopiq@presence-pc.com> wrote in message
news:%234CLMxG$DHA.2184@TK2MSFTNGP12.phx.gbl...
> Je cherche à extraire la liste de mes clients ayant commandé une fois.
> Quelle est donc la méthode la plus optimisée ?
> - SELECT count(*)
> - SELECT TOP 1 *
> - SELECT NULL FROM
> - IF EXISTS(SELECT MACHIN) SELECT 1 ELSE SELECT 0
>
> Le problème c'est que, à ma connaissance, dans chacun de ces cas SQL
Server
> parcourt toute la table... Chose que je ne veux pas qu'il fasse !
>
>
"Julien FOULQUIER" wrote in message news:%234CLMxG$ > Je cherche à extraire la liste de mes clients ayant commandé une fois. > Quelle est donc la méthode la plus optimisée ? > - SELECT count(*) > - SELECT TOP 1 * > - SELECT NULL FROM > - IF EXISTS(SELECT MACHIN) SELECT 1 ELSE SELECT 0 > > Le problème c'est que, à ma connaissance, dans chacun de ces cas SQL Server > parcourt toute la table... Chose que je ne veux pas qu'il fasse ! > >
bruno reiter [MVP]
Le IF EXISTS s'arrêtera à la première occurence trouvée Le select TOP 1 s'arrêtera à la première occurence mais s'il y a tri, il devra lire tout Les autres devront tout parcourir
Ceci dépendant aussi de tes conditions dans le where, du fait que tu doives joindre, des index existants
br
"Julien FOULQUIER" wrote in message news:%234CLMxG$
Je cherche à extraire la liste de mes clients ayant commandé une fois. Quelle est donc la méthode la plus optimisée ? - SELECT count(*) - SELECT TOP 1 * - SELECT NULL FROM - IF EXISTS(SELECT MACHIN) SELECT 1 ELSE SELECT 0
Le problème c'est que, à ma connaissance, dans chacun de ces cas SQL Server parcourt toute la table... Chose que je ne veux pas qu'il fasse !
Le IF EXISTS s'arrêtera à la première occurence trouvée
Le select TOP 1 s'arrêtera à la première occurence mais s'il y a tri, il devra
lire tout
Les autres devront tout parcourir
Ceci dépendant aussi de tes conditions dans le where, du fait que tu doives
joindre, des index existants
br
"Julien FOULQUIER" <ltopiq@presence-pc.com> wrote in message
news:%234CLMxG$DHA.2184@TK2MSFTNGP12.phx.gbl...
Je cherche à extraire la liste de mes clients ayant commandé une fois.
Quelle est donc la méthode la plus optimisée ?
- SELECT count(*)
- SELECT TOP 1 *
- SELECT NULL FROM
- IF EXISTS(SELECT MACHIN) SELECT 1 ELSE SELECT 0
Le problème c'est que, à ma connaissance, dans chacun de ces cas SQL Server
parcourt toute la table... Chose que je ne veux pas qu'il fasse !
Le IF EXISTS s'arrêtera à la première occurence trouvée Le select TOP 1 s'arrêtera à la première occurence mais s'il y a tri, il devra lire tout Les autres devront tout parcourir
Ceci dépendant aussi de tes conditions dans le where, du fait que tu doives joindre, des index existants
br
"Julien FOULQUIER" wrote in message news:%234CLMxG$
Je cherche à extraire la liste de mes clients ayant commandé une fois. Quelle est donc la méthode la plus optimisée ? - SELECT count(*) - SELECT TOP 1 * - SELECT NULL FROM - IF EXISTS(SELECT MACHIN) SELECT 1 ELSE SELECT 0
Le problème c'est que, à ma connaissance, dans chacun de ces cas SQL Server parcourt toute la table... Chose que je ne veux pas qu'il fasse !