Ngôn ngữ thủ tục PostgreSQL - sự khác biệt giữa PL / pgSQL và SQL


20

Ai đó có thể vui lòng tóm tắt sự khác biệt giữa:

http://www.postgresql.org/docs/9.1/static/xfunc-sql.html

http://www.postgresql.org/docs/9.1/static/plpgsql.html

?

Ý chính:

  • khác biệt mang thai
  • đưa ra một gia đình có vấn đề, thuận tiện sử dụng
  • vấn đề chính trị

1
Thứ nhất, các hàm SQL (còn gọi là ngôn ngữ truy vấn) không liên quan đến bất kỳ ngôn ngữ thủ tục nào của PostgreQuery. Thứ hai, bạn đã tìm thấy nguồn tốt nhất nơi người ta có thể tìm thấy câu trả lời cho câu hỏi của bạn (ngoại trừ câu hỏi cuối cùng - chính xác thì bạn nghĩ gì về 'các vấn đề chính trị'?)
dezso

Tôi yêu cầu tóm tắt tất cả các vấn đề chính, không nhất thiết phải sử dụng tài liệu mà tôi đã dán, mà còn sử dụng các ấn tượng cá nhân. Những liên kết đó là để đảm bảo mọi người hiểu câu hỏi đó là gì.
Gismo Ranas

Đừng coi đó là một cuộc tấn công, nhưng một khi bạn đã đọc những điều đó bạn có thể tự tóm tắt nó :) Nếu không, câu hỏi của bạn hơi rộng, nhưng hãy dành một chút thời gian tôi sẽ cố gắng thu thập một vài suy nghĩ.
dezso

1
Đừng bỏ bê các ngôn ngữ thủ tục khác. Đặc biệt PL / Perl cực kỳ hữu ích cho các khu vực mà PL / PGQuery quá hạn chế; PL / Pythonu thực hiện công việc nếu bạn thích Python nhưng không cung cấp mô hình bảo mật như PL / Perl. Ngoài ra còn có PL / V8 (JavaScript) như một tiện ích bổ sung.
Craig Ringer

1
Xin chào cataldo - Tôi chỉ muốn chào mừng bạn đến với trang web vì đây là câu hỏi đầu tiên của bạn ở đây. Cảm ơn cho bài viết và tôi hy vọng bạn dính xung quanh.
Jack Douglas

Câu trả lời:


27

Các hàm PL / PGQuery và SQL đơn giản đều là một phần của bộ công cụ lớn hơn và nên được xem trong ngữ cảnh đó. Tôi có xu hướng nghĩ về nó theo thang đo sức mạnh tăng dần phù hợp với độ phức tạp và chi phí tăng dần, trong đó bạn nên sử dụng công cụ đơn giản nhất sẽ làm tốt công việc:

  • Sử dụng chế độ xem nếu có thể
  • Trường hợp một khung nhìn không phù hợp, hãy sử dụng hàm SQL
  • Khi một hàm SQL không phù hợp, hãy sử dụng PL / PGQuery.
  • Trong trường hợp PL / PGQuery quá hạn chế hoặc không đủ biểu cảm, hãy sử dụng PL / Perl, PL / Python, PL / V8, PL / Java hoặc bất cứ điều gì bạn thích
  • ... Và khi không có PL sẽ thực hiện công việc, hãy sử dụng một chương trình bên ngoài và có thể LISTENNOTIFYđể nói chuyện với nó.

Rất thường xuyên một khung nhìn là đủ khi bạn nghĩ rằng một chức năng là cần thiết. Ngay cả khi nó cực kỳ đắt đối SELECTvới toàn bộ chế độ xem, WHEREcác mệnh đề trong truy vấn tham chiếu chế độ xem thường được đẩy xuống chế độ xem và có thể dẫn đến các gói truy vấn rất khác nhau. Tôi thường có những cải tiến hiệu suất lớn từ việc chuyển đổi các hàm SQL thành dạng xem.

Thời gian chính bạn thấy bạn không thể sử dụng chế độ xem và nên xem xét hàm SQL là khi:

  • Các tham số không thể được biểu thị dưới dạng WHEREcác mệnh đề đơn giản là cần thiết, như một tham số trong WITHbiểu thức
  • Bạn muốn có một rào cản bảo mật thông qua một SECURITY DEFINERchức năng và các security_barrierkhung nhìn trong PostgreSQL 9.2 trở lên không đủ cho nhu cầu của bạn;
  • Bạn cần các tham số không bị đẩy xuống các mệnh đề phụ của chế độ xem bởi trình tối ưu hóa và muốn kiểm soát trực tiếp hơn; hoặc là
  • Có rất nhiều thông số hoặc có rất nhiều sự lặp lại của các thông số, vì vậy việc viết truy vấn dưới dạng xem là không thực tế.

Đối với hầu hết các tác vụ đó, một hàm SQL đơn giản hoạt động tốt và thường dễ đọc hơn PL / PGQuery. Các hàm SQL được khai báo STABLEhoặc IMMUTABLE(và cũng không được khai báo STRICThoặc SECURITY DEFINER) cũng có thể được nội tuyến trong câu lệnh gọi. Điều đó giúp loại bỏ chức năng gọi qua chức năng và đôi khi cũng có thể mang lại lợi ích hiệu năng rất lớn khi điều kiện WHERE trong chức năng gọi được trình tối ưu hóa đưa vào chức năng SQL. Sử dụng các hàm SQL bất cứ khi nào chúng đủ cho nhiệm vụ.

Các hàm SQL thời gian chính sẽ không thực hiện công việc là khi bạn cần nhiều logic. Nếu / sau đó / các hoạt động khác mà bạn không thể biểu thị dưới dạng các CASEcâu lệnh, sử dụng lại nhiều kết quả được tính toán, xây dựng các giá trị từ khối, xử lý lỗi, v.v. PL / PGQuery sẽ có ích. Chọn PL / PGQuery khi bạn không thể sử dụng các hàm SQL hoặc chúng không phù hợp, như:

  • SQL động và DDL động thông qua EXECUTEcâu lệnh
  • Khi bạn muốn RAISElỗi / cảnh báo cho nhật ký hoặc máy khách
  • Khi bạn cần xử lý ngoại lệ - bạn có thể bẫy và xử lý lỗi với EXCEPTIONcác khối thay vì toàn bộ giao dịch bị chấm dứt do lỗi
  • Logic điều kiện phức tạp không phù hợp CASE ... WHENlắm
  • Rất nhiều lần sử dụng lại các giá trị được tính toán mà bạn không thể phù hợp với WITHvà CTE
  • Xây dựng hồ sơ năng động
  • Bạn cần thực hiện một hành động sau khi tạo tập kết quả

Với các biểu thức bảng chung (CTE), đặc biệt là các CTE có thể ghi và WITH RECURSIVEtôi thấy tôi sử dụng PL / PGQuery ít hơn nhiều so với trước đây vì SQL biểu cảm và mạnh mẽ hơn nhiều. Tôi sử dụng các khung nhìn và các hàm SQL đơn giản hơn rất nhiều bây giờ. Điều đáng ghi nhớ là các hàm SQL đơn giản có thể chứa nhiều hơn một câu lệnh; câu lệnh cuối cùng là kết quả của hàm.


Nói rất hay! (một +1 bổ sung mặc dù ảo để đề cập đến các
CTE có

Câu trả lời này cũng giải thích tại sao một số chức năng cần hàng rào tối ưu hóa .
Eonil

8

plpgsqllà một ngôn ngữ thủ tục chính thức, với các biến, các cấu trúc lặp, v.v ... Một SQLhàm chỉ đơn giản là một truy vấn con. Một hàm SQL, nếu nó được khai báo STABLEhoặc IMMUTABLEkhông được khai báo STRICT, thường có thể được nội tuyến vào truy vấn gọi, như thể nó được viết ra trên mỗi tham chiếu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.