NB LIGNES PAR TABLE

ploubat Messages postés 2 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 15 octobre 2004 - 15 oct. 2004 à 10:52
nivsql Messages postés 159 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 14 décembre 2010 - 22 juin 2009 à 19:23
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/26824-nb-lignes-par-table

nivsql Messages postés 159 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 14 décembre 2010 1
22 juin 2009 à 19:23
Je vous propose cette methode plus "simple" pour SQL Server 2005 qui utilise une vue de gestion dynamique. Elle a l'avantage de donner pour chaque table le nom de l'index cluster ou s'il n'y en a pas l'information "HEAP".

select s.name,
o.name,
coalesce(i.name, 'HEAP'), -- Les tables HEAP n'ont pas d'index Cluster
p.row_count
FROM sys.dm_db_partition_stats as p
INNER JOIN sys.objects as o
on o.object_id = p.object_id
INNER JOIN sys.schemas as s
on s.schema_id = o.schema_id
LEFT OUTER JOIN sys.indexes as i
on i.object_id p.object_id and i.index_id p.index_id
WHERE o.type_desc = 'USER_TABLE'
AND o.is_ms_shipped = 0 AND i.index_id in (0,1)
ORDER BY s.name, o.name, coalesce(i.name, 'HEAP')
cs_rastapaye Messages postés 7 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 29 juillet 2005
31 mars 2005 à 08:39
Un curseur INSENSITIVE crée une copie des données dans TempPB et permet de ne pas locker la table.

Dans notre cas c'est une table systeme donc très peu de risque de la locker, mais c'est une bonne habitude à prendre.

Le NOLOCK se place après le nom d'une table. Il permet de lire les données d'une table même si quelqu'un est en train de les modifier. Par example, un traitement batch fait une épuration de la table des commandes, il y a donc une transaction en cours. Si une personne fait un SELECT sans NOLOCK sur la table, il se retrouve en attante de la fin de la transaction...

Dans notre cas c'est encore une table systeme donc très peu de risque de la locker, mais c'est une bonne habitude à prendre également.

Enfin le FETCH_STATUS <> -1 permet de boucler tant qu'il n'y a plus d'élément dans le CURSEUR. Par contre il faut tester le FETCH_STATUS <> -2 car dans ce cas il y a eu une erreur de lecture.
cs_Benouille Messages postés 215 Date d'inscription jeudi 24 octobre 2002 Statut Membre Dernière intervention 7 septembre 2007
30 mars 2005 à 14:29
> Un curseur INSENSITIVE serait encore mieux.
ah bon? c'est quoi ça?

> Un NOLOCK lors du SELECT serait un plus.
ah bon? c'est quoi ça?

> Et un @@FETCH_STATUS <> -1 serait finalement parfait
ah bon? c'est quoi ça? ... euh je veux dire ah bon? pourquoi ça?

:)

vb nouille, mais aussi SQL NOUILLE!

VBNouille.
cs_rastapaye Messages postés 7 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 29 juillet 2005
24 mars 2005 à 22:02
Un curseur INSENSITIVE serait encore mieux.
Un NOLOCK lors du SELECT serait un plus.
Et un @@FETCH_STATUS <> -1 serait finalement parfait
shaiulud Messages postés 404 Date d'inscription mardi 18 décembre 2001 Statut Membre Dernière intervention 15 juillet 2014 22
24 nov. 2004 à 20:02
juste un commentaire sur le count(*) et l'optimisation

il est à éviter car le moteur sql ramène les lignes avant de les compter.
il est plus judicieux d'utiliser Count (0) As NbLignes
ploubat Messages postés 2 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 15 octobre 2004
15 oct. 2004 à 10:52
Un truc sympa c'est la proc sp_msforeachtable pas toujours documentée par MS mais on trouve tout sur le net (Il y a aussi sp_msforeachdb)

Sinon, pour optimiser à la place du count(*) tu peux mettre un count sur le nom d'une colonne ou mieux si tu disposes de PK ou UK utiliser la colonne rows de la table sysindexes

Pascal
Rejoignez-nous