Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

4 cách đếm hàng trong bảng SQL Server với ưu và nhược điểm

Gần đây, tôi đang làm việc trên một dự án cải thiện hiệu suất cơ sở dữ liệu. Một quy trình được lưu trữ ở đó đã gây ra sự cố. Trong mã của nó, một truy vấn đã điền Tổng số hàng và lưu trữ giá trị trong một biến cục bộ. Truy vấn đó đang quét một bảng lớn. Do đó, việc sử dụng tài nguyên trở nên cao hơn đáng kể. Để khắc phục sự cố, chúng tôi đã xóa mã bị lỗi và sử dụng chế độ xem danh mục SQL Server để tạo Tổng số hàng của bảng.

Có nhiều cách khác nhau để đếm số hàng trong bảng của SQL Server. Bài viết này sẽ mô tả chúng để bạn luôn chọn đúng cách để thực hiện.

Chúng ta có thể lấy Số lượng hàng của bảng bằng bất kỳ phương pháp nào sau đây:

  1. Sử dụng hàm COUNT ().
  2. Kết hợp các chế độ xem danh mục SQL Server.
  3. Sử dụng sp_spaceused thủ tục được lưu trữ.
  4. Sử dụng SQL Server Management studio.

Hãy để chúng tôi tìm hiểu sâu hơn.

Nhận số lượng hàng bằng cách sử dụng COUNT (*) hoặc Count (1)

Chúng ta có thể sử dụng hàm COUNT (*) hoặc COUNT (1) - kết quả do hai hàm này tạo ra là giống hệt nhau.

Để tính số hàng, trước tiên chúng ta hãy chạy truy vấn bằng cách sử dụng COUNT (*). Với mục đích trình diễn, tôi đã đặt giá trị của STATISTICS IO là ON.

USE wideworldimporters 
go 

SELECT Count(*) 
FROM   tblcustomer 
go  

Đầu ra:

Thống kê IO:

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.

Như bạn có thể thấy, SQL Server phải thực hiện 691 lần đọc logic để đáp ứng kết quả.

Bây giờ, chúng ta hãy chạy truy vấn bằng cách sử dụng COUNT (1):

USE wideworldimporters 
go 

SELECT Count(1) 
FROM   tblcustomer 
go  

Đầu ra:

Thống kê 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.

Một lần nữa, SQL Server phải thực hiện 691 lần đọc logic để đáp ứng kết quả.

Chúng ta nên đề cập rằng có ý kiến ​​cho rằng hàm Count (1) nhanh hơn hàm Count (*). Tuy nhiên, như bạn có thể thấy trong các ví dụ trên, tập kết quả và thống kê IO giống nhau. Do đó, bạn có thể sử dụng bất kỳ phương pháp nào để tạo số lượng hàng của bảng.

Ưu điểm:

Hàm COUNT điền một số hàng chính xác từ bảng.

Nhược điểm:

Khi bạn thực thi hàm COUNT, hàm này sẽ đặt một ổ khóa trên bảng. Các truy vấn khác truy cập bảng phải đợi cho đến khi kết quả được tạo. Nếu bạn đang làm việc trên một hệ thống bận rộn với một bảng có hàng triệu hàng, tốt hơn bạn nên tránh chạy hàm COUNT trong giờ làm việc, trừ khi bạn phải điền số hàng chính xác của bảng.

Kết hợp các chế độ xem danh mục SQL Server

Chúng ta có thể sử dụng dạng xem danh mục SQL Server với dạng xem quản lý động sau:

  1. sys.tables - điền danh sách các bảng.
  2. sys.indexes - điền danh sách các chỉ mục của bảng.
  3. sys.partitions - điền các hàng của mỗi phân vùng.

Để tính số hàng, hãy chạy tập lệnh sau:

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 

Đầu ra:

Truy vấn điền tên bảng , tên chỉ mục, tổng số hàng trong tất cả các phân vùng.

Bây giờ, chúng ta hãy xem lại Thống kê 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.

Như bạn có thể thấy, truy vấn chỉ thực hiện 30 lần đọc logic.

Ưu điểm:

Cách tiếp cận này nhanh hơn so với hàm COUNT. Nó không có khóa trên bảng người dùng, vì vậy bạn có thể sử dụng nó trong một hệ thống bận.

Nhược điểm:

Phương pháp này điền một Số lượng hàng gần đúng. Trong tài liệu của Microsoft về sys.partitions, bạn có thể thấy rằng hàng cột mang lại số hàng gần đúng cho các phân vùng.

Do đó, nếu bạn đang tìm kiếm một truy vấn mang lại kết quả nhanh hơn hàm COUNT, bạn có thể sử dụng truy vấn này. Tuy nhiên, kết quả có thể không chính xác.

Sử dụng sp_spaceused

sp_spaceused thủ tục cùng với số lượng hàng cung cấp các chi tiết sau:

  1. Tên - Tên bảng
  2. Hàng - Số hàng trong bảng.
  3. Được bảo lưu - tổng không gian dành riêng cho một bảng.
  4. Dữ liệu - tổng không gian được sử dụng bởi bảng.
  5. Index_size - tổng không gian được sử dụng bởi chỉ mục.
  6. Không được sử dụng - tổng không gian dành riêng cho một bảng không được sử dụng.

Cú pháp là:

EXEC Sp_spaceused 'database_name.schema_name.table_name' 

Truy vấn:

EXEC Sp_spaceused 'WideWorldImportors.dbo.tblCustomer' 

Đầu ra:

Sử dụng SQL Server Management Studio

Để có được số hàng của bảng, chúng ta có thể sử dụng SQL Server management studio.

Mở SQL Server Management studio> Kết nối với phiên bản cơ sở dữ liệu> Mở rộng bảng> Nhấp chuột phải vào tblCustomer> Thuộc tính

Trong Bảng Thuộc tính , nhấp vào Bộ nhớ . Bạn sẽ thấy Số lượng hàng giá trị ở bên phải:

Một tùy chọn khác để lấy số hàng trong bảng đi kèm với Phần bổ trợ SQL Complete SSMS. Với tính năng nâng cao này, bạn có thể thấy số hàng ước tính trong một gợi ý khi di chuột qua tên bảng trong cửa sổ Object Explorer. Bằng cách này, bạn có thể nhận được dữ liệu cần thiết ở chế độ trực quan mà không cần thêm bất kỳ nỗ lực nào.

Kết luận

Bài viết này giải thích các cách tiếp cận khác nhau để tính tổng số hàng của bảng, cụ thể là:

  1. Sử dụng hàm COUNT.
  2. Kết hợp các chế độ xem danh mục khác nhau.
  3. Sử dụng sp_spaceused thủ tục được lưu trữ.
  4. Sử dụng SQL Server Management studio.

Không cần thiết phải bám vào một phương pháp duy nhất. Mỗi biến thể có các đặc điểm cụ thể và bạn có thể áp dụng một biến thể phù hợp nhất trong tình huống của mình.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. tham gia chéo sql - có ai tìm thấy công dụng gì cho nó?

  2. Tạo mã sql theo lập trình

  3. Tập lệnh được cải tiến trả về tất cả các thuộc tính từ SERVERPROPERTY () trong SQL Server

  4. Làm cách nào để mở rộng các giá trị được phân tách bằng dấu phẩy thành các hàng riêng biệt bằng SQL Server 2005?

  5. Cách thực hiện THAM GIA MẶT BẰNG TRÁI trong SQL Server