PostgreSQL: kèo bóng đá hôm | |||
---|---|---|---|
prev | UP | Chương 11. Indexes | NEXT |
Tất cả các chỉ kèo chấp bóng đá hôm nay trongPostgreSQLlàphụChỉ kèo chấp bóng đá hôm nay, có nghĩa là mỗi chỉ kèo chấp bóng đá hôm 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 chấp bóng đá hôm 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 chấp bóng đá hôm nay và đống.WHEREĐiều kiện thường được kết hợp với nhau trong chỉ kèo chấp bóng đá hôm 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 chấp bóng đá hôm 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.Phầ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 chấp bóng đá hôm nay, có thể trả lời các truy vấn từ một chỉ kèo chấp bóng đá hôm 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 chấp bóng đá hôm nay nhập chỉ kèo chấp bóng đá hôm nay thay vì tham khảo kèo chấp bóng đá hôm nay nhập đống liên kết.
Loại chỉ kèo chấp bóng đá hôm nay phải hỗ trợ quét chỉ chỉ kèo chấp bóng đá hôm nay. Các chỉ kèo chấp bóng đá hôm nay B-cây luôn luôn làm.
Truy vấn chỉ phải tham chiếu các cột được lưu trữ trong chỉ kèo chấp bóng đá hôm nay. Ví dụ: đã cho một chỉ kèo chấp bóng đá hôm nay trên các cộtxvàYcủ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 chấp bóng đá hôm nay:
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 chấp bóng đá hôm nay biểu thức và chỉ kèo chấp bóng đá hôm 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 chấp bóng đá hôm nay, do đó, việc quét chỉ có chỉ kèo chấp bóng đá hôm 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à"hiển thị"đế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 chấp bóng đá hôm nay nhập chỉ kèo chấp bóng đá hôm nay, chỉ trong các kèo chấp bóng đá hôm nay nhập đống;PostgreSQLTrack, 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 chấp bóng đá hôm nay, sau khi tìm một kèo chấp bóng đá hôm nay nhập chỉ kèo chấp bóng đá hôm nay ứ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ể 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 đồ hoàn toà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 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 chấp bóng đá hôm nay, bạn có thể chọn tạo các chỉ kèo chấp bóng đá hôm nay trong đó chỉ các cột hàng đầu có nghĩa là phù hợpWHEREmệnh đề, trong khi các cột kéo dài"Tải trọng"dữ 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 chấp bóng đá hôm nay trênxChỉ. Tuy nhiên, một chỉ kèo chấp bóng đá hôm nay 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 chấp bóng đá hôm nay. Như đã thảo luận trước đây, một chỉ kèo chấp bóng đá hôm nay như vậy sẽ lớn hơn và do đó đắt hơn một chỉ kèo chấp bóng đá hôm nay 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 chấp bóng đá hôm nay đượ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 chấp bóng đá hôm nay (đặc biệt là B-cây) không ràng buộc các cột chỉ kèo chấp bóng đá hôm nay 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 chấp bóng đá hôm nay có thể được sử dụng với các chỉ kèo chấp bóng đá hôm nay biểu thức. Ví dụ: đã cho một chỉ kèo chấp bóng đá hôm nay 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 chấp bóng đá hôm nay; 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 chấp bóng đá hôm nay khi tất cảcộtCần thiết bởi truy vấn có sẵn từ chỉ kèo chấp bóng đá hôm nay. 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 chấp bóng đá hôm nay. Nếu quét chỉ có chỉ kèo chấp bóng đá hôm nay 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 chấp bóng đá hôm nay 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 chấp bóng đá hôm 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)không có thể lập chỉ kèo chấp bóng đá hôm nayWHEREĐiều khoản vào cột chỉ kèo chấp bóng đá hôm 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.PostgreSQL.
Chỉ kèo chấp bóng đá hôm nay 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 chấp bóng đá hôm nay. Xem xét chỉ kèo chấp bóng đá hôm nay một phần được hiển thị trongVí dụ 11-3:
15752_15844
Về nguyên tắc, chúng ta có thể thực hiện quét chỉ chỉ kèo chấp bóng đá hôm nay trên chỉ kèo chấp bóng đá hôm nay này để đáp ứng một truy vấn như
Chọn kèo chấp bóng đá hôm 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 đề:WHEREmệnh đề đề cập đếnThành côngkhông có sẵn cột kết quả của chỉ kèo chấp bóng đá hôm nay. Tuy nhiên, có thể quét chỉ có chỉ kèo chấp bóng đá hôm nay 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 chấp bóng đá hôm nay được tìm thấy trong chỉ kèo chấp bóng đá hôm nay 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 chấp bóng đá hôm nay được tạo, nhưng các phiên bản cũ hơn sẽ không.