sql >> Databáze >  >> RDS >> Sqlserver

4 způsoby, jak počítat řádky v tabulce SQL Server s klady a zápory

Nedávno jsem pracoval na projektu zlepšení výkonu databáze. Jedna uložená procedura tam způsobovala problémy. Dotaz ve svém kódu vyplnil Počet řádků a uložil hodnotu do lokální proměnné. Ten dotaz skenoval velkou tabulku. Díky tomu se využití zdrojů výrazně zvýšilo. Abychom problém vyřešili, odstranili jsme chybný kód a ke generování počtu řádků tabulky jsme použili zobrazení katalogu SQL Server.

Existují různé způsoby, jak spočítat počet řádků v tabulce serveru SQL Server. Tento článek je popíše, abyste si vždy vybrali správný způsob, jak to udělat.

Počet řádků tabulky můžeme získat některou z následujících metod:

  1. Použijte funkci COUNT().
  2. Kombinace zobrazení katalogu SQL Server.
  3. Pomocí sp_spaceused uložená procedura.
  4. Použití SQL Server Management Studio.

Pojďme se ponořit hlouběji.

Získejte počet řádků pomocí COUNT(*) nebo Count(1)

Můžeme použít funkci COUNT(*) nebo COUNT(1) – výsledky generované těmito dvěma funkcemi jsou identické.

Chcete-li získat počet řádků, spusťte nejprve dotaz pomocí COUNT(*). Pro demonstrační účely jsem nastavil hodnotu STATISTICS IO jako ON.

USE wideworldimporters 
go 

SELECT Count(*) 
FROM   tblcustomer 
go  

Výstup:

Statistika objednávky:

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.

Jak můžete vidět, SQL Server musí provést 691 logických čtení, aby výsledek uspokojil.

Nyní spusťte dotaz pomocí COUNT(1):

USE wideworldimporters 
go 

SELECT Count(1) 
FROM   tblcustomer 
go  

Výstup:

Statistika IO:

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.

SQL Server musí znovu provést 691 logických čtení, aby výsledek uspokojil.

Měli bychom zmínit, že existuje názor, že funkce Count (1) je rychlejší než funkce Count (*). Jak však můžete vidět na výše uvedených příkladech, sady výsledků a statistiky IO jsou stejné. Ke generování počtu řádků tabulek tedy můžete použít jakoukoli metodu.

Výhody:

Funkce COUNT vyplní přesný počet řádků z tabulky.

Nevýhody:

Když spustíte funkci COUNT, umístí na stůl zámek. Ostatní dotazy přistupující k tabulce musí počkat, až se vygeneruje výsledek. Pokud pracujete na vytíženém systému s tabulkou s miliony řádků, raději se vyhněte spouštění funkce COUNT během pracovní doby, pokud nemusíte vyplnit přesný počet řádků tabulky.

Kombinace zobrazení katalogu SQL Server

Můžeme použít zobrazení katalogu SQL Server s následujícími dynamickými zobrazeními správy:

  1. sys.tables – vyplní seznam tabulek.
  2. sys.indexes – vyplní seznam indexů tabulky.
  3. sys.partitions – vyplní řádky každého oddílu.

Chcete-li získat počet řádků, spusťte následující 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 

Výstup:

Dotaz vyplní název tabulky , název indexu, a celkový počet řádků ve všech oddílech.

Nyní se podívejme na statistiku IO:

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.

Jak vidíte, dotaz provede pouze 30 logických čtení.

Výhody:

Tento přístup je rychlejší než funkce COUNT. Nezískává zámek na uživatelské tabulce, takže jej můžete použít v zaneprázdněném systému.

Nevýhody:

Metoda naplní přibližný Počet řádků. V dokumentaci sys.partitions společnosti Microsoft můžete vidět, že řádky sloupec uvádí přibližný počet řádků pro oddíly.

Pokud tedy hledáte dotaz, který přináší výsledek rychleji než funkce COUNT, můžete použít tento. Výsledek však může být nepřesný.

Použijte sp_spaceused

sp_spaceused procedura spolu s počtem řádků poskytuje následující podrobnosti:

  1. Jméno – Název tabulky
  2. Řádky – Počet řádků v tabulce.
  3. Rezervováno – celkový rezervovaný prostor pro stůl.
  4. Data – celkový prostor využitý tabulkou.
  5. Velikost_indexu – celkový prostor využitý indexem.
  6. Nepoužité – celkový rezervovaný prostor pro stůl, který není využit.

Syntaxe je:

EXEC Sp_spaceused 'database_name.schema_name.table_name' 

Dotaz:

EXEC Sp_spaceused 'WideWorldImportors.dbo.tblCustomer' 

Výstup:

Použijte SQL Server Management Studio

K získání počtu řádků v tabulce můžeme použít SQL Server management studio.

Otevřete SQL Server Management studio> Připojte se k instanci databáze> rozbalte tabulky> klikněte pravým tlačítkem na tblCustomer> Vlastnosti

V tabulce Vlastnosti klikněte na Úložiště . Zobrazí se Počet řádků hodnota vpravo:

Další možností, jak získat počet řádků v tabulce, je doplněk SQL Complete SSMS Add-in. Díky tomuto vylepšení uvidíte odhadovaný počet řádků v nápovědě, když najedete myší na název tabulky v okně Průzkumník objektů. Tímto způsobem můžete získat potřebná data ve vizuálním režimu bez dalšího úsilí.

Závěr

Tento článek vysvětlil různé přístupy k výpočtu celkového počtu řádků tabulky, zejména:

  1. Použití funkce COUNT.
  2. Kombinace různých zobrazení katalogu.
  3. Pomocí sp_spaceused uložená procedura.
  4. Použití SQL Server Management Studio.

Není třeba se držet pouze jedné metody. Každá varianta má svá specifika a vy můžete použít tu, která je pro vaši situaci nejvhodnější.


  1. Auto Increment Column – Sekvence jako výchozí hodnota v Oracle

  2. Proč se při dotazu na propojený server na data jiná než xml zobrazí chyba, že typ dat XML není podporován v distribuovaných dotazech?

  3. Příkazy IF-THEN-ELSE v postgresql

  4. Oracle 10g - optimalizujte WHERE IS NOT NULL