Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Le nombre de serveurs SQL est lent

Une approximation très proche (en ignorant les transactions en cours) serait :

SELECT SUM(p.rows) FROM sys.partitions AS p
  INNER JOIN sys.tables AS t
  ON p.[object_id] = t.[object_id]
  INNER JOIN sys.schemas AS s
  ON s.[schema_id] = t.[schema_id]
  WHERE t.name = N'myTable'
  AND s.name = N'dbo'
  AND p.index_id IN (0,1);

Cela retournera beaucoup, beaucoup plus rapidement que COUNT(*) , et si votre table change assez rapidement, ce n'est pas vraiment moins précis - si votre table a changé entre le moment où vous avez démarré votre COUNT (et les verrous ont été pris) et le moment où elle a été renvoyée (lorsque les verrous ont été libérés et toutes les transactions d'écriture en attente étaient maintenant autorisés à écrire sur la table), est-ce que cela a beaucoup plus de valeur ? Je ne pense pas.

Si vous avez un sous-ensemble de la table que vous voulez compter (par exemple, WHERE some_column IS NULL ), vous pouvez créer un index filtré sur cette colonne et structurer la clause where d'une manière ou d'une autre, selon qu'il s'agit de l'exception ou de la règle (créez donc l'index filtré sur le plus petit ensemble). Donc l'un de ces deux index :

CREATE INDEX IAmTheException ON dbo.table(some_column)
  WHERE some_column IS NULL;

CREATE INDEX IAmTheRule ON dbo.table(some_column)
  WHERE some_column IS NOT NULL;

Ensuite, vous pouvez obtenir le décompte de la même manière en utilisant :

SELECT SUM(p.rows) FROM sys.partitions AS p
  INNER JOIN sys.tables AS t
  ON p.[object_id] = t.[object_id]
  INNER JOIN sys.schemas AS s
  ON s.[schema_id] = t.[schema_id]
  INNER JOIN sys.indexes AS i
  ON p.index_id = i.index_id
  WHERE t.name = N'myTable'
  AND s.name = N'dbo'
  AND i.name = N'IAmTheException' -- or N'IAmTheRule'
  AND p.index_id IN (0,1);

Et si vous voulez savoir le contraire, il vous suffit de soustraire de la première requête ci-dessus.