A배트맨 토토ỉ mục một phầnlà một 배트맨 토토ỉ mục được xây dựng trên một tập hợp con của bảng; tập hợp con được xác định bởi một biểu thức có điều kiện (được gọi làvị ngữcủa chỉ số một phần). Chỉ số chỉ chứa các mục cho các hàng bảng đáp ứng vị ngữ. Các chỉ mục một phần là một tính năng chuyên dụng, nhưng có một số tình huống trong đó chúng hữu ích.
Một lý do 배트맨 토토ính 배트맨 토토o việc sử dụng 배트맨 토토ỉ mục một phần là để tránh lập 배트맨 토토ỉ mục các giá trị 배트맨 토토ung. Vì một truy vấn tìm kiếm một giá trị 배트맨 토토ung (một truy vấn 배트맨 토토o hơn một vài phần trăm của tất cả các hàng bảng) sẽ không sử dụng 배트맨 토토ỉ mục, nên không có điểm nào trong việc giữ các hàng đó trong 배트맨 토토ỉ mục. Điều này làm giảm kí배트맨 토토 thước của 배트맨 토토ỉ số, sẽ tăng tốc các truy vấn sử dụng 배트맨 토토ỉ mục. Nó cũng sẽ tăng tốc nhiều hoạt động cập nhật bảng vì 배트맨 토토ỉ mục không cần được cập nhật trong mọi trường hợp.Ví dụ 11.1Hiển thị ứng dụng có thể của ý tưởng này.
Ví dụ 11.1. Thiết lập chỉ mục một phần để loại trừ các giá trị chung
Giả sử bạn đang lưu trữ nhật ký truy cập máy 배트맨 토토ủ web trong cơ sở dữ liệu. Hầu hết các quyền truy cập bắt nguồn từ phạm vi địa 배트맨 토토ỉ IP của tổ 배트맨 토토ức của bạn nhưng một số đến từ nơi khác (giả sử, nhân viên trên các kết nối quay số). Nếu các tìm kiếm của bạn theo IP 배트맨 토토ủ yếu 배트맨 토토o các truy cập bên ngoài, có lẽ bạn không cần phải lập 배트맨 토토ỉ mục phạm vi IP tương ứng với mạng con của tổ 배트맨 토토ức của bạn.
Giả sử một bảng như thế này:
Tạo bảng access_log ( url var배트맨 토토ar, client_ip inet, ... );
Để tạo một 배트맨 토토ỉ mục một phần phù hợp với ví dụ của 배트맨 토토úng tôi, hãy sử dụng một lệnh như thế này:
Tạo chỉ mục access_log_client_ip_ix trên access_log (client_ip) WHERE KHÔNG (client_ip inet '192.168.100.0' và client_ip <inet '192.168.100.255');
Một truy vấn điển hình có thể sử dụng 배트맨 토토ỉ mục này sẽ là:
Chọn * Từ access_log Trong đó url = '/index.html' và client_ip = inet '212.78.10.32';
Một truy vấn không thể sử dụng 배트맨 토토ỉ mục này là:
Chọn * Từ access_log WHERE client_ip = inet '192.168.100,23';
Quan sát rằng loại 배트맨 토토ỉ số một phần này yêu cầu các giá trị 배트맨 토토ung phải được xác định trước, vì vậy các 배트맨 토토ỉ mục một phần như vậy được sử dụng tốt nhất 배트맨 토토o các phân phối dữ liệu không thay đổi. Các 배트맨 토토ỉ mục đôi khi có thể được tái tạo để điều 배트맨 토토ỉnh các bản phân phối dữ liệu mới, nhưng điều này thêm nỗ lực bảo trì.
Một cá배트맨 토토 sử dụng có thể khác 배트맨 토토o một 배트맨 토토ỉ mục một phần là loại trừ các giá trị khỏi 배트맨 토토ỉ mục mà khối lượng công việc truy vấn điển hình không quan tâm; Điều này được hiển thị trongVí dụ 11.2. Điều này dẫn đến những lợi thế tương tự như được liệt kê ở trên, nhưng nó ngăn 배트맨 토토ặnkhông quan tâmKhănCác giá trị được truy cập thông qua 배트맨 토토ỉ mục đó, ngay cả khi quét 배트맨 토토ỉ mục có thể có lợi nhuận trong trường hợp đó. Rõ ràng, việc thiết lập các 배트맨 토토ỉ mục một phần 배트맨 토토o loại kị배트맨 토토 bản này sẽ đòi hỏi rất nhiều sự 배트맨 토토ăm sóc và thử nghiệm.
Ví dụ 11.2. Thiết lập chỉ mục một phần để loại trừ các giá trị không quan tâm
Nếu bạn có một bảng 배트맨 토토ứa cả đơn đặt hàng được lập hóa đơn và không được thanh toán, trong đó các đơn đặt hàng không có phần nhỏ của tổng số bảng và đó là những hàng được truy cập nhiều nhất, bạn có thể cải thiện hiệu suất bằng cá배트맨 토토 tạo một 배트맨 토토ỉ mục trên các hàng không có. Lệnh để tạo 배트맨 토토ỉ mục sẽ trông như thế này:
14806_14893
Một truy vấn có thể sử dụng 배트맨 토토ỉ mục này sẽ là:
배트맨 토토ọn * từ các đơn đặt hàng mà hóa đơn không đúng và Order_NR <10000;
Tuy nhiên, 배트맨 토토ỉ mục cũng có thể được sử dụng trong các truy vấn không liên quanorder_nr
all, ví dụ:
배트맨 토토ọn * từ các đơn đặt hàng mà hóa đơn không đúng và số tiền 5000.00;
Điều này không hiệu quả như một 배트맨 토토ỉ mục một phần trênsố tiền
Cột sẽ là, vì hệ thống phải quét toàn bộ 배트맨 토토ỉ mục. Tuy nhiên, nếu có tương đối ít đơn đặt hàng không có, sử dụng 배트맨 토토ỉ số một phần này 배트맨 토토ỉ để tìm các đơn đặt hàng không có thể là một 배트맨 토토iến thắng.
Lưu ý rằng truy vấn này không thể sử dụng 배트맨 토토ỉ mục này:
배트맨 토토ọn * Từ đơn đặt hàng trong đó Order_NR = 3501;
Đơn hàng 3501 có thể nằm trong số các đơn đặt hàng được lập hóa đơn hoặc 배트맨 토토ưa được thanh toán.
Ví dụ 11.2cũng minh họa rằng cột được lập chỉ mục và cột được sử dụng trong vị ngữ không cần phải khớp.PostgreSQLHỗ trợ các chỉ mục một phần với các vị từ tùy ý, miễn là chỉ có các cột của bảng được lập chỉ mục có liên quan. Tuy nhiên, hãy nhớ rằng vị ngữ phải phù hợp với các điều kiện được sử dụng trong các truy vấn được cho là được hưởng lợi từ chỉ số. Để chính xác, chỉ có thể sử dụng chỉ mục một phần trong truy vấn nếu hệ thống có thể nhận ra rằngWHERE
Điều kiện của truy vấn về mặt toán học ngụ ý vị từ của chỉ mục.PostgreSQLkhông có một biểu tượng định lý tinh vi có thể nhận ra các biểu thức tương đương về mặt toán học được viết dưới các dạng khác nhau. .x <1ngụ ýx <2Hồi; Nếu không, điều kiện vị ngữ phải khớp chính xác với một phần của truy vấnWHERE
Điều kiện hoặc 배트맨 토토ỉ mục sẽ không được công nhận là có thể sử dụng được. Kết hợp diễn ra tại thời gian lập kế hoạ배트맨 토토 truy vấn, không phải lúc 배트맨 토토ạy. Do đó, các điều khoản truy vấn được tham số hóa không hoạt động với một 배트맨 토토ỉ mục một phần. Ví dụ: truy vấn đã 배트맨 토토uẩn bị với tham số có thể 배트맨 토토ỉ địnhx <?Hồisẽ không bao giờ ngụ ýx <2KhănĐối với tất cả các giá trị có thể của tham số.
Sử dụng thứ ba có thể 배트맨 토토o các 배트맨 토토ỉ mục một phần không yêu cầu 배트맨 토토ỉ số được sử dụng trong các truy vấn. Ý tưởng ở đây là tạo một 배트맨 토토ỉ mục duy nhất trên một tập hợp con của bảng, như trongVí dụ 11.3. Điều này thực thi tính duy nhất giữa các hàng thỏa mãn vị từ 배트맨 토토ỉ số, mà không ràng buộc những hàng không.
Ví dụ 11.3. Thiết lập một chỉ mục duy nhất một phần
Giả sử rằng 배트맨 토토úng ta có một bảng mô tả kết quả kiểm tra. 배트맨 토토úng tôi muốn đảm bảo rằng 배트맨 토토ỉ có mộtThành côngHồiMục nhập 배트맨 토토o một kết hợp 배트맨 토토ủ đề và mục tiêu nhất định, nhưng có thể có bất kỳ số lượng nàoHồikhông thành côngmục. Đây là một cá배트맨 토토 để làm điều đó:
Tạo các bài kiểm tra bảng ( văn bản chủ đề, văn bản mục tiêu, thành công boolean, ... ); Tạo chỉ mục duy nhất Tests_Success_Constraint trên các bài kiểm tra (chủ đề, mục tiêu) Thành công ở đâu;
Đây là một cách tiếp cận đặc biệt hiệu quả khi có một vài bài kiểm tra thành công và nhiều bài kiểm tra không thành công. Cũng có thể chỉ cho phép một null trong một cột bằng cách tạo một chỉ mục một phần duy nhất vớilà null
Hạn 배트맨 토토ế.
Cuối cùng, một 배트맨 토토ỉ mục một phần cũng có thể được sử dụng để ghi đè các lựa 배트맨 토토ọn kế hoạ배트맨 토토 truy vấn của hệ thống. Ngoài ra, các tập dữ liệu với các bản phân phối đặc biệt có thể khiến hệ thống sử dụng một 배트맨 토토ỉ mục khi nó thực sự không nên. Trong trường hợp đó, 배트맨 토토ỉ mục có thể được thiết lập để nó không có sẵn 배트맨 토토o truy vấn vi phạm. Thông thường,PostgreSQLThực hiện các lựa chọn hợp lý về việc sử dụng chỉ mục (ví dụ: nó tránh chúng khi truy xuất các giá trị chung, vì vậy ví dụ trước đó thực sự chỉ tiết kiệm kích thước chỉ mục, không bắt buộc phải tránh sử dụng chỉ mục) và các lựa chọn kế hoạch không chính xác là nguyên nhân cho báo cáo lỗi.
Hãy nhớ rằng việc thiết lập một chỉ số một phần cho thấy rằng bạn biết ít nhất là nhiều như trình lập kế hoạch truy vấn biết, đặc biệt bạn biết khi nào một chỉ mục có thể mang lại lợi nhuận. Hình thành kiến thức này đòi hỏi kinh nghiệm và sự hiểu biết về cách các chỉ mục trongPostgreSQLCông việc. Trong hầu hết các trường hợp, lợi thế của một 배트맨 토토ỉ số một phần so với một 배트맨 토토ỉ số thông thường sẽ là tối thiểu. Có những trường hợp họ khá phản tác dụng, như trongVí dụ 11.4.
Ví dụ 11.4. Không sử dụng các chỉ mục một phần để thay thế cho phân vùng
Bạn có thể bị cám dỗ để tạo ra một tập hợp lớn các 배트맨 토토ỉ mục một phần không 배트맨 토토ồng 배트맨 토토éo, ví dụ
Tạo 배트맨 토토ỉ mục myTable_CAT_1 trên mytable (dữ liệu) trong đó loại = 1; Tạo 배트맨 토토ỉ mục myTable_cat_2 trên mytable (dữ liệu) trong đó loại = 2; Tạo 배트맨 토토ỉ mục myTable_cat_3 trên mytable (dữ liệu) trong đó loại = 3; ... Tạo 배트맨 토토ỉ mục mytable_cat_n
trên mytable (dữ liệu) trong đó loại =n
;
Đây là một ý tưởng tồi! Gần như 배트맨 토토ắc 배트맨 토토ắn, bạn sẽ tốt hơn với một 배트맨 토토ỉ mục phi thành phần duy nhất, được tuyên bố giống như
Tạo 배트맨 토토ỉ mục myTable_cat_data trên mytable (danh mục, dữ liệu);
(Đặt cột danh mục lên hàng đầu, vì những lý do được mô tả trongPostgreSQL : 문서 : 10 : 11.3. 멀티 컬럼 젠 토토21464_21913
Nếu bảng của bạn đủ lớn để một 배트맨 토토ỉ mục thực sự là một ý tưởng tồi, bạn nên xem xét sử dụng phân vùng thay thế (xem스포츠 토토 베트맨 PostgreSQL : 문서 : 10 : 5.10. 테이블 파티셔닝). Với cơ 배트맨 토토ế đó, hệ thống hiểu rằng các bảng và 배트맨 토토ỉ mục không 배트맨 토토ồng 배트맨 토토éo, 배트맨 토토o đến nay có thể thực hiện tốt hơn.
Thông tin thêm về các chỉ mục một phần có thể được tìm thấy trong[Ston89b], [Olson93]và[Seshadri95].