Tôi có một bảng với 250K hàng trong cơ sở dữ liệu thử nghiệm của mình. (Có vài trăm triệu sản xuất, chúng ta có thể quan sát cùng một vấn đề ở đó.) Bảng có mã định danh chuỗi nvarchar2 (50), không phải là null, với chỉ số duy nhất trên đó (không phải là PK).
Các mã định danh được tạo thành từ một phần đầu tiên có 8 giá trị khác nhau trong cơ sở dữ liệu thử nghiệm của tôi (và khoảng một nghìn trong sản xuất), sau đó là dấu @ và cuối cùng là một số, dài từ 1 đến 6 chữ số. Ví dụ: có thể có 50 nghìn hàng bắt đầu bằng 'ABCD_BGX1741F_2006_13_20110808.xml @' và theo sau là 50 nghìn số khác nhau.
Khi tôi truy vấn một hàng duy nhất dựa trên mã định danh của nó, số lượng thẻ được ước tính là 1, chi phí rất thấp, nó hoạt động tốt. Khi tôi truy vấn nhiều hơn một hàng với một số định danh trong biểu thức IN hoặc biểu thức OR, các ước tính cho chỉ mục là hoàn toàn sai, do đó quét toàn bộ bảng được sử dụng. Nếu tôi buộc chỉ mục bằng một gợi ý, thì nó rất nhanh, quá trình quét toàn bộ bảng thực sự được thực hiện theo thứ tự độ lớn chậm hơn (và chậm hơn rất nhiều trong sản xuất). Vì vậy, nó là một vấn đề tối ưu hóa.
Để thử nghiệm, tôi đã nhân đôi bảng (trong cùng một lược đồ + không gian bảng) với cùng một DDL và chính xác cùng một nội dung. Tôi đã tạo lại chỉ mục duy nhất trên bảng đầu tiên để đo lường tốt và tạo ra chỉ mục chính xác tương tự trên bảng nhân bản. Tôi đã làm một DBMS_STATS.GATHER_SCHEMA_STATS('schemaname',estimate_percent=>100,cascade=>true);
. Bạn thậm chí có thể thấy rằng các tên chỉ mục là liên tiếp. Vì vậy, bây giờ sự khác biệt duy nhất giữa hai bảng là bảng đầu tiên được tải theo thứ tự ngẫu nhiên trong một khoảng thời gian dài, với các khối nằm rải rác trên đĩa (trong một không gian bảng cùng với một số bảng lớn khác), bảng thứ hai được tải dưới dạng một nhóm CHỌN-CHỌN. Ngoài ra, tôi không thể tưởng tượng bất kỳ sự khác biệt. (Bảng gốc đã bị thu hẹp kể từ lần xóa lớn cuối cùng và sau đó không có một lần xóa nào.)
Dưới đây là các kế hoạch truy vấn cho người bệnh và bảng nhân bản (Các chuỗi dưới bàn chải màu đen giống nhau trên tất cả các hình ảnh, và cũng dưới bàn chải màu xám.):
(Trong ví dụ này, có 1867 hàng bắt đầu bằng mã định danh được quét màu đen. Truy vấn 2 hàng tạo ra số lượng thẻ là 1867 * 2, truy vấn 3 hàng tạo ra số lượng thẻ là 1867 * 3, v.v. là một sự trùng hợp ngẫu nhiên, Oracle dường như không quan tâm đến sự kết thúc của các định danh.)
Điều gì có thể gây ra hành vi này? Rõ ràng nó sẽ khá tốn kém để tạo lại bảng trong sản xuất.
USER_TABLES: http://i.stack.imgur.com/nDWze.jpg USER_INDEXES: http://i.stack.imgur.com/DG9um.jpg Tôi chỉ thay đổi tên lược đồ và tên vùng bảng. Bạn có thể thấy rằng tên bảng và chỉ mục giống như trên ảnh chụp màn hình kế hoạch truy vấn.