sql >> Database >  >> RDS >> Sqlserver

Aantal SQL Server is traag

Zeer dicht bij benadering (waarbij eventuele transacties tijdens de vlucht worden genegeerd) zou zijn:

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);

Dit zal veel, veel sneller terugkeren dan COUNT(*) , en als uw tafel snel genoeg verandert, is het niet echt minder nauwkeurig - als uw tafel is veranderd tussen het moment waarop u uw COUNT begon (en de sloten werden genomen) en toen deze werd geretourneerd (toen de sloten werden vrijgegeven en alle wachtende schrijftransacties mochten nu naar de tafel schrijven), is dat veel waardevoller? Ik denk het niet.

Als je een subset van de tabel hebt die je wilt tellen (zeg, WHERE some_column IS NULL ), kunt u een gefilterde index voor die kolom maken en de waar-clausule op de een of andere manier structureren, afhankelijk van of het de uitzondering of de regel was (maak dus de gefilterde index op de kleinere set). Dus een van deze twee indexen:

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;

Dan zou je de telling op een vergelijkbare manier kunnen krijgen met:

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);

En als je het tegenovergestelde wilt weten, trek je gewoon af van de eerste vraag hierboven.



  1. Oracle Event Count Query

  2. Hoe formatteer ik mijn orakel-query's zodat de kolommen niet overlopen?

  3. Somtotaal van meerdere MySQL-kolommen opgeslagen in een andere kolom?

  4. Welk type JOIN te gebruiken?