Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Select count(*) from [TABLE]

6 réponses
Avatar
Twister
Bonjour,

J'ai entendu parlé qu'il existai une procedure stokée system pour renvoyer
le nombre d'enregistrements d'une table tres rapidement. Laquelle es ce ?

Car j'ai une table avec plusieur milions d'enregistrements et quand je fais :
select count(*) from maTable with(nolock) desfois c'est tres tres long ...

Merci beaucoup à celui qui connai cette proc stok.
Michael.

6 réponses

Avatar
Patrice
"Des fois" ? N'y aurait il pas autre chose de consommateur en cours à ce
moment ?

De mémoire l'info est disponible dans la table système des index (et
également je crois dans les stats mais pas forcément à jour).

J'aurais tendance à être circonspect avant de remplacer le COUNT(*) (qui a
ma connaissance ne lit pas toutes les lignes pour récupérer l'info, je me
demande d'ailleurs si l'info n'est pas déjà récupérée indirectement,
peut-être en regardant les index).

Patrice

--

"Twister" a écrit dans le message de
news:
Bonjour,

J'ai entendu parlé qu'il existai une procedure stokée system pour renvoyer
le nombre d'enregistrements d'une table tres rapidement. Laquelle es ce ?

Car j'ai une table avec plusieur milions d'enregistrements et quand je


fais :
select count(*) from maTable with(nolock) desfois c'est tres tres long ...

Merci beaucoup à celui qui connai cette proc stok.
Michael.


Avatar
Patrice
C'est sp_spaceused qui retourne également cette info.

J'ai fait un essai vite fait mais dans une appli mais je n'ai que 800 000
lignes. Pas de différence particulière (le SELECT est plus lent mais me
donne 223 ms, le sp_spaceused va par contre lui dans la table sysindexes).
Donc au pire je gagne 1/4 s environ...

Qu'est ce que cela donne de ton côté ?

Patrice

--

"Patrice" a écrit dans le message de
news:
"Des fois" ? N'y aurait il pas autre chose de consommateur en cours à ce
moment ?

De mémoire l'info est disponible dans la table système des index (et
également je crois dans les stats mais pas forcément à jour).

J'aurais tendance à être circonspect avant de remplacer le COUNT(*) (qui a
ma connaissance ne lit pas toutes les lignes pour récupérer l'info, je me
demande d'ailleurs si l'info n'est pas déjà récupérée indirectement,
peut-être en regardant les index).

Patrice

--

"Twister" a écrit dans le message de
news:
> Bonjour,
>
> J'ai entendu parlé qu'il existai une procedure stokée system pour


renvoyer
> le nombre d'enregistrements d'une table tres rapidement. Laquelle es ce


?
>
> Car j'ai une table avec plusieur milions d'enregistrements et quand je
fais :
> select count(*) from maTable with(nolock) desfois c'est tres tres long


...
>
> Merci beaucoup à celui qui connai cette proc stok.
> Michael.




Avatar
Twister
Merci beaucoup Patrice pour ton aide.
sp_spaceused fonctionne tres tres bien ;o).

En faite mon select count(*) était long lorsque sql server était inactif
depuis un certain temps. Mais la ca marche nikel.

Encore merci pour l'info ;o)

"Patrice" wrote:

C'est sp_spaceused qui retourne également cette info.

J'ai fait un essai vite fait mais dans une appli mais je n'ai que 800 000
lignes. Pas de différence particulière (le SELECT est plus lent mais me
donne 223 ms, le sp_spaceused va par contre lui dans la table sysindexes).
Donc au pire je gagne 1/4 s environ...

Qu'est ce que cela donne de ton côté ?

Patrice

--

"Patrice" a écrit dans le message de
news:
> "Des fois" ? N'y aurait il pas autre chose de consommateur en cours à ce
> moment ?
>
> De mémoire l'info est disponible dans la table système des index (et
> également je crois dans les stats mais pas forcément à jour).
>
> J'aurais tendance à être circonspect avant de remplacer le COUNT(*) (qui a
> ma connaissance ne lit pas toutes les lignes pour récupérer l'info, je me
> demande d'ailleurs si l'info n'est pas déjà récupérée indirectement,
> peut-être en regardant les index).
>
> Patrice
>
> --
>
> "Twister" a écrit dans le message de
> news:
> > Bonjour,
> >
> > J'ai entendu parlé qu'il existai une procedure stokée system pour
renvoyer
> > le nombre d'enregistrements d'une table tres rapidement. Laquelle es ce
?
> >
> > Car j'ai une table avec plusieur milions d'enregistrements et quand je
> fais :
> > select count(*) from maTable with(nolock) desfois c'est tres tres long
....
> >
> > Merci beaucoup à celui qui connai cette proc stok.
> > Michael.
>
>





Avatar
Patrice
Donc tu me confirmes que ton SELECT * FROM MaTable est beaucoup long que le
sp_spaceused ? Tu peux nous donner un ordre de grandeur par curiosité...

Patrice

--

"Twister" a écrit dans le message de
news:
Merci beaucoup Patrice pour ton aide.
sp_spaceused fonctionne tres tres bien ;o).

En faite mon select count(*) était long lorsque sql server était inactif
depuis un certain temps. Mais la ca marche nikel.

Encore merci pour l'info ;o)

"Patrice" wrote:

> C'est sp_spaceused qui retourne également cette info.
>
> J'ai fait un essai vite fait mais dans une appli mais je n'ai que 800


000
> lignes. Pas de différence particulière (le SELECT est plus lent mais me
> donne 223 ms, le sp_spaceused va par contre lui dans la table


sysindexes).
> Donc au pire je gagne 1/4 s environ...
>
> Qu'est ce que cela donne de ton côté ?
>
> Patrice
>
> --
>
> "Patrice" a écrit dans le message de
> news:
> > "Des fois" ? N'y aurait il pas autre chose de consommateur en cours à


ce
> > moment ?
> >
> > De mémoire l'info est disponible dans la table système des index (et
> > également je crois dans les stats mais pas forcément à jour).
> >
> > J'aurais tendance à être circonspect avant de remplacer le COUNT(*)


(qui a
> > ma connaissance ne lit pas toutes les lignes pour récupérer l'info, je


me
> > demande d'ailleurs si l'info n'est pas déjà récupérée indirectement,
> > peut-être en regardant les index).
> >
> > Patrice
> >
> > --
> >
> > "Twister" a écrit dans le message


de
> > news:
> > > Bonjour,
> > >
> > > J'ai entendu parlé qu'il existai une procedure stokée system pour
> renvoyer
> > > le nombre d'enregistrements d'une table tres rapidement. Laquelle es


ce
> ?
> > >
> > > Car j'ai une table avec plusieur milions d'enregistrements et quand


je
> > fais :
> > > select count(*) from maTable with(nolock) desfois c'est tres tres


long
> ....
> > >
> > > Merci beaucoup à celui qui connai cette proc stok.
> > > Michael.
> >
> >
>
>
>


Avatar
Nicolas CUVILLIER
Bonjour

l'information retournee par sp_spaceused n'est pas garantie etre exacte.
C'est un
chiffre que sqlserver essaye de garder a jour, et qui est remis a jour par
les check
sur la base. Si tu desires un nombre approximatif c'est parfait, et c'est le
plus
rapide.

Quand tu fais un select count(*), sqlserver ne lit pas les donnees, mais
choisit
un index non cluster, et compte le nombre de clefs dans l'index. Le nombre
d'i/o est
donc sensiblement egal au nombre de page de ton index, si rien n'est dans le
cache.
Je n'ai pas une grosse base chargee, mais pour 50000 lignes, sur un portable
(disque
non rapide), cache vide, le select count(*) est immediat.

Il me semble que tu ne dois pas avoir d'index non cluster sur ta table, et
que sqlserver
est oblige de lire toutes les donnees.

/*** Plus d'infos + technique ***/
Si tu veux estimer les i/o et donc le temps necesaire a ton select count(*),
tu peux
proceder comme suit :

Retrouve les infos concernant les index pour ta table :

select indid, name, rowcnt, dpages from sysindexes where id in
(select id from sysobjects where name = 'nom_table')

indid indique le type d'information :
0 = nombre de pages pour stocker les donnes d'une table sans index cluster
1 = nombre de pages pour un index cluster (index et data)
1 = nombre de pages pour un index non cluster (pages d'index seulement)



Si sqlserver ne prenait pas le bon index, tu peux faire un select
count(columns) form table,
ou columns est une colonne de ton index, des fois cela peut aider, mais il
faudrait voir
ta table, et tes index pour comprendre ce qui se passe.
Bonne chance
Nicolas
Avatar
Twister
Merci beaucoup pour votre aide ;o)

Bilan :
le sp_spaceused est de loin le plus rapide et quelquesoit la charge de mon
serveur la réponse est instantanée.
Mais effectivement le résultat est une valeur approchée..
(moins 55 enregistrements pour 4 milions d'enregistrements) ca reste tres
correct pour ce dont j'ai besoin.

Lorsque mon serveur est en pleine charge le select count(*) peut monter
jusqu'a plusieur secondes de recherche... lorsqe je précise une colone select
count(cle_primaire) c'est un peu plus rapide...mais plusieur secondes quand
meme.. Mais apres la premiere execution les trois méthodes sont quasi
semblables...

Merci ...