Tất cả các chỉ kèo bóng đá hom nay trongPostgreSQLlàphụChỉ kèo bóng đá hom nay, có nghĩa là mỗi chỉ kèo bóng đá hom nay được lưu trữ riêng biệt với khu vực dữ liệu chính của bảng (được gọi là bảngHeapinPostgreSQLThuật ngữ). Điều này có nghĩa là trong quá trình quét chỉ kèo bóng đá hom nay thông thường, mỗi lần truy xuất hàng yêu cầu tìm nạp dữ liệu từ cả chỉ kèo bóng đá hom nay và đống. Hơn nữa, trong khi các kèo bóng đá hom nay nhập chỉ kèo bóng đá hom nay phù hợp với một chỉ kèo bóng đá hom nay có thể chỉ kèo bóng đá hom nayWHERE
Điều kiện thường được kết hợp với nhau trong chỉ kèo bóng đá hom nay, các hàng bảng mà họ tham chiếu có thể ở bất cứ đâu trong đống. Do đó, phần truy cập heap của quét chỉ kèo bóng đá hom nay bao gồm rất nhiều truy cập ngẫu nhiên vào đống, có thể chậm, đặc biệt là trên phương tiện xoay truyền thống. (Như được mô tả trongPhần 11.5, quét bitmap cố gắng giảm chi phí này bằng cách thực hiện các truy cập đống theo thứ tự được sắp xếp, nhưng điều đó chỉ đi xa.)
Để giải quyết vấn đề hiệu suất này,PostgreSQLHỗ trợQuét chỉ có chỉ kèo bóng đá hom nay, có thể trả lời các truy vấn từ một chỉ kèo bóng đá hom nay mà không cần bất kỳ truy cập đống nào. Ý tưởng cơ bản là trả về các giá trị trực tiếp ra khỏi mỗi kèo bóng đá hom nay nhập chỉ kèo bóng đá hom nay thay vì tham khảo kèo bóng đá hom nay nhập đống liên kết. Có hai hạn chế cơ bản khi nào phương pháp này có thể được sử dụng:
Loại chỉ kèo bóng đá hom nay phải hỗ trợ quét chỉ chỉ kèo bóng đá hom nay. Các chỉ kèo bóng đá hom nay B-cây luôn luôn làm. Các chỉ kèo bóng đá hom nay của GIST và SP-GIST hỗ trợ quét chỉ chỉ kèo bóng đá hom nay cho một số lớp toán tử nhưng không phải là các lớp khác. Các loại chỉ kèo bóng đá hom nay khác không có hỗ trợ. Yêu cầu cơ bản là chỉ kèo bóng đá hom nay phải lưu trữ vật lý, hoặc nếu không có thể xây dựng lại, giá trị dữ liệu gốc cho mỗi kèo bóng đá hom nay nhập chỉ kèo bóng đá hom nay. Là một ví dụ: các chỉ kèo bóng đá hom nay gin không thể hỗ trợ quét chỉ chỉ kèo bóng đá hom nay vì mỗi kèo bóng đá hom nay nhập chỉ kèo bóng đá hom nay thường chỉ giữ một phần của giá trị dữ liệu gốc.
Truy vấn chỉ phải tham chiếu các cột được lưu trữ trong chỉ kèo bóng đá hom nay. Ví dụ: đã cho một chỉ kèo bóng đá hom nay trên các cộtx
vày
của một bảng cũng có cộtZ
, Các truy vấn này có thể sử dụng quét chỉ chỉ kèo bóng đá hom nay:
Chọn x, y từ tab trong đó x = 'key'; Chọn X từ tab trong đó x = 'phím' và y <42;
Nhưng các truy vấn này không thể:
Chọn x, z từ tab trong đó x = 'phím'; Chọn x từ tab trong đó x = 'phím' và z <42;
(chỉ kèo bóng đá hom nay biểu thức và chỉ kèo bóng đá hom nay một phần làm phức tạp quy tắc này, như được thảo luận dưới đây.)
Nếu hai yêu cầu cơ bản này được đáp ứng, thì tất cả các giá trị dữ liệu theo yêu cầu của truy vấn đều có sẵn từ chỉ kèo bóng đá hom nay, do đó, việc quét chỉ có chỉ kèo bóng đá hom nay là có thể. Nhưng có một yêu cầu bổ sung cho bất kỳ bảng quét nào trongPostgreSQL: Nó phải xác minh rằng mỗi hàng được truy xuất làHồiCó thể nhìn thấyHồiđến ảnh chụp nhanh MVCC của truy vấn, như đã thảo luận trongChương 13. Thông tin khả năng hiển thị không được lưu trữ trong các kèo bóng đá hom nay nhập chỉ kèo bóng đá hom nay, chỉ trong các kèo bóng đá hom nay nhập đống; Vì vậy, thoạt nhìn có vẻ như mọi việc truy xuất hàng sẽ yêu cầu truy cập đống. Và đây thực sự là trường hợp, nếu hàng bảng đã được sửa đổi gần đây. Tuy nhiên, đối với dữ liệu thay đổi hiếm khi, có một cách xung quanh vấn đề này.PostgreSQLTrình theo dõi, cho mỗi trang trong đống của bảng, cho dù tất cả các hàng được lưu trữ trong trang đó có đủ tuổi để hiển thị cho tất cả các giao dịch hiện tại và tương lai. Thông tin này được lưu trữ trong một chút trong bảngBản đồ hiển thị. Quét chỉ có chỉ kèo bóng đá hom nay, sau khi tìm một kèo bóng đá hom nay nhập chỉ kèo bóng đá hom nay ứng cử viên, kiểm tra bit bản đồ hiển thị cho trang heap tương ứng. Nếu nó được đặt, hàng được biết hiển thị và do đó dữ liệu có thể được trả về mà không có công việc nào nữa. Nếu nó không được đặt, kèo bóng đá hom nay nhập đống phải được truy cập để tìm hiểu xem nó có hiển thị hay không, do đó, không có lợi thế hiệu suất nào đạt được trong quá trình quét chỉ kèo bóng đá hom nay tiêu chuẩn. Ngay cả trong trường hợp thành công, phương pháp này giao dịch quyền truy cập bản đồ hiển thị cho truy cập heap; Nhưng vì bản đồ hiển thị nhỏ hơn bốn bậc có độ lớn so với đống mà nó mô tả, nên I/O vật lý ít hơn là cần thiết để truy cập nó. Trong hầu hết các tình huống, bản đồ hiển thị vẫn được lưu trong bộ nhớ mọi lúc.
Tóm lại, trong khi có thể quét chỉ có chỉ số theo yêu cầu cơ bản, thì đó sẽ chỉ là một chiến thắng nếu một phần đáng kể của các trang đống của bảng có các bit bản đồ có khả năng nhìn thấy của chúng. Nhưng các bảng trong đó một phần lớn các hàng không thay đổi là đủ phổ biến để làm cho loại quét này rất hữu ích trong thực tế.
Để sử dụng hiệu quả tính năng quét chỉ có chỉ kèo bóng đá hom nay, bạn có thể chọn tạo mộtChỉ số bao gồm, là một chỉ kèo bóng đá hom nay được thiết kế đặc biệt để bao gồm các cột cần thiết bởi một loại truy vấn cụ thể mà bạn chạy thường xuyên. Vì các truy vấn thường cần truy xuất nhiều cột hơn là chỉ có các cột họ tìm kiếm,PostgreSQLCho phép bạn tạo một chỉ kèo bóng đá hom nay trong đó một số cột chỉ làtải trọngKhănvà không phải là một phần của khóa tìm kiếm. Điều này được thực hiện bằng cách thêm mộtBao gồm
mệnh đề liệt kê các cột bổ sung. Ví dụ: nếu bạn thường chạy các truy vấn như
Chọn y từ tab trong đó x = 'key';
Cách tiếp cận truyền thống để tăng tốc các truy vấn như vậy sẽ là tạo một chỉ kèo bóng đá hom nay trênx
Chỉ. Tuy nhiên, một chỉ kèo bóng đá hom nay được xác định là
Tạo chỉ kèo bóng đá hom nay tab_x_y trên tab (x) bao gồm (y);
Có thể xử lý các truy vấn này dưới dạng quét chỉ có chỉ kèo bóng đá hom nay, vìy
có thể được lấy từ chỉ kèo bóng đá hom nay mà không cần truy cập đống.
Vì cộty
không phải là một phần của khóa tìm kiếm của chỉ kèo bóng đá hom nay, nó không phải thuộc loại dữ liệu mà chỉ kèo bóng đá hom nay có thể xử lý; Nó chỉ đơn thuần được lưu trữ trong chỉ kèo bóng đá hom nay và không được giải thích bởi bộ máy chỉ kèo bóng đá hom nay. Ngoài ra, nếu chỉ kèo bóng đá hom nay là một chỉ kèo bóng đá hom nay duy nhất, đó là
Tạo chỉ kèo bóng đá hom nay duy nhất tab_x_y trên tab (x) bao gồm (y);
Điều kiện duy nhất áp dụng cho chỉ cộtx
, không kết hợpx
vày
. (MỘTBao gồm
mệnh đề cũng có thể được viết bằng15528_15536
vàKhóa chính
ràng buộc, cung cấp cú pháp thay thế để thiết lập một chỉ kèo bóng đá hom nay như thế này.)
Thật khôn ngoan khi bảo thủ về việc thêm các cột tải trọng không phím vào một chỉ kèo bóng đá hom nay, đặc biệt là các cột rộng. Nếu một bộ chỉ số vượt quá kích thước tối đa được phép cho loại chỉ kèo bóng đá hom nay, việc chèn dữ liệu sẽ không thành công. Trong mọi trường hợp, các cột không phải là dữ liệu trùng lặp từ bảng của chỉ kèo bóng đá hom nay và tăng kích thước của chỉ kèo bóng đá hom nay, do đó có khả năng làm chậm các tìm kiếm. Và hãy nhớ rằng có rất ít điểm trong việc bao gồm các cột tải trọng trong một chỉ kèo bóng đá hom nay trừ khi bảng thay đổi đủ chậm để quét chỉ có chỉ kèo bóng đá hom nay không cần phải truy cập vào đống. Nếu Tuple Heap phải được truy cập dù sao, nó không tốn kém gì để có được giá trị của cột từ đó. Các hạn chế khác là các biểu thức hiện không được hỗ trợ như các cột bao gồm và chỉ có các chỉ kèo bóng đá hom nay B-Tree, Gist và SP-Gist hiện đang hỗ trợ các cột bao gồm.
trướcPostgreSQLCóBao gồm
16574_16698
Tạo chỉ kèo bóng đá hom nay tab_x_y trên tab (x, y);
Mặc dù họ không có ý định sử dụngY
là một phần của AWHERE
mệnh đề. Điều này hoạt động tốt miễn là các cột bổ sung là các cột theo dõi; Làm cho chúng là các cột hàng đầu là không khôn ngoan vì những lý do được giải thích trongPhần 11.3. Tuy nhiên, phương pháp này không hỗ trợ trường hợp bạn muốn chỉ kèo bóng đá hom nay thực thi tính duy nhất trên (các) cột chính.
Luôn loại bỏ các cột không khóa khỏi các cấp độ B trên. Là cột tải trọng, chúng không bao giờ được sử dụng để hướng dẫn quét chỉ kèo bóng đá hom nay. Quá trình cắt ngắn cũng loại bỏ một hoặc nhiều cột khóa theo dõi khi tiền tố còn lại của (các) cột chính xảy ra là đủ để mô tả các bộ dữ liệu ở cấp độ B thấp nhất. Trong thực tế, bao gồm các chỉ kèo bóng đá hom nay mà không cóBao gồm
mệnh đề thường tránh lưu trữ các cột có tải trọng hiệu quả ở các cấp trên. Tuy nhiên, xác định rõ ràng các cột tải trọng dưới dạng các cột không khóađáng tin cậyGiữ các bộ dữ liệu ở cấp trên nhỏ.
Về nguyên tắc, các lần quét chỉ có chỉ kèo bóng đá hom nay có thể được sử dụng với các chỉ kèo bóng đá hom nay biểu thức. Ví dụ: đã cho một chỉ kèo bóng đá hom nay trênf (x)
ở đâux
là một cột bảng, có thể thực thi
Chọn f (x) từ tab trong đó f (x) <1;
dưới dạng quét chỉ có chỉ kèo bóng đá hom nay; Và điều này rất hấp dẫn nếuf ()
là một chức năng đắt tiền. Tuy nhiên,PostgreSQLNgười lập kế hoạch hiện không thông minh về những trường hợp như vậy. Nó coi một truy vấn có khả năng thực thi chỉ bằng cách quét chỉ chỉ kèo bóng đá hom nay khi tất cảcộtCần thiết bởi truy vấn có sẵn từ chỉ kèo bóng đá hom nay. Trong ví dụ này,X
Không cần thiết ngoại trừ trong bối cảnhf (x)
, nhưng người lập kế hoạch không nhận thấy điều đó và kết luận rằng không thể quét chỉ có chỉ kèo bóng đá hom nay. Nếu quét chỉ có chỉ kèo bóng đá hom nay có vẻ đủ đáng giá, thì điều này có thể được làm việc xung quanh bằng cách thêmx
Ví dụ như một cột bao gồm
Tạo chỉ kèo bóng đá hom nay tab_f_x trên tab (f (x)) bao gồm (x);
Một cảnh báo bổ sung, nếu kèo bóng đá hom nay tiêu là tránh tính toán lạif (x)
, là người lập kế hoạch sẽ không nhất thiết phải khớp với việc sử dụngf (x)
mà không có thể lập chỉ kèo bóng đá hom nayWHERE
mệnh đề đến cột chỉ kèo bóng đá hom nay. Nó thường sẽ có được quyền này trong các truy vấn đơn giản như được hiển thị ở trên, nhưng không phải trong các truy vấn liên quan đến tham gia. Những thiếu sót này có thể được khắc phục trong các phiên bản tương lai củaPostgreSQL.
Chỉ số một phần cũng có các tương tác thú vị với các lần quét chỉ có chỉ kèo bóng đá hom nay. Xem xét chỉ kèo bóng đá hom nay một phần được hiển thị trongVí dụ 11.3:
19929_20023
Về nguyên tắc, chúng ta có thể thực hiện quét chỉ có chỉ kèo bóng đá hom nay trên chỉ kèo bóng đá hom nay này để đáp ứng một truy vấn như
Chọn kèo bóng đá hom nay tiêu từ các bài kiểm tra trong đó chủ đề = 'một số chủ thể' và thành công;
Nhưng có vấn đề:WHERE
mệnh đề đề cập đếnThành công
không có sẵn theo kết quả của cột của chỉ kèo bóng đá hom nay. Tuy nhiên, có thể quét chỉ có chỉ kèo bóng đá hom nay vì kế hoạch không cần phải kiểm tra lại phần đó củaWHERE
mệnh đề tại thời điểm chạy: tất cả các kèo bóng đá hom nay được tìm thấy trong chỉ kèo bóng đá hom nay nhất thiết phải cóThành công = true
Vì vậy, điều này không cần phải được kiểm tra rõ ràng trong kế hoạch.PostgreSQLPhiên bản 9.6 trở lên sẽ nhận ra các trường hợp đó và cho phép các lần quét chỉ có chỉ kèo bóng đá hom nay được tạo, nhưng các phiên bản cũ hơn sẽ không.
Nếu bạn thấy bất cứ điều gì trong tài liệu không chính xác, không khớp Kinh nghiệm của bạn với tính năng cụ thể hoặc yêu cầu làm rõ thêm, Vui lòng sử dụngMẫu nàyĐể báo cáo vấn đề tài liệu.