ploubat
Messages postés2Date d'inscriptionlundi 27 janvier 2003StatutMembreDernière intervention15 octobre 2004
-
15 oct. 2004 à 10:52
nivsql
Messages postés159Date d'inscriptionlundi 22 juin 2009StatutMembreDernière intervention14 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.
nivsql
Messages postés159Date d'inscriptionlundi 22 juin 2009StatutMembreDernière intervention14 décembre 20101 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és7Date d'inscriptionjeudi 24 mars 2005StatutMembreDernière intervention29 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és215Date d'inscriptionjeudi 24 octobre 2002StatutMembreDerniè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és7Date d'inscriptionjeudi 24 mars 2005StatutMembreDernière intervention29 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és404Date d'inscriptionmardi 18 décembre 2001StatutMembreDernière intervention15 juillet 201422 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és2Date d'inscriptionlundi 27 janvier 2003StatutMembreDernière intervention15 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
22 juin 2009 à 19:23
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')
31 mars 2005 à 08:39
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.
30 mars 2005 à 14:29
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.
24 mars 2005 à 22:02
Un NOLOCK lors du SELECT serait un plus.
Et un @@FETCH_STATUS <> -1 serait finalement parfait
24 nov. 2004 à 20:02
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
15 oct. 2004 à 10:52
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