Phiên bản được hỗ trợ:hiện tại(17) /16 / 15 / 14 / 13
Phiên bản phát triển:18 / 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.9. Quét chỉ có chỉ cách đọc kèo bóng đá và chỉ cách đọc kèo bóng đá bao gồm

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

  1. Loại chỉ cách đọc kèo bóng đá phải hỗ trợ quét chỉ chỉ cách đọc kèo bóng đá. Các chỉ cách đọc kèo bóng đá B-cây luôn luôn làm. Các chỉ cách đọc kèo bóng đá của GIST và SP-GIST hỗ trợ quét chỉ chỉ cách đọc kèo bóng đá 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ỉ cách đọc kèo bóng đá khác không có hỗ trợ. Yêu cầu cơ bản là chỉ cách đọc kèo bóng đá 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 cách đọc kèo bóng đá nhập chỉ cách đọc kèo bóng đá. Là một ví dụ: các chỉ cách đọc kèo bóng đá gin không thể hỗ trợ quét chỉ chỉ cách đọc kèo bóng đá vì mỗi cách đọc kèo bóng đá nhập chỉ cách đọc kèo bóng đá thường chỉ giữ một phần của giá trị dữ liệu gốc.

  2. Truy vấn chỉ phải tham chiếu các cột được lưu trữ trong chỉ cách đọc kèo bóng đá. Ví dụ: đã cho một chỉ cách đọc kèo bóng đá 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ỉ cách đọc kèo bóng đá:

    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ể:

    11620_11710

    (chỉ cách đọc kèo bóng đá biểu thức và chỉ cách đọc kèo bóng đá 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ỉ cách đọc kèo bóng đá, do đó, việc quét chỉ có chỉ số 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ấyKhănđến ảnh chụp nhanh MVCC của truy vấn, như đã thảo luận trongChương 1312379_12698PostgreSQLTrì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ỉ cách đọc kèo bóng đá, sau khi tìm một cách đọc kèo bóng đá nhập chỉ cách đọc kèo bóng đá ứ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, cách đọc kèo bóng đá 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ỉ cách đọc kèo bóng đá 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ó 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ỉ cách đọc kèo bóng đá, bạn có thể chọn tạo mộtChỉ cách đọc kèo bóng đá bao gồm, một chỉ cách đọc kèo bóng đá đượ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ỉ cách đọc kèo bóng đá trong đó một số cột chỉ làtải trọngHồivà 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ồmmệ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ỉ cách đọc kèo bóng đá trênxChỉ. Tuy nhiên, một chỉ cách đọc kèo bóng đá được xác định là

Tạo chỉ cách đọc kèo bóng đá 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ỉ cách đọc kèo bóng đá, vìYcó thể được lấy từ chỉ cách đọc kèo bóng đá mà không cần truy cập đống.

Vì cộty15285_15516

Tạo chỉ cách đọc kèo bóng đá 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ợpxy. (MỘTBao gồmmệnh đề cũng có thể được viết bằngđộc đáoKhóa chínhràng buộc, cung cấp cú pháp thay thế để thiết lập một chỉ cách đọc kèo bóng đá như thế này.)

16025_16813

trướcPostgreSQLBao gồm16916_17040

Tạo chỉ cách đọc kèo bóng đá tab_x_y trên tab (x, y);

Mặc dù họ không có ý định sử dụngYlà một phần của AWHEREmệ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 trongPostgresql:. Tuy nhiên, phương pháp này không hỗ trợ trường hợp bạn muốn chỉ cách đọc kèo bóng đá thực thi tính duy nhất trên (các) cột chính.

TriCix cắt ngắn17671_18020Bao gồmĐiều khoản 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ỉ cách đọc kèo bóng đá có thể được sử dụng với các chỉ cách đọc kèo bóng đá biểu thức. Ví dụ: đã cho một chỉ cách đọc kèo bóng đá trênf (x)WHEREx18470_18524

Chọn f (x) từ tab trong đó f (x) <1;

dưới dạng quét chỉ có chỉ cách đọc kèo bóng đá; 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 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ỉ cách đọc kèo bóng đá khi tất cảcộtCần thiết bởi truy vấn có sẵn từ chỉ cách đọc kèo bóng đá. 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ỉ cách đọc kèo bóng đá. Nếu quét chỉ có chỉ cách đọc kèo bóng đá có vẻ đủ đáng giá, thì điều này có thể được làm việc xung quanh bằng cách thêmxVí dụ như một cột bao gồm

19423_19474

Một cảnh báo bổ sung, nếu cách đọc kèo bóng đá 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ỉ cách đọc kèo bóng đáở đâumệnh đề cho cột chỉ cách đọc kèo bóng đá. 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ỉ cách đọc kèo bóng đá. Xem xét chỉ cách đọc kèo bóng đá một phần được hiển thị trongVí dụ 11.3:

20271_20365

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

Chọn cách đọc kèo bóng đá 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ỉ cách đọc kèo bóng đá. Tuy nhiên, có thể quét chỉ có chỉ cách đọc kèo bóng đá 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 cách đọc kèo bóng đá được tìm thấy trong chỉ cách đọc kèo bóng đá 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.PostgreSQL21091_21215