Nb lignes par table

Soyez le premier à donner votre avis sur cette source.

Snippet vu 10 332 fois - Téléchargée 31 fois

Contenu du snippet

Ce code m'avait servi il y a un an pour "mesurer" une base de données en renvoyant pour chaque table le nombre de lignes. Cela permet de parler volumétrie avec des néophytes. En fait ce code génère un script qu'il faut éxécuter.

Je le mets pour l'utilisation du curseur notemment.

Source / Exemple :


-- Curseur pour le nom des tables
Declare	@sNomTable	nVarChar (150)
--Declare	@iNbLignes 	Int
Declare	curNomTable 	Cursor For
	Select	sysobjects.name
	From 	dbo.sysobjects sysobjects
	Where 	xtype = 'U'

-- Ouverture du curseur sur la première table.
Open	curNomTable
Fetch 	Next From curNomTable
Into	@sNomTable

-- Boucle sur les tables
While	@@FETCH_STATUS = 0
Begin
	-- on affiche un Select pour chaque base, il faudra ensuite éxécuter le résultat.
	Print 	('
		Select	''' + @sNomTable + ''' As NomTable, Count (*) As NbLignes
		From	[' + LTrim (RTrim (@sNomTable)) +']
		')

	-- table suivante
	Fetch Next From curNomTable
	Into	@sNomTable

	-- union ou order by selon que c'est la derniere ligne ou non.
	If	@@FETCH_STATUS <> 0
		Print ('		Order By NbLignes Desc')
	Else	Print ('		Union')
	Print ('')
End

	
-- Fermeture du curseur
Close 	curNomTable
Deallocate curNomTable

Conclusion :


ATTENTION: CE CODE GENERE UN SCRIPT QU'IL FAUT EXECUTER!

copiez le code dans un " analiseur de requetes", éxécutez le (F5), récupérez le résultat en le copiant dans une nouvelle fenêtre et éxécutez.

A voir également

Ajouter un commentaire

Commentaires

Messages postés
159
Date d'inscription
lundi 22 juin 2009
Statut
Membre
Dernière intervention
14 décembre 2010
1
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')
Messages postés
7
Date d'inscription
jeudi 24 mars 2005
Statut
Membre
Dernière intervention
29 juillet 2005

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.
Messages postés
215
Date d'inscription
jeudi 24 octobre 2002
Statut
Membre
Dernière intervention
7 septembre 2007
1
> 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.
Messages postés
7
Date d'inscription
jeudi 24 mars 2005
Statut
Membre
Dernière intervention
29 juillet 2005

Un curseur INSENSITIVE serait encore mieux.
Un NOLOCK lors du SELECT serait un plus.
Et un @@FETCH_STATUS <> -1 serait finalement parfait
Messages postés
404
Date d'inscription
mardi 18 décembre 2001
Statut
Membre
Dernière intervention
15 juillet 2014
19
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
Afficher les 6 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.