Phiên bản được hỗ trợ:hiện tại(17)16/15/14/13
Phiên bản phát triển:Devel
Phiên bản không được hỗ trợ:12/11/10/9.6
Tài liệu này dành cho phiên bản không được hỗ trợ của PostgreSQL.
Bạn có thể muốn xem cùng một trang chohiện tạiPhiên bản hoặc một trong các phiên bản được hỗ trợ khác được liệt kê ở trên thay thế.

11.11.Quét chỉ có chỉ kèo bóng đá c1

Tất cả các chỉ kèo bóng đá c1 trongPostgreSQLphụChỉ kèo bóng đá c1, có nghĩa là mỗi chỉ kèo bóng đá c1 đượ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 đá c1 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 đá c1 và đống.WHEREĐiều kiện thường được kết hợp với nhau trong chỉ kèo bóng đá c1, 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 đá c1 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.Phần 11.5, kèo bóng đá c1 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 đá c1, có thể trả lời các truy vấn từ một chỉ kèo bóng đá c1 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 đá c1 nhập chỉ kèo bóng đá c1 thay vì tham khảo kèo bóng đá c1 nhập đống liên kết.

  1. Loại chỉ kèo bóng đá c1 phải hỗ trợ quét chỉ chỉ kèo bóng đá c1. Các chỉ kèo bóng đá c1 B-cây luôn luôn làm.

  2. Truy vấn chỉ phải tham chiếu các cột được lưu trữ trong chỉ kèo bóng đá c1. Ví dụ: đã cho một chỉ kèo bóng đá c1 trên các cộtxycủa một bảng cũng có cộtz, Các truy vấn này có thể sử dụng các lần quét chỉ có chỉ kèo bóng đá c1:

    Chọn x, y từ tab trong đó x = 'phím';

    Nhưng các truy vấn này không thể:

    Chọn x, z từ tab trong đó x = 'phím';

    (chỉ kèo bóng đá c1 biểu thức và chỉ kèo bóng đá c1 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 đá c1, do đó, việc quét chỉ có chỉ kèo bóng đá c1 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àCó thể nhìn thấyđế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 đá c1 nhập chỉ kèo bóng đá c1, chỉ trong các kèo bóng đá c1 nhập đống;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 hay không. 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 đá c1, sau khi tìm một kèo bóng đá c1 nhập chỉ kèo bóng đá c1 ứng cử viên, kiểm tra bit bản đồ hiển thị cho trang heap tương ứng.

Tóm lại, trong khi có thể kèo bóng đá c1 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ó thể nhìn thấy được. 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 kèo bóng đá c1 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 đá c1, bạn có thể chọn tạo các chỉ kèo bóng đá c1 trong đó chỉ có các cột hàng đầu có nghĩa là phù hợpWHEREmệnh đề, trong khi các cột kéo dàitải trọngHồidữ liệu được trả về bởi một truy vấn. 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 đá c1 trênxChỉ. Tuy nhiên, một chỉ kèo bóng đá c1 trên(x, y)sẽ cung cấp khả năng thực hiện truy vấn này dưới dạng quét chỉ có chỉ kèo bóng đá c1. Như đã thảo luận trước đây, một chỉ kèo bóng đá c1 như vậy sẽ lớn hơn và do đó đắt hơn một chỉ kèo bóng đá c1 trênxMột mình, vì vậy điều này chỉ hấp dẫn nếu bảng được biết là chủ yếu là tĩnh. Lưu ý rằng điều quan trọng là chỉ kèo bóng đá c1 được khai báo trên(x, y)không(y, x), như đối với hầu hết các loại chỉ kèo bóng đá c1 (đặc biệt là B-cây) không ràng buộc các cột chỉ kèo bóng đá c1 hàng đầu không hiệu quả lắm.

Về nguyên tắc, các lần quét chỉ có chỉ kèo bóng đá c1 có thể được sử dụng với các chỉ kèo bóng đá c1 biểu thức. Ví dụ: đã cho một chỉ kèo bóng đá c1 trênf (x)WHERExlà 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 đá c1; Và điều này rất hấp dẫn nếuf ()là một hàm đắt tiền. Tuy nhiên,PostgreSQLNgười lập kế hoạch hiện không thông minh lắm 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 đá c1 khi tất cảcộtCần thiết bởi truy vấn có sẵn từ chỉ kèo bóng đá c1. Trong ví dụ này,xKhô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 đá c1. Nếu quét chỉ có chỉ kèo bóng đá c1 có vẻ đủ đáng giá, thì điều này có thể được làm việc xung quanh bằng cách tuyên bố chỉ kèo bóng đá c1 là trên(f (x), x), trong đó cột thứ hai không được sử dụng trong thực tế nhưng chỉ ở đó để thuyết phục người lập kế hoạch rằng có thể quét chỉ có chỉ số. Một cảnh báo bổ sung, nếu kèo bóng đá c1 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)không có thể lập chỉ kèo bóng đá c1WHEREmệnh đề cho cột chỉ kèo bóng đá c1. 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.PostgreSQL.

Các chỉ kèo bóng đá c1 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 đá c1. Xem xét chỉ kèo bóng đá c1 một phần được hiển thị trongVí dụ 11.3:

16254_16346

Về nguyên tắc, chúng ta có thể thực hiện quét chỉ có chỉ kèo bóng đá c1 trên chỉ kèo bóng đá c1 này để đáp ứng một truy vấn như

Chọn kèo bóng đá c1 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 đề:WHEREmệnh đề đề cập đếnThành côngkhông có sẵn cột kết quả của chỉ kèo bóng đá c1. Tuy nhiên, có thể quét chỉ có chỉ kèo bóng đá c1 vì kế hoạch không cần phải kiểm tra lại phần đó củaWHEREmệnh đề tại thời điểm chạy: Tất cả các kèo bóng đá c1 được tìm thấy trong chỉ kèo bóng đá c1 nhất thiết phải cóthành công = trueVì 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 đá c1 được tạo, nhưng các phiên bản cũ hơn sẽ không.