Theo tài liệu NUM_ROWS là "Số hàng trong bảng" , vì vậy tôi có thể thấy điều này có thể gây nhầm lẫn như thế nào. Tuy nhiên, ở đó có sự khác biệt lớn giữa hai phương pháp này.
Truy vấn này chọn số hàng trong MY_TABLE từ chế độ xem hệ thống. Đây là dữ liệu mà Oracle đã thu thập và lưu trữ trước đó.
select num_rows from all_tables where table_name = 'MY_TABLE'
Truy vấn này đếm số hàng hiện tại trong MY_TABLE
select count(*) from my_table
Theo định nghĩa, chúng là những phần dữ liệu khác biệt. Có hai thông tin bổ sung bạn cần về NUM_ROWS.
-
Trong tài liệu có một dấu hoa thị theo tên cột, dẫn đến lưu ý này:
Các cột được đánh dấu bằng dấu hoa thị (*) chỉ được điền khi bạn thu thập số liệu thống kê trên bảng với câu lệnh ANALYZE hoặc DBMS_STATSpackage.
Điều này có nghĩa là trừ khi bạn đã thu thập số liệu thống kê trên bảng thì cột này sẽ không có bất kỳ dữ liệu nào.
-
Thống kê được thu thập trong 11g + với
estimate_percent
mặc định hoặc với ước tính 100%, sẽ trả về một con số chính xác cho thời điểm đó. Nhưng số liệu thống kê được thu thập trước 11g hoặc vớiestimate_percent
tùy chỉnh dưới 100%, sử dụng lấy mẫu động và có thể không chính xác. Nếu bạn tập hợp 99,999%, một hàng có thể bị bỏ sót, điều này có nghĩa là câu trả lời bạn nhận được là không chính xác.
Nếu bảng của bạn không bao giờ đã cập nhật thì chắc chắn có thể sử dụng ALL_TABLES.NUM_ROWS để tìm ra số hàng trong bảng. Tuy nhiên và nó là một điều lớn, tuy nhiên, nếu bất kỳ quá trình nào chèn hoặc xóa các hàng khỏi bảng của bạn, thì tốt nhất nó sẽ là một con số gần đúng tốt và tùy thuộc vào việc cơ sở dữ liệu của bạn tự động thu thập thống kê có thể sai khủng khiếp.
Nói chung, luôn luôn tốt hơn nếu thực sự đếm số hàng trong bảng hơn là dựa vào các bảng hệ thống.