For nylig arbejdede jeg på et projekt til forbedring af databaseydelsen. En lagret procedure der forårsagede problemer. I sin kode udfyldte en forespørgsel antallet af rækker og lagrede værdien i en lokal variabel. Denne forespørgsel scannede en stor tabel. På grund af det blev ressourceudnyttelsen markant højere. For at løse problemet fjernede vi den defekte kode og brugte SQL Server-katalogvisningerne til at generere antallet af rækker i tabellen.
Der er forskellige måder at tælle antallet af rækker i en tabel med SQL Server. Denne artikel vil beskrive dem, så du altid kan vælge den rigtige måde at gøre det på.
Vi kan få antallet af rækker i tabellen med en af følgende metoder:
- Brug COUNT()-funktionen.
- Kombinering af SQL Server-katalogvisninger.
- Brug af sp_spaceused gemt procedure.
- Bruger SQL Server Management studio.
Lad os grave dybere.
Få rækketælling ved at bruge COUNT(*) eller Count(1)
Vi kan bruge funktionen COUNT(*) eller COUNT(1) – resultaterne genereret af disse to funktioner er identiske.
For at få rækkeantallet, lad os først køre forespørgslen med COUNT(*). Til demonstrationsformål har jeg sat værdien af STATISTICS IO som ON.
USE wideworldimporters
go
SELECT Count(*)
FROM tblcustomer
go
Output:
IO-statistikker:
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, skal SQL Server udføre 691 logiske læsninger for at tilfredsstille resultatet.
Lad os nu køre forespørgslen ved hjælp af COUNT(1):
USE wideworldimporters
go
SELECT Count(1)
FROM tblcustomer
go
Output:
IO-statistikker:
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.
Igen skal SQL Server udføre 691 logiske læsninger for at tilfredsstille resultatet.
Vi bør nævne, at der er en opfattelse af, at Count (1) er hurtigere end Count (*)-funktionen. Men som du kan se i ovenstående eksempler, er resultatsættene og IO-statistikkerne de samme. Derfor kan du bruge enhver metode til at generere rækkeantallet af tabeller.
Fordele:
Funktionen COUNT udfylder et nøjagtigt antal rækker fra tabellen.
Udemper:
Når du udfører COUNT-funktionen, placerer den en lås på bordet. Andre forespørgsler, der får adgang til tabellen, skal vente, indtil resultatet er genereret. Hvis du arbejder på et travlt system med en tabel med millioner af rækker, må du hellere undgå at køre COUNT-funktionen i arbejdstiden, medmindre du skal udfylde det nøjagtige rækkeantal i tabellen.
Kombinering af SQL Server-katalogvisninger
Vi kan bruge SQL Server-katalogvisninger med følgende dynamiske administrationsvisninger:
- sys.tables – udfylder listen over tabeller.
- sys.indexes – udfylder listen over indekser i tabellen.
- sys.partitions – udfylder rækkerne i hver partition.
Kør følgende script for at få antallet af rækker:
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
Output:
Forespørgslen udfylder tabelnavnet , indeksnavn, og rækker i alt i alle partitioner.
Lad os nu gennemgå IO-statistikken:
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, udfører forespørgslen kun 30 logiske læsninger.
Fordele:
Denne fremgangsmåde er hurtigere end COUNT-funktionen. Den får ikke en lås på brugerbordet, så du kan bruge den i et travlt system.
Udemper:
Metoden udfylder et omtrentligt antal rækker. I Microsoft-dokumentationen af sys.partitions kan du se, at rækkerne kolonne bringer det omtrentlige antal rækker for partitionerne.
Så hvis du leder efter en forespørgsel, der bringer resultatet hurtigere end COUNT-funktionen, kan du bruge denne. Resultatet kan dog være unøjagtigt.
Brug sp_spaceused
sp_spaceused Proceduren sammen med rækkeantallet giver følgende detaljer:
- Navn – tabelnavnet
- Rækker – antallet af rækker i en tabel.
- Reserveret – den samlede reserverede plads til et bord.
- Data – den samlede plads, der bruges af tabellen.
- Index_size – den samlede plads, der bruges af indekset.
- Ubrugt – den samlede reserverede plads til et bord, der ikke bruges.
Syntaksen er:
EXEC Sp_spaceused 'database_name.schema_name.table_name'
Forespørgslen:
EXEC Sp_spaceused 'WideWorldImportors.dbo.tblCustomer'
Output:
Brug SQL Server Management Studio
For at få rækkeantallet i tabellen kan vi bruge SQL Server Management Studio.
Åbn SQL Server Management studio> Opret forbindelse til databaseinstansen> Udvid tabeller> Højreklik på tblCustomer> Egenskaber
I tabellen Egenskaber vindue, skal du klikke på Lagring . Du vil se rækkeantal værdi til højre:
En anden mulighed for at få antallet af rækker i en tabel kommer med SQL Complete SSMS Add-in. Med denne forbedring kan du se det estimerede antal rækker i et tip, når du holder musen over et tabelnavn i Objekt Explorer-vinduet. På denne måde kan du få de nødvendige data i en visuel tilstand uden yderligere indsats.
Konklusion
Denne artikel forklarede forskellige tilgange til beregning af det samlede antal rækker i tabellen, især:
- Brug af COUNT-funktionen.
- Kombinering af forskellige katalogvisninger.
- Brug af sp_spaceused gemt procedure.
- Bruger SQL Server Management studio.
Der er ingen grund til kun at holde sig til én metode. Hver variant har sine egenskaber, og du kan anvende den, der er bedst egnet i din situation.