Phiên bản không được hỗ trợ:7.0 / 6.5 / 6.4
Tài liệu này dành soi kèo bóng đá truoctran phiên bản không được hỗ trợ của PostgreSQL.
Bạn có thể muốn xem cùng soi kèo bóng đá truoctran trang chohiện tạiPhiên bản hoặc một trong soi kèo bóng đá truoctran phiên bản được hỗ trợ khác được liệt kê ở trên thay thế.

Chương 40. Mở rộngSQL: soi kèo bóng đá truoctran tử

PostgresHỗ trợ bên trái Unary, Các nhà khai thác nhị phân và nhị phân đúng. Người vận hành có thể bị quá tải; cái đó là, cùng một tên soi kèo bóng đá truoctran tử có thể được sử dụng cho các soi kèo bóng đá truoctran tử khác nhau có số và loại đối số khác nhau. Nếu có một tình huống mơ hồ và hệ thống không thể xác định đúng Nhà điều hành để sử dụng, nó sẽ trả về một lỗi. Bạn có thể phải đánh máy Các soi kèo bóng đá truoctran hạng bên trái và/hoặc bên phải để giúp nó hiểu nhà điều hành nào bạn định sử dụng.

Mỗi soi kèo bóng đá truoctran tử là "đường cú pháp" để gọi đến một người cơ bản chức năng làm công việc thực sự; Vì vậy, trước tiên bạn phải tạo chức năng cơ bản trước khi bạn có thể tạo soi kèo bóng đá truoctran tử. Tuy nhiên, một soi kèo bóng đá truoctran tử làkhôngĐường Syntactic đơn thuần, bởi vì nó mang thêm thông tin giúp truy vấn Người lập kế hoạch tối ưu hóa các truy vấn sử dụng soi kèo bóng đá truoctran tử. Phần lớn điều này chương sẽ được dành để giải thích rằng bổ sung thông tin.

Đây là một ví dụ về việc tạo soi kèo bóng đá truoctran tử để thêm hai số phức. Chúng tôi giả sử rằng chúng tôi đã tạo định nghĩa của Loại phức tạp. Đầu tiên chúng ta cần một chức năng thực hiện công việc; Sau đó, chúng tôi có thể xác định soi kèo bóng đá truoctran tử:

Tạo chức năng Complex_add (phức tạp, phức tạp)
    Trả lại phức tạp
    Như '$ pwd/obj/comple.so'
    Ngôn ngữ 'c';

Tạo soi kèo bóng đá truoctran tử + (
    leftarg = phức tạp,
    Rightarg = Complex,
    Quy trình = Complex_add,
    Cổ tốc = +
);

Bây giờ chúng ta có thể làm:

Chọn (a + b) dưới dạng c từ test_complex;

+----------------+
| C |
+----------------+
| (5.2,6,05) |
+----------------+
| (133,42,144,95) |
+----------------+

Chúng tôi đã chỉ ra cách tạo một soi kèo bóng đá truoctran tử nhị phân ở đây. Để tạo Các soi kèo bóng đá truoctran tử chưa được RIGHTARG (cho đúng không). Mệnh đề thủ tục và đối số Các điều khoản là các mục duy nhất cần thiết trong soi kèo bóng đá truoctran tử tạo. Các Mệnh đề giao thông được hiển thị trong ví dụ là một gợi ý tùy chọn cho Trình tối ưu hóa truy vấn. Thông tin chi tiết khác về Cao góp và các Gợi ý của trình tối ưu hóa xuất hiện bên dưới.

soi kèo bóng đá truoctran tử Thông tin tối ưu hóa

tác giả:Được viết bởi Tom Lane.

APostgresĐịnh nghĩa soi kèo bóng đá truoctran tử có thể bao gồm một số điều khoản tùy chọn cho biết hệ thống hữu ích Những điều về cách các nhà điều hành hành xử. Những điều khoản này nên được cung cấp bất cứ khi nào thích hợp, bởi vì họ có thể làm cho Tăng tốc đáng kể trong việc thực hiện các truy vấn sử dụng nhà điều hành. Nhưng nếu bạn cung cấp cho họ, bạn phải chắc chắn rằng chúng là Phải! 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 phụ trợ sụp đổ, đầ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 chúng cần.

soi kèo bóng đá truoctran điều khoản tối ưu hóa bổ sung có thể được thêm vào trong tương lai phiên bản củaPostgres. Những người được mô tả ở đây là tất cả những cái phát hành 6.5 hiểu.

Cổ lưu

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

​​Loại đối số bên trái của soi kèo bóng đá truoctran tử giao dịch giống như Loại đối số đúng của người giao dịch của nó, và ngược lại. Vì vậy, tên của nhà điều hành giao dịch là tất cảPostgrescầ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 trong Cổ nhiệm mệnh đề.

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

  • soi kèo bóng đá truoctran cách là bỏ qua mệnh đề cổ góp trong lần đầu tiên nhà điều hành mà bạn xác định, và sau đó cung cấp soi kèo bóng đá truoctran trong lần thứ hai định nghĩa của nhà điều hành. TừPostgresbiết rằng soi kèo bóng đá truoctran nhà khai thác giao hoán đi theo cặp, khi nó thấy định nghĩa thứ hai, nó sẽ Tự động quay lại và điền vào mệnh đề Occuputator bị thiếu Trong định nghĩa đầu tiên.

  • Cách khác, đơn giản hơn chỉ là bao gồm soi kèo bóng đá truoctran điều khoản giao dịch trong cả hai định nghĩa. KhiPostgresXử lý định nghĩa đầu tiên và nhận ra rằng người giao lưu đề cập đến một nhà điều hành không tồn tại, Hệ thống sẽ tạo một mục giả cho soi kèo bóng đá truoctran tử đó trong Bảng PG_Operator của hệ thống. Mục giả này sẽ có giá trị Dữ liệu chỉ cho tên soi kèo bóng đá truoctran tử, các loại đối số bên trái và bên phải, và loại kết quả, vì đó là tất cả những gìPostgresCó thể suy luận tại thời điểm này. Các Mục nhập danh mục của nhà điều hành đầu tiên sẽ liên kết đến mục giả này. Sau này, khi bạn xác định soi kèo bóng đá truoctran tử thứ hai, hệ thống sẽ cập nhật mục giả với thông tin bổ sung từ lần thứ hai sự định nghĩa. Nếu bạn cố gắng sử dụng soi kèo bóng đá truoctran tử giả trước khi nó Đã được điền vào, bạn sẽ nhận được một thông báo lỗi. (Lưu ý: Điều này Thủ tục không hoạt động đáng tin cậy trongPostgresphiên bản trước 6.5, nhưng nó là Bây giờ cách được đề xuất để làm mọi việc.)

tiêu cực

mệnh đề tiêu cực, nếu được cung cấp, đặt tên cho một soi kèo bóng đá truoctran tử là tiêu cực của người vận hành được xác định. Chúng tôi nói rằng nhà điều hành A là người tiêu cực của soi kèo bóng đá truoctran 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 là cũng là người phủ định của A. ví dụ, '<' và ' =' là một cặp tiêu cực cho hầu hết các kiểu dữ liệu. Người vận hành không bao giờ có thể hợp lệ là người tiêu cực của riêng nó.

Không giống như Cổ chức, một cặp soi kèo bóng đá truoctran tử Unary có thể hợp lệ được đánh dấu là những 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 cho các soi kèo bóng đá truoctran tử trợ cấp bên phải.

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 đối số là chính người vận hành, vì vậy cũng giống như với người giao dịch, Chỉ cần có tên soi kèo bóng đá truoctran tử cần được đưa ra trong mệnh đề tiêu cực.

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

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

Hạn chế

Điều khoản hạn chế, nếu được cung cấp, đặt tên cho một hạn chế Chức năng ước tính chọn lọc cho người vận hành (lưu ý rằng đây là Tên chức năng, không phải tên soi kèo bóng đá truoctran tử). Hạn chế các điều khoản chỉ làm Ý nghĩa cho các nhà khai thác nhị phân trả lại boolean. Ý tưởng đằng sau một Công cụ ước tính chọn lọc hạn chế là đoán phần nào của phần của Hàng trong bảng sẽ thỏa mãn điều kiện ở đâu của hình thức

Hằng số op trường
Đối với soi kèo bóng đá truoctran 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ề có bao nhiêu hàng sẽ được loại bỏ bởi nơi các điều khoản có hình thức này. (Cái gì xảy ra nếu hằng số ở bên trái, bạn có thể tự hỏi? Tốt, Đó là một trong những điều mà người giao đã dành cho ...)

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

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

Bạn có thể thường xuyên thoát khỏi việc sử dụng EQSEL hoặc Neqsel cho các nhà khai thác có độ chọn lọc rất cao hoặc rất thấp, ngay cả khi Họ không thực sự bình đẳng hoặc bất bình đẳng. Ví dụ, Các soi kèo bóng đá truoctran tử hình học gần đúng-bình đẳng sử dụng EQSEL trên 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ụng Scalarltsel và Scalargtsel để so sánh trên soi kèo bóng đá truoctran kiểu dữ liệu có một số phương tiện hợp lý để được chuyển đổi thành vô hướng số để so sánh phạm vi. Nếu có thể, hãy thêm Kiểu dữ liệu cho những người được hiểu bởi thói quen convert_to_scalar () trong SRC/phụ trợ/Utils/ADT/selfuncs.c. (Cuối cùng, thói quen này nên được thay thế bằng soi kèo bóng đá truoctran hàm per-datatype được xác định thông qua một cột của bảng PG_TYPE; Nhưng điều đó vẫn chưa xảy ra.) 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 hóa sẽ không tốt như họ có thể.

Có các chức năng chọn lọc bổ sung được thiết kế cho Các soi kèo bóng đá truoctran tử hình học trong SRC/Backend/Utils/ADT/Geo_Selfuncs.c: Vùng khu vực, vị trí, và contsel. Tại bài viết này, đây chỉ là sơ khai, 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 chúng) Dẫu sao thì.

Tham gia

Điều khoản tham gia, nếu được cung cấp, tên là một sự chọn lọc tham gia hàm ước tính cho người vận hành (lưu ý rằng đây là một chức năng Tên, không phải tên soi kèo bóng đá truoctran tử). Tham gia các điều khoản chỉ có ý nghĩa cho Các nhà khai thác nhị phân trả lại boolean. Ý tưởng đằng sau một sự tham gia Công cụ ước tính chọn lọc là đoán được phần nào của các hàng trong một Cặp bảng sẽ đáp ứng điều kiện ở đâu của hình thức

Bảng1.field1 OP Bảng2.field2
Đối với soi kèo bóng đá truoctran tử hiện tại. Như với điều khoản hạn chế, điều này giúp trình tối ưu hóa rất đáng kể bằng cách để nó tìm ra trong số một số chuỗi tham gia có thể có khả năng công việc ít nhất.

Như trước đây, chương này sẽ không cố gắng giải thích cách Viết hàm ước tính chọn lọc tham gia, nhưng sẽ chỉ đề xuất rằng bạn sử dụng một trong soi kèo bóng đá truoctran công cụ ước tính tiêu chuẩn nếu một áp dụng:

eqjoinsel cho =
        Neqjoinsel cho <
        Scalarltjoinsel cho <hoặc <hoặc <=
        scalargtjoinsel cho hoặc = =
        AreaSjoInsel cho soi kèo bóng đá truoctran so sánh dựa trên khu vực 2D
        PositionJoinsel cho soi kèo bóng đá truoctran so sánh dựa trên vị trí 2D
        contjoinsel cho soi kèo bóng đá truoctran so sánh dựa trên hộp đựng 2D

băm

mệnh đề băm, nếu có, nói với hệ thống rằng nó ổn khi Sử dụng phương thức tham gia băm cho tham gia dựa trên soi kèo bóng đá truoctran tử này. Băm chỉ có ý nghĩa đối với các nhà khai thác nhị phân trả lại boolean và trong Thực hành người vận hành tốt hơn là bình đẳng cho một số dữ liệu kiểu.

Giả định băm nhỏ tham gia là soi kèo bóng đá truoctran tử tham gia chỉ có thể trả về true cho các cặp giá trị trái và bên phải với cùng một mã băm. Nếu hai giá trị được đặt trong băm khác nhau Xô, sự tham gia sẽ không bao giờ so sánh chúng, ngầm Giả sử rằng kết quả của soi kèo bóng đá truoctran tử tham gia phải là sai. Vì vậy, nó Không bao giờ có ý nghĩa chỉ định băm cho các soi kèo bóng đá truoctran tử không đại diện cho sự bình đẳng.

Trên thực tế, bình đẳng logic cũng không đủ tốt; các nhà điều hành đã thể hiện sự bình đẳng bitwise thuần túy hơn, bởi vì hàm băm sẽ được tính soi kèo bóng đá truoctran trên biểu diễn bộ nhớ của Giá trị bất kể ý nghĩa của bit. Ví dụ, sự bình đẳng của Khoảng thời gian không bình đẳng bitwise; sự bình đẳng khoảng Người vận hành xem xét hai khoảng thời gian bằng nhau nếu chúng có cùng Thời lượng, cho dù điểm cuối của chúng có giống hệt nhau hay không. Điều này có nghĩa là sự tham gia bằng cách sử dụng "=" giữa các trường khoảng thời gian sẽ mang lại kết quả khác nhau nếu được thực hiện dưới dạng băm tham gia so với nếu được triển khai một cách khác, bởi vì một phần lớn các cặp nên kết hợp sẽ băm với các giá trị khác nhau và sẽ không bao giờ được so sánh bởi băm tham gia. Nhưng nếu trình tối ưu hóa chọn sử dụng một loại khác tham gia, tất cả các cặp mà soi kèo bóng đá truoctran tử bình đẳng nói là bằng nhau sẽ được tìm thấy. Chúng tôi không muốn loại không nhất quán đó, vì vậy chúng tôi không đánh dấu khoảng bình đẳng khoảng thời gian như băm.

Ngoài ra còn có những cách phụ thuộc vào máy trong đó một băm tham gia có thể Không làm được điều đúng đắn. Ví dụ: nếu kiểu dữ liệu của bạn là một cấu trúc trong đó có thể có soi kèo bóng đá truoctran bit pad không thú vị, nó không an toàn Để đánh dấu soi kèo bóng đá truoctran băm vận hành bình đẳng. (Trừ khi, có lẽ, bạn viết soi kèo bóng đá truoctran nhà khai thác khác của bạn để đảm bảo rằng soi kèo bóng đá truoctran bit không sử dụng luôn luôn số không.) Một ví dụ khác là soi kèo bóng đá truoctran kiểu dữ liệu float không an toàn cho băm tham gia. Trên soi kèo bóng đá truoctran máy đáp ứng tiêu chuẩn điểm nổi của IEEE, trừ 0 và cộng với số 0 là soi kèo bóng đá truoctran giá trị khác nhau (bit khác nhau soi kèo bóng đá truoctran mẫu) nhưng chúng được xác định để so sánh bằng nhau. Vì vậy, nếu nổi Bình đẳng đã được đánh dấu băm, trừ 0 và cộng với số 0 sẽ có lẽ không được khớp với một băm tham gia, nhưng chúng sẽ được kết hợp bởi bất kỳ quy trình tham gia nào khác.

điểm mấu chốt là bạn có lẽ chỉ nên sử dụng băm cho các soi kèo bóng đá truoctran tử bình đẳng (hoặc có thể) được thực hiện bởi memcmp ().

Sắp xếp1 và Sort2

Các điều khoản sắp xếp, nếu có, nói với hệ thống rằng nó là cho phép sử dụng phương thức nối hợp nhất để tham gia dựa trên soi kèo bóng đá truoctran tử hiện tại. Cả hai phải được chỉ định nếu một trong hai là. Hiện tại soi kèo bóng đá truoctran tử phải bình đẳng cho một số loại dữ liệu và Các mệnh đề Sort1 và Sort2 Tên soi kèo bóng đá truoctran tử thứ tự ('<' soi kèo bóng đá truoctran tử) cho các loại dữ liệu bên trái và bên phải tương ứng.

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 song song. Vì thế, cả hai loại dữ liệu phải có khả năng được đặt hàng đầy đủ và soi kèo bóng đá truoctran tử tham gia phải là một người 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à soi kèo bóng đá truoctran tử tham gia phải cư xử như bình đẳng. Nhưng không giống như Hashjoin, trong đó các loại dữ liệu bên trái và bên phải tốt hơn là giống nhau (hoặc ít nhất là bitwise tương đương), có thể hợp nhất 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ụ: soi kèo bóng đá truoctran tử bình đẳng Int2-Versus-INT4 là Mergejoinable. Chúng tôi chỉ cần các soi kèo bóng đá truoctran tử sắp xếp sẽ mang cả hai Kiểu dữ liệu thành một chuỗi tương thích logic.

Khi chỉ định các soi kèo bóng đá truoctran tử sắp xếp hợp nhất, soi kèo bóng đá truoctran tử hiện tại và soi kèo bóng đá truoctran tử hiện tại Cả hai nhà khai thác được tham chiếu phải trả lại Boolean; soi kèo bóng đá truoctran tử sắp xếp Phải có cả hai kiểu dữ liệu đầu vào bằng với người vận hành hiện tại bên trái Loại đối số và soi kèo bóng đá truoctran tử sắp xếp phải có cả đầu vào Các kiểu dữ liệu bằng với loại đối số bên phải của soi kèo bóng đá truoctran tử hiện tại. (BẰNG với người giao lưu và người phủ định, điều này có nghĩa là tên người vận hành là đủ để chỉ định soi kèo bóng đá truoctran tử và hệ thống có thể tạo ra Các mục nhập của người vận hành giả nếu bạn tình cờ xác định được sự bình đẳng soi kèo bóng đá truoctran tử trước những cái khác.)

Trong thực tế, bạn chỉ nên viết các mệnh đề sắp xếp cho một '=' soi kèo bóng đá truoctran tử và hai soi kèo bóng đá truoctran tử được tham chiếu phải luôn được đặt tên '<'. Cố gắng sử dụng hợp nhất tham gia với các nhà khai thác có tên là bất cứ điều gì khác sẽ dẫn đến sự nhầm lẫn vô vọng, vì những lý do chúng ta sẽ thấy trong một chốc lát.

Có những hạn chế bổ sung đối với các soi kèo bóng đá truoctran tử mà bạn đánh dấu Mergejoinable. Những hạn chế này hiện chưa được kiểm tra bởi Tạo soi kèo bóng đá truoctran tử, nhưng tham gia hợp nhất có thể thất bại trong thời gian chạy nếu có Không đúng:

  • 22091_22258

  • phải có '<' và '' Các soi kèo bóng đá truoctran tử đặt hàng có Các kiểu dữ liệu đầu vào bên trái và phải giống như MergeJoinable nhà điều hành chính nó. Các soi kèo bóng đá truoctran tử nàyphảiđược đặt tên '<' và '' '; Bạn không có bất kỳ lựa chọn nào trong vấn đề, vì không có điều khoản để chỉ định chúng rõ ràng. Lưu ý rằng nếu các loại dữ liệu bên trái và bên phải là khác nhau, cả hai soi kèo bóng đá truoctran tử này đều không giống như Sắp xếp soi kèo bóng đá truoctran tử. Nhưng họ đã đặt hàng tốt hơn các giá trị dữ liệu Có thể tương thích với các soi kèo bóng đá truoctran tử sắp xếp hoặc Mergejoin sẽ không công việc.