Làm thế nào chính xác là cột sys.partition.rows?


13

Chế độ xem hệ thống sys.partitionscó một cột "hàng" là tổng số hàng trong một phân vùng đã cho. Đối với một bảng không được phân vùng (hoặc chỉ có một phân vùng tùy thuộc vào cách bạn nhìn vào nó), cột này đưa ra số lượng hàng trong bảng.

Tôi tò mò về độ chính xác của cột này và liệu tôi có thể sử dụng nó thay vì a SELECT COUNT(1) FROM TableName. Tôi đã thực hiện một số thử nghiệm trong đó tạo bảng và thêm vài nghìn hàng, xóa vài trăm, thêm vài nghìn, v.v. và số lượng luôn bị chết. Tuy nhiên tôi có một bảng với khoảng 700 triệu hàng và một số chỉ mục. Hàng trong sys.partitionschỉ mục được nhóm lại một lần nữa bị chết, tuy nhiên các chỉ mục khác hiển thị một số biến thể nhỏ (+ -20k).

Có ai biết hàng này được tính như thế nào và liệu nó có chính xác như nó xuất hiện không?


4
Tôi đã sử dụng truy vấn dựa trên cột hàng từ lâu. Không quan sát thấy nó đã hết hạn
billinkc

Câu trả lời:


13

Sách trực tuyến nói rằng trường hàng "cho biết số lượng hàng gần đúng trong phân vùng này." Do đó, tôi hy vọng nó sẽ được đóng, nhưng không chính xác 100%, 100% thời gian.

Michael Zilberstein báo cáo một ví dụ về sys.partitionsviệc cực kỳ không chính xác trong Vì muốn có một cái đinh . Không nói đó là một sự xuất hiện phổ biến, nhưng nó có thể.

sys.dm_db_index_physical_statschứa một record_counttrường có vẻ chính xác hơn, mặc dù lưu ý rằng việc chạy DMV có thể dẫn đến sự cố chặn REDO nếu bạn chạy nó trên một cá thể lưu trữ Bản sao phụ luôn có thể đọc được.

Giải thích cho record_counttrường hiển thị thông tin sau:

Tổng số hồ sơ.

Đối với một chỉ mục, tổng số bản ghi áp dụng cho cấp độ hiện tại của cây b trong đơn vị phân bổ IN_law_DATA.

Đối với một đống, tổng số bản ghi trong đơn vị phân bổ IN_law_DATA.

Đối với một heap, số lượng bản ghi được trả về từ hàm này có thể không khớp với số lượng hàng được trả về bằng cách chạy CHỌN COUNT (*) so với heap. Điều này là do một hàng có thể chứa nhiều bản ghi. Ví dụ, trong một số tình huống cập nhật, một hàng heap duy nhất có thể có bản ghi chuyển tiếp và bản ghi được chuyển tiếp là kết quả của hoạt động cập nhật. Ngoài ra, hầu hết các hàng LOB lớn được chia thành nhiều bản ghi trong bộ lưu trữ LOB_DATA. Đối với các đơn vị phân bổ LOB_DATA hoặc ROW_OVERFLOW_DATA, tổng số bản ghi trong đơn vị phân bổ hoàn chỉnh.

Xem thêm câu trả lời của Martin Smith cho một câu hỏi tương tự trên Stack Overflow.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.