OVH Cloud OVH Cloud

Tester l'existence d'une occurence le plus rapidement possible

7 réponses
Avatar
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 !

7 réponses

Avatar
OokieDookie
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 !


.



Avatar
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 !


.



Avatar
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.
Avatar
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 !




Avatar
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 !




Avatar
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 !
>
>




Avatar
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 !