sql >> Databasteknik >  >> RDS >> Sqlserver

4 sätt att räkna rader i SQL Server-tabell med för- och nackdelar

Nyligen arbetade jag med ett projekt för förbättring av databasprestanda. En lagrad procedur där orsakade problem. I sin kod fyllde en fråga i antalet rader och lagrade värdet i en lokal variabel. Den frågan skannade en stor tabell. På grund av det blev resursutnyttjandet betydligt högre. För att åtgärda problemet tog vi bort den felaktiga koden och använde SQL Server-katalogvyerna för att generera antalet rader i tabellen.

Det finns olika sätt att räkna antalet rader i en SQL Server-tabell. Den här artikeln kommer att beskriva dem så att du alltid kan välja rätt sätt att göra det på.

Vi kan få antalet rader i tabellen med någon av följande metoder:

  1. Använd COUNT()-funktionen.
  2. Kombinera SQL Server-katalogvyer.
  3. Använder sp_spaceused lagrad procedur.
  4. Använder SQL Server Management studio.

Låt oss gräva djupare.

Få radräkning med COUNT(*) eller Count(1)

Vi kan använda funktionen COUNT(*) eller COUNT(1) – resultaten som genereras av dessa två funktioner är identiska.

För att få radantalet, låt oss först köra frågan med COUNT(*). I demonstrationssyfte har jag satt värdet på STATISTICS IO som PÅ.

USE wideworldimporters 
go 

SELECT Count(*) 
FROM   tblcustomer 
go  

Utdata:

IO-statistik:

Table 'tblCustomer'. Scan count 1, logical reads 691, physical reads 315, page server reads 0, read-ahead reads 276, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.

Som du kan se måste SQL Server utföra 691 logiska läsningar för att tillfredsställa resultatet.

Låt oss nu köra frågan med COUNT(1):

USE wideworldimporters 
go 

SELECT Count(1) 
FROM   tblcustomer 
go  

Utdata:

IO-statistik:

Table 'tblCustomer'. Scan count 1, logical reads 691, physical reads 687, page server reads 0, read-ahead reads 687, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.

Återigen måste SQL Server utföra 691 logiska läsningar för att tillfredsställa resultatet.

Vi bör nämna att det finns en åsikt att Count (1) är snabbare än Count (*)-funktionen. Men som du kan se i exemplen ovan är resultatuppsättningarna och IO-statistiken desamma. Därför kan du använda vilken metod som helst för att generera radantalet för tabeller.

Proffs:

Funktionen COUNT fyller i ett korrekt antal rader från tabellen.

Nackdelar:

När du kör COUNT-funktionen sätter den ett lås på bordet. Andra frågor som kommer åt tabellen måste vänta tills resultatet genereras. Om du arbetar på ett upptaget system med en tabell med miljontals rader, bör du undvika att köra COUNT-funktionen under kontorstid, såvida du inte måste fylla i det exakta radantalet i tabellen.

Kombinera SQL Server-katalogvyer

Vi kan använda SQL Server-katalogvyer med följande dynamiska hanteringsvyer:

  1. sys.tables – fyller i listan med tabeller.
  2. sys.indexes – fyller i listan med index i tabellen.
  3. sys.partitions – fyller i raderna för varje partition.

För att få antalet rader, kör följande skript:

SELECT a.NAME, 
       c.NAME, 
       Sum(b.rows) 
FROM   sys.tables a 
       INNER JOIN sys.partitions b 
               ON a.object_id = b.object_id 
       INNER JOIN sys.indexes c 
               ON b.index_id = c.index_id 
                  AND b.object_id = c.object_id 
WHERE  a.object_id = Object_id('tblCustomer') 
       AND c.index_id < 2 

Utdata:

Frågan fyller i tabellnamnet , indexnamn, och totalt antal rader i alla partitioner.

Låt oss nu granska IO-statistiken:

Table 'syssingleobjrefs'. Scan count 3, logical reads 6, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Table 'sysidxstats'. Scan count 1, logical reads 6, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Table 'sysschobjs'. Scan count 0, logical reads 4, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Table 'sysrowsets'. Scan count 2, logical reads 14, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.

Som du kan se utför frågan endast 30 logiska läsningar.

Proffs:

Detta tillvägagångssätt är snabbare än COUNT-funktionen. Den får inget lås på användarbordet, så du kan använda den i ett upptaget system.

Nackdelar:

Metoden fyller i ett ungefärligt antal rader. I Microsofts dokumentation av sys.partitions kan du se att raderna kolumnen visar det ungefärliga antalet rader för partitionerna.

Således, om du letar efter en fråga som ger resultatet snabbare än COUNT-funktionen, kan du använda den här. Resultatet kan dock bli felaktigt.

Använd sp_spaceused

sp_spaceused proceduren tillsammans med radantalet ger följande detaljer:

  1. Namn – Tabellnamnet
  2. Rader – Antalet rader i en tabell.
  3. Reserverad – det totala reserverade utrymmet för ett bord.
  4. Data – det totala utrymmet som används av tabellen.
  5. Index_storlek – det totala utrymmet som används av indexet.
  6. Oanvänd – det totala reserverade utrymmet för ett bord som inte används.

Syntaxen är:

EXEC Sp_spaceused 'database_name.schema_name.table_name' 

Frågan:

EXEC Sp_spaceused 'WideWorldImportors.dbo.tblCustomer' 

Utdata:

Använd SQL Server Management Studio

För att få fram antalet rader i tabellen kan vi använda SQL Server Management Studio.

Öppna SQL Server Management studio> Anslut till databasinstansen> Expandera tabeller> Högerklicka på tblCustomer> Egenskaper

I tabellen Egenskaper klickar du på Lagring . Du kommer att se Radantal värde till höger:

Ett annat alternativ för att få antalet rader i en tabell kommer med SQL Complete SSMS-tillägget. Med den här förbättringen kan du se det uppskattade antalet rader i en ledtråd när du för musen över ett tabellnamn i objektutforskarens fönster. På så sätt kan du få nödvändiga data i ett visuellt läge utan ytterligare ansträngningar.

Slutsats

Den här artikeln förklarade olika metoder för att beräkna det totala antalet rader i tabellen, särskilt:

  1. Använder funktionen COUNT.
  2. Kombinera olika katalogvyer.
  3. Använder sp_spaceused lagrad procedur.
  4. Använder SQL Server Management studio.

Det finns ingen anledning att bara hålla sig till en metod. Varje variant har sina särdrag och du kan använda den som är bäst lämpad i din situation.


  1. Skillnaden mellan sys.objects, sys.system_objects och sys.all_objects i SQL Server

  2. Finns det en Max-funktion i SQL Server som tar två värden som Math.Max ​​i .NET?

  3. Hur hämtar jag alla rader i min DB?

  4. Får du veckonummer av ett datum i MS SQL Server 2005?