Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

4 sposoby liczenia wierszy w tabeli SQL Server z zaletami i wadami

Ostatnio pracowałem nad projektem poprawy wydajności bazy danych. Jedna procedura składowana powodowała problemy. W swoim kodzie zapytanie wypełniło liczbę wierszy i zapisało wartość w zmiennej lokalnej. To zapytanie skanowało dużą tabelę. Dzięki temu wykorzystanie zasobów znacznie wzrosło. Aby rozwiązać ten problem, usunęliśmy wadliwy kod i użyliśmy widoków katalogu SQL Server do wygenerowania liczby wierszy tabeli.

Istnieją różne sposoby liczenia wierszy w tabeli SQL Server. W tym artykule opiszemy je, abyś zawsze wybierał właściwy sposób.

Liczbę wierszy w tabeli możemy uzyskać dowolną z następujących metod:

  1. Użyj funkcji COUNT().
  2. Łączenie widoków katalogu SQL Server.
  3. Korzystanie z sp_spaceused procedura składowana.
  4. Korzystanie ze studia zarządzania serwerem SQL.

Kopnijmy głębiej.

Pobierz liczbę wierszy za pomocą COUNT(*) lub Count(1)

Możemy użyć funkcji ILE.LICZB(*) lub ILE.LICZB(1) – wyniki generowane przez te dwie funkcje są identyczne.

Aby uzyskać liczbę wierszy, najpierw uruchommy zapytanie za pomocą COUNT(*). W celach demonstracyjnych ustawiłem wartość STATISTICS IO na ON.

USE wideworldimporters 
go 

SELECT Count(*) 
FROM   tblcustomer 
go  

Wyjście:

Statystyki zamówień publicznych:

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 widać, serwer SQL musi wykonać 691 odczytów logicznych, aby zadowolić wynik.

Teraz uruchommy zapytanie, używając COUNT(1):

USE wideworldimporters 
go 

SELECT Count(1) 
FROM   tblcustomer 
go  

Wyjście:

Statystyki zamówienia reklamowego:

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.

Ponownie, SQL Server musi wykonać 691 odczytów logicznych, aby zadowolić wynik.

Powinniśmy wspomnieć, że istnieje opinia, że ​​funkcja Count (1) jest szybsza niż funkcja Count (*). Jednak, jak widać na powyższych przykładach, zestawy wyników i statystyki IO są takie same. Dlatego możesz użyć dowolnej metody, aby wygenerować liczbę wierszy tabel.

Zalety:

Funkcja ILE.LICZB wypełnia dokładną liczbę wierszy z tabeli.

Wady:

Gdy wykonujesz funkcję ILE.LICZB, nakłada ona blokadę na tabelę. Inne zapytania uzyskujące dostęp do tabeli muszą czekać na wygenerowanie wyniku. Jeśli pracujesz w zajętym systemie, w którym tabela ma miliony wierszy, lepiej unikaj uruchamiania funkcji ILE.LICZB w godzinach pracy, chyba że musisz podać dokładną liczbę wierszy w tabeli.

Łączenie widoków katalogu SQL Server

Możemy używać widoków katalogu SQL Server z następującymi widokami dynamicznego zarządzania:

  1. sys.tables – wypełnia listę tabel.
  2. sys.indeksy – wypełnia listę indeksów tabeli.
  3. sys.partycje – wypełnia wiersze każdej partycji.

Aby uzyskać liczbę wierszy, uruchom następujący skrypt:

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 

Wyjście:

Zapytanie wypełnia nazwę tabeli , nazwa indeksu, i łączna liczba wierszy we wszystkich partycjach.

Przyjrzyjmy się teraz statystykom 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 widać, zapytanie wykonuje tylko 30 logicznych odczytów.

Zalety:

To podejście jest szybsze niż funkcja ILE.LICZB. Nie blokuje tabeli użytkowników, więc można go używać w zajętym systemie.

Wady:

Metoda wypełnia przybliżoną liczbę wierszy. W dokumentacji firmy Microsoft dotyczącej sys.partitions widać, że wiersze kolumna podaje przybliżoną liczbę wierszy dla partycji.

Tak więc, jeśli szukasz zapytania, które przyniesie wynik szybciej niż funkcja ILE.LICZB, możesz użyć tego. Jednak wynik może być niedokładny.

Użyj sp_spaceused

sp_spaceused procedura wraz z liczbą wierszy zawiera następujące szczegóły:

  1. Nazwa – nazwa stołu
  2. Wiersze – liczba wierszy w tabeli.
  3. Zarezerwowane – całkowita zarezerwowana przestrzeń na stół.
  4. Dane – całkowita przestrzeń zajmowana przez stół.
  5. Rozmiar_indeksu – całkowita przestrzeń wykorzystywana przez indeks.
  6. Nieużywane – całkowita zarezerwowana przestrzeń na stół, który nie jest używany.

Składnia to:

EXEC Sp_spaceused 'database_name.schema_name.table_name' 

Zapytanie:

EXEC Sp_spaceused 'WideWorldImportors.dbo.tblCustomer' 

Wyjście:

Użyj SQL Server Management Studio

Aby uzyskać liczbę wierszy w tabeli, możemy użyć studia zarządzania SQL Server.

Otwórz SQL Server Management studio> Połącz z instancją bazy danych> rozwiń Tabele> kliknij prawym przyciskiem myszy tblCustomer> Właściwości

W Tabeli Właściwości kliknij Pamięć . Zobaczysz Liczbę wierszy wartość po prawej:

Inną opcją uzyskania liczby wierszy w tabeli jest dodatek SQL Complete SSMS. Dzięki temu ulepszeniu możesz zobaczyć szacowaną liczbę wierszy we wskazówce po najechaniu kursorem myszy na nazwę tabeli w oknie Eksploratora obiektów. W ten sposób możesz uzyskać niezbędne dane w trybie wizualnym bez żadnych dodatkowych wysiłków.

Wniosek

W tym artykule wyjaśniono różne podejścia do obliczania całkowitej liczby wierszy tabeli, w szczególności:

  1. Korzystanie z funkcji ILE.LICZB.
  2. Łączenie różnych widoków katalogu.
  3. Korzystanie z sp_spaceused procedura składowana.
  4. Korzystanie ze studia zarządzania serwerem SQL.

Nie ma potrzeby trzymać się tylko jednej metody. Każdy wariant ma swoją specyfikę i możesz zastosować ten, który najlepiej pasuje do Twojej sytuacji.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wywołanie procedury składowanej ze zwracaną wartością

  2. Nie można połączyć się z serwerem SQL za pomocą PHP

  3. Czym NIE jest operator logiczny w SQL Server — samouczek SQL Server / TSQL — część 121

  4. Utwórz wieloetapowe zadanie agenta SQL Server (T-SQL)

  5. Błąd serwera SQL 110:W instrukcji INSERT jest mniej kolumn niż wartości określone w klauzuli VALUES.