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 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2
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ế.

35.13. Tối ưu kèo bóng đá pháp nhà điều hành Thông tin

APostgreSQLkèo bóng đá pháp tử định nghĩa có thể bao gồm một số điều khoản tùy chọn cho biết Hệ thống những điều hữu ích về cách các nhà điều hành hành xử. Những cái này các điều khoản nên được cung cấp bất cứ khi nào thích hợp, bởi vì chúng có thể tạo ra các tốc độ tăng tốc đáng kể trong việc thực hiện các truy vấn sử dụng người vận hành. Nhưng nếu bạn cung cấp chúng, bạn phải chắc chắn rằng họ là đúng! Việc sử dụng không chính xác một mệnh đề tối ưu hóa có thể dẫn đến Truy vấn chậm, đầu ra sai một cách tinh tế hoặc những điều xấu khác. Bạn có thể Luôn để lại một điều khoản tối ưu hóa nếu bạn không chắc chắn về Nó; Hậu quả duy nhất là các truy vấn có thể chạy chậm hơn Họ cần.

Các điều khoản tối ưu kèo bóng đá pháp bổ sung có thể được thêm vào trong tương lai phiên bản củaPostgreSQL. Những người Được mô tả ở đây là tất cả những cái phát hành 9.0.23 Hiểu.

35.13.1.Cổ lkèo bóng đá pháp

Themệnh đề, nếu được cung cấp, Đặt tên cho một kèo bóng đá pháp tử là người đăng ký của người vận hành xác định. Chúng tôi nói rằng nhà điều hành A là người đăng ký của nhà điều hành B if (x a y) bằng (y b x) cho tất cả các giá trị đầu vào có thể x, y. Lưu ý rằng B cũng là người giao dịch của A. ví dụ, người vận hành<Đối với một loại dữ liệu cụ thể thường là mỗi Người giao cổ và nhà điều hành của những người khác+IS thường làm việc với chính nó. Nhưng kèo bóng đá pháp tử-thường không giao hoán với bất cứ điều gì.

Loại kèo bóng đá pháp hạng bên trái của kèo bóng đá pháp tử có thể đi lại là giống nhau Là loại kèo bóng đá pháp hạng bên phải của công cụ chuyển đổi của nó và ngược lại. Vì thế Tên của kèo bóng đá pháp tử giao dịch là tất cảPostgreSQLCần được đưa ra để tra cứu Người giao dịch, và đó là tất cả những gì cần được cung cấp trongCổ lkèo bóng đá phápmệnh đề.

Điều quan trọng là cung cấp thông tin trước cho Các nhà khai thác sẽ được sử dụng trong các chỉ mục và tham gia các mệnh đề, Bởi vì điều này cho phép trình tối ưu kèo bóng đá pháp truy vấn"lật xung quanh"Điều khoản như vậy cho các biểu mẫu cần thiết cho các loại kế hoạch khác nhau. Ví dụ, xem xét một truy vấn với Điều khoản như thế nàoTab1.x = Tab2.y,, Ở đâuTab1.xTab2.ythuộc loại do người dùng định nghĩa và giả sử cái đóTab2.yđược lập chỉ mục. Trình tối ưu kèo bóng đá pháp không thể tạo quét chỉ mục trừ khi nó có thể xác định cách lật mệnh đề xung quanhTab2.y = Tab1.x, Bởi vì máy móc quét chỉ mục dự kiến ​​sẽ thấy Cột được lập chỉ mục ở bên trái của kèo bóng đá pháp tử nó được đưa ra.PostgreSQLWillkhôngChỉ cần giả sử rằng đây là một Chuyển đổi hợp lệ - Người tạo ra=Nhà điều hành phải chỉ định rằng nó hợp lệ, bằng cách Đánh dấu người vận hành bằng kèo bóng đá pháp trước.

Khi bạn đang xác định một kèo bóng đá pháp tử tự Commutated, bạn chỉ Làm điều đó. Khi bạn đang xác định một cặp nhà khai thác giao hoán, Mọi thứ trở nên khó khăn hơn một chút: làm thế nào người đầu tiên có thể trở thành được xác định tham khảo cái khác mà bạn chưa xác định được? Có hai giải pháp cho vấn đề này:

  • Một cách là bỏ quaCổ lkèo bóng đá phápmệnh đề trong kèo bóng đá pháp tử đầu tiên mà bạn xác định, và sau đó cung cấp một trong nhà điều hành thứ hai sự định nghĩa. TừPostgreSQLbiết rằng việc giao hoán Các nhà khai thác đi theo cặp, khi nó nhìn thấy định nghĩa thứ hai nó sẽ tự động quay lại và điền vào thiếuCổ lkèo bóng đá phápĐiều khoản trong lần đầu tiên sự định nghĩa.

  • Cách khác, đơn giản hơn chỉ là bao gồmCổ lkèo bóng đá phápmệnh đề trong cả hai định nghĩa. KhiPostgreSQLxử lý đầu tiên định nghĩa và nhận ra rằngCổ lkèo bóng đá phápđề cập đến kèo bóng đá pháp tử không tồn tại, Hệ thống sẽ tạo một mục giả cho kèo bóng đá pháp tử đó trong Danh mục hệ thống. Mục nhập giả này sẽ chỉ có dữ liệu hợp lệ cho tên kèo bóng đá pháp tử, các loại kèo bóng đá pháp hạng bên trái và phải và loại kết quả, vì đó là tất cả những gìPostgreSQLCó thể suy luận tại thời điểm này. Mục nhập danh mục của nhà điều hành đầu tiên sẽ liên kết với hình nộm này lối vào. Sau này, khi bạn xác định kèo bóng đá pháp tử thứ hai, Hệ thống cập nhật mục giả với phần bổ sung thông tin từ định nghĩa thứ hai. Nếu bạn cố gắng sử dụng người điều khiển giả trước khi nó được điền vào, bạn sẽ chỉ Nhận thông báo lỗi.

35.13.2.NEGATOR

TheNEGATORmệnh đề, nếu được cung cấp, Đặt tên cho một kèo bóng đá pháp tử là người tiêu cực của người vận hành xác định. Chúng tôi nói rằng kèo bóng đá pháp tử A là công cụ tiêu cực của kèo bóng đá pháp tử B nếu Cả hai kết quả boolean trở lại và (x a y) bằng không (x b y) cho Tất cả các đầu vào có thể x, y. Lưu ý rằng B cũng là người tiêu cực của A. Ví dụ,< =là một cặp tiêu cực cho hầu hết các loại dữ liệu. MỘT kèo bóng đá pháp tử không bao giờ có thể là người tiêu cực của chính nó.

Không giống như những người giao dịch, một cặp kèo bóng đá pháp tử Unary có thể hợp lệ được đánh dấu là người tiêu cực của nhau; Điều đó có nghĩa là (a x) bằng không (b x) cho tất cả x, hoặc tương đương với đúng người vận hành.

Người phủ định của người vận hành phải có cùng bên trái và/hoặc phải Các loại kèo bóng đá pháp hạng là kèo bóng đá pháp tử được xác định, vì vậy cũng giống như vớiCổ lkèo bóng đá pháp, Chỉ có tên kèo bóng đá pháp tử cần được đưa ra trongNEGATORmệnh đề.

Cung cấp trình phủ định là rất hữu ích cho trình tối ưu kèo bóng đá pháp truy vấn Vì nó cho phép các biểu thức nhưkhông (x = y)Để được đơn giản kèo bóng đá pháp thànhx < y. Điều này xuất hiện thường xuyên hơn bạn nghĩ, bởi vìkhôngHoạt động có thể được chèn dưới dạng Hậu quả của việc sắp xếp lại khác.

Các cặp kèo bóng đá pháp tử tiêu cực có thể được xác định bằng cách sử dụng cùng một Các phương thức được giải thích ở trên cho các cặp giao dịch.

35.13.3.Hạn chế

TheHạn chếmệnh đề, nếu được cung cấp, Đặt tên cho chức năng ước tính chọn lọc hạn chế cho nhà điều hành. (Lkèo bóng đá pháp ý rằng đây là tên hàm, không phải là người vận hành tên.)Hạn chếmệnh đề chỉ thực hiện cảm giác cho các kèo bóng đá pháp tử nhị phân trả vềBoolean18396_18524WHERE-Chlause điều kiện của Mẫu:

Cột op hằng số

Đối với kèo bóng đá pháp tử hiện tại và một giá trị hằng số cụ thể. Điều này hỗ trợ trình tối ưu hóa bằng cách cho nó một số ý tưởng về bao nhiêu Hàng sẽ bị loại bởiWHEREĐiều khoản có hình thức này. (Điều gì xảy ra nếu hằng số là Ở bên trái, bạn có thể tự hỏi? Tốt, đó là một trong những những thứ đóCổ lkèo bóng đá pháplà cho ...)

Viết các chức năng ước tính chọn lọc giới hạn mới là vượt xa phạm vi của chương này, nhưng may mắn thay, bạn có thể thường chỉ cần sử dụng một trong các ước tính tiêu chuẩn của hệ thống cho Nhiều nhà khai thác của riêng bạn. Đây là những hạn chế tiêu chuẩn người ước tính:

eqselcho=
Neqselcho<
Scalarltselcho<hoặc<=
Scalargtselchohoặc =
Có vẻ hơi kỳ lạ rằng đây là danh mục, nhưng chúng có ý nghĩa nếu bạn nghĩ về nó.=kèo bóng đá pháp thường sẽ chỉ chấp nhận một nhỏ một phần của các hàng trong bảng;<kèo bóng đá pháp thường sẽ chỉ từ chối một con nhỏ phân số.<sẽ chấp nhận một phân số Điều đó phụ thuộc vào nơi không đổi đã cho trong phạm vi của các giá trị cho cột bảng đó (mà nó chỉ xảy ra kèo bóng đá pháp được thu thập bởiPhân tíchvà có sẵn cho công cụ ước tính chọn lọc).<=sẽ chấp nhận một phần lớn hơn một chút hơn<Để so sánh tương tự không đổi, nhưng chúng đủ gần để không có giá trị phân biệt, đặc biệt là vì chúng ta không có khả năng làm tốt hơn Dù sao thì một phỏng đoán thô. Nhận xét tương tự áp dụng cho =.

Bạn có thể thường xuyên thoát khỏi việc sử dụngEQSELhoặcNeqselĐối với các kèo bóng đá pháp tử có độ chọn lọc rất cao hoặc rất thấp, thậm chí Nếu họ không thực sự bình đẳng hoặc bất bình đẳng. Ví dụ, Các kèo bóng đá pháp tử hình học gần đúng-bình đẳng sử dụngEQSELVề giả định rằng họ thường Chỉ khớp một phần nhỏ của các mục trong bảng.

Bạn có thể sử dụngScalarltselScalargtselđể so sánh trên Các loại dữ liệu có một số phương tiện hợp lý để được chuyển đổi vào vô hướng số để so sánh phạm vi. Nếu có thể, thêm kiểu dữ liệu cho những người được hiểu bởi hàmconvert_to_scalar ()insrc/backend/utils/adt/selfuncs.c. (Sau cùng, Chức năng này nên được thay thế bằng các chức năng theo kiểu dữ liệu được xác định kèo bóng đá pháp qua một cột củaPG_TYPEDanh mục hệ thống; Nhưng điều đó không có đã xảy ra chưa.) Nếu bạn không làm điều này, mọi thứ vẫn sẽ hoạt động, Nhưng ước tính của trình tối ưu kèo bóng đá pháp sẽ không tốt nhất có thể là.

Có các chức năng ước tính chọn lọc bổ sung Được thiết kế cho các kèo bóng đá pháp tử hình học trong: Vùng l tính, vị trícontsel. Tại bài viết này, đây chỉ là gốc, nhưng bạn có thể muốn sử dụng chúng (hoặc thậm chí tốt hơn, cải thiện họ) dù sao.

35.13.4.Tham gia

Thetham giamệnh đề, nếu được cung cấp, tên Chức năng ước tính chọn lọc tham gia cho kèo bóng đá pháp tử. (Ghi chú rằng đây là tên hàm, không phải tên kèo bóng đá pháp tử.)tham giaĐiều khoản chỉ có ý nghĩa đối với nhị phân người vận hành trả vềBoolean. Ý tưởng Đằng sau một công cụ ước tính chọn lọc tham gia là đoán xem phần nào của các hàng trong một cặp bảng sẽ thỏa mãnWHERE-Chlause điều kiện của biểu mẫu:

Bảng1.Column1 OP Bảng2.column2

Đối với kèo bóng đá pháp tử hiện tại. Như vớiHạn chếmệnh đề, điều này giúp trình tối ưu kèo bóng đá pháp rất thực chất bằng cách để nó tìm ra cái nào trong số một số Trình tự tham gia có thể có khả năng nhận ít công việc nhất.

Như trước đây, chương này sẽ không cố gắng giải thích làm thế nào để viết chức năng trình ước tính chọn lọc tham gia, nhưng sẽ chỉ đề nghị bạn sử dụng một trong những công cụ ước tính tiêu chuẩn nếu một áp dụng:

eqjoinselcho=
Neqjoinselcho<
Scalarltjoinselcho<hoặc<=
Scalargtjoinselchohoặc =
Areajoinselcho 2d so sánh dựa trên khu vực
vị tríjoinselcho 2d so sánh dựa trên vị trí
contjoinselcho 2d so sánh dựa trên ngăn chặn

35.13.5.băm

Thebămmệnh đề, nếu có, nói với hệ thống rằng việc sử dụng băm tham gia Phương thức tham gia dựa trên kèo bóng đá pháp tử này.bămChỉ có ý nghĩa đối với kèo bóng đá pháp tử nhị phân mà trả vềBooleanvà trong thực tế người vận hành phải biểu diễn bình đẳng cho một số loại dữ liệu hoặc cặp của các loại dữ liệu.

Giả định băm nhỏ tham gia là sự tham gia kèo bóng đá pháp tử chỉ có thể trả về true cho các cặp trái và phải Các giá trị băm với cùng mã băm. Nếu hai giá trị được đặt Trong các thùng băm khác nhau, sự tham gia sẽ không bao giờ so sánh chúng tại tất cả, hoàn toàn giả định rằng kết quả của kèo bóng đá pháp tử tham gia phải sai. Vì vậy, không bao giờ có ý nghĩa khi chỉ địnhbămĐối với các kèo bóng đá pháp tử không đại diện cho một số hình thức bình đẳng. Trong hầu hết các trường hợp, nó chỉ thực tế để hỗ trợ băm cho các kèo bóng đá pháp tử lấy cùng một loại dữ liệu trên cả hai hai bên. Tuy nhiên, đôi khi có thể thiết kế tương thích hàm băm cho hai hoặc nhiều loại dữ liệu; đó là, chức năng Điều đó sẽ tạo ra các mã băm giống nhau cho"bằng"giá trị, mặc dù các giá trị có đại diện khác nhau. Ví dụ, nó khá đơn giản để Sắp xếp tài sản này khi băm số nguyên của các số nguyên khác nhau chiều rộng.

Để được đánh dấubăm, Tham gia Nhà điều hành phải xuất hiện trong một gia đình vận hành chỉ số băm. Đây là không được thi hành khi bạn tạo nhà điều hành, tất nhiên là vì Tham khảo gia đình điều hành chưa thể tồn tại. Nhưng cố gắng Sử dụng kèo bóng đá pháp tử trong các kết nối băm sẽ thất bại trong thời gian chạy nếu không có như vậy Gia đình điều hành tồn tại. Hệ thống cần gia đình vận hành để Tìm (các) hàm băm dành riêng cho loại dữ liệu cho người vận hành (các) loại dữ liệu đầu vào. Tất nhiên, bạn cũng phải tạo Các chức năng băm trước khi bạn có thể tạo gia đình kèo bóng đá pháp tử.

Cần phải thực hiện chăm sóc khi chuẩn bị chức năng băm, bởi vì có những cách phụ thuộc vào máy mà nó có thể thất bại để làm điều đúng đắn. Ví dụ: nếu kiểu dữ liệu của bạn là cấu trúc trong đó có thể có các bit pad không thú vị, bạn không thể đơn giản chuyển toàn bộ cấu trúc choHash_any. (Trừ khi bạn viết người khác của mình người vận hành và chức năng để đảm bảo rằng các bit không sử dụng là luôn luôn bằng không, đó là chiến lược được đề xuất.) Ví dụ là trên các máy gặpIEEETiêu chuẩn điểm nổi, số 0 âm tính và số 0 dương là các giá trị khác nhau (các mẫu bit khác nhau) nhưng chúng được xác định để so sánh bằng nhau. Nếu một giá trị nổi có thể chứa số 0 âm thì cần thêm các bước để đảm bảo nó tạo ra giá trị băm giống như không.

Một kèo bóng đá pháp tử có thể kết hợp băm phải có một người đăng ký (chính nó nếu Hai loại dữ liệu kèo bóng đá pháp hạng giống nhau hoặc bình đẳng liên quan kèo bóng đá pháp tử nếu chúng khác nhau) xuất hiện trong cùng một Gia đình điều hành. Nếu đây không phải là trường hợp, lỗi của kế hoạch có thể xảy ra khi người vận hành được sử dụng. Ngoài ra, đó là một ý kiến ​​hay (nhưng không được yêu cầu nghiêm ngặt) đối với một gia đình vận hành băm hỗ trợ nhiều loại dữ liệu để cung cấp các kèo bóng đá pháp tử bình đẳng cho mọi sự kết hợp của các loại dữ liệu; Điều này cho phép tốt hơn Tối ưu hóa.

Lkèo bóng đá pháp ý:Chức năng cơ bản có thể ghép được Người vận hành phải được đánh dấu bất biến hoặc ổn định. Nếu nó là dễ bay hơi, hệ thống sẽ không bao giờ cố gắng sử dụng kèo bóng đá pháp tử cho một băm tham gia.

Lkèo bóng đá pháp ý:Nếu một kèo bóng đá pháp tử có thể kết hợp băm có một chức năng cơ bản được đánh dấu nghiêm ngặt, chức năng cũng phải hoàn thành: nghĩa là, nó sẽ trả về đúng hoặc Sai, không bao giờ null, đối với bất kỳ hai đầu vào không phải là bất kỳ. Nếu quy tắc này không được theo dõi, tối ưu hóa băm củainHoạt động có thể tạo ra kết quả sai. (Cụ thể,incó thể trở lại sai trong đó câu trả lời đúng theo tiêu chuẩn sẽ là null; hoặc nó có thể mang lại một lỗi phàn nàn rằng nó không được chuẩn bị cho một kết quả null.)

35.13.6.Hợp nhất

TheHợp nhấtmệnh đề, nếu có, nói với hệ thống rằng có thể sử dụng hợp nhất-tham gia Phương thức tham gia dựa trên kèo bóng đá pháp tử này.Hợp nhấtChỉ có ý nghĩa đối với kèo bóng đá pháp tử nhị phân mà trả vềBooleanvà trong thực tế người vận hành phải biểu diễn bình đẳng cho một số loại dữ liệu hoặc cặp của các loại dữ liệu.

Hợp nhất tham gia dựa trên ý tưởng sắp xếp bên trái- và các bảng tay phải vào thứ tự và sau đó quét chúng vào song song. Vì vậy, cả hai loại dữ liệu phải có khả năng hoàn toàn đặt hàng và kèo bóng đá pháp tử tham gia phải là một trong những chỉ có thể thành công cho các cặp giá trị rơi vào"cùng một nơi"Theo thứ tự sắp xếp. Trong thực tế này có nghĩa là kèo bóng đá pháp tử tham gia phải cư xử như bình đẳng. Nhưng nó có thể hợp nhất-tham gia vào hai loại dữ liệu riêng biệt miễn là Chúng tương thích về mặt logic. Ví dụ:SmallInt-versus-Số nguyênkèo bóng đá pháp tử bình đẳng có thể hợp nhất. Chúng tôi chỉ cần sắp xếp các nhà khai thác sẽ đưa cả hai loại dữ liệu vào một Trình tự tương thích.

Để được đánh dấuHợp nhất, Tham gia kèo bóng đá pháp tử phải xuất hiện dưới dạng thành viên bình đẳng củaBtreeGia đình vận hành chỉ mục. Đây không phải là được thi hành khi bạn tạo nhà điều hành, tất nhiên là vì Tham khảo gia đình điều hành chưa thể tồn tại. Nhưng nhà điều hành sẽ không thực sự được sử dụng để kết hợp các tham gia trừ khi một Gia đình điều hành phù hợp có thể được tìm thấy. TheHợp nhấtcờ do đó hoạt động như một gợi ý cho người lập kế hoạch rằng nó đáng để tìm kiếm một gia đình điều hành phù hợp.

Một kèo bóng đá pháp tử có thể hợp nhất phải có một người giao cổ Hai loại dữ liệu kèo bóng đá pháp hạng giống nhau hoặc bình đẳng liên quan kèo bóng đá pháp tử nếu chúng khác nhau) xuất hiện trong cùng một Gia đình điều hành. Nếu đây không phải là trường hợp, lỗi của kế hoạch có thể xảy ra khi người vận hành được sử dụng. Ngoài ra, đó là một ý kiến ​​hay (nhưng không được yêu cầu nghiêm ngặt) cho mộtBtreeGia đình nhà điều hành hỗ trợ nhiều loại dữ liệu để cung cấp kèo bóng đá pháp tử bình đẳng cho mọi kết hợp của các loại dữ liệu; Điều này cho phép tối ưu hóa tốt hơn.

Lkèo bóng đá pháp ý:Chức năng cơ bản có thể hợp nhất Người vận hành phải được đánh dấu bất biến hoặc ổn định. Nếu nó là dễ bay hơi, hệ thống sẽ không bao giờ cố gắng sử dụng kèo bóng đá pháp tử cho một sự hợp nhất tham gia.