2008-12-04 26 views
10

Tôi ngày càng thất vọng với những hạn chế và độ dài cần thiết để thực sự thực hiện một số logic nghiệp vụ với các thủ tục được lưu trữ, sử dụng các ngôn ngữ như Transact-SQL hoặc PL/SQL. Tôi rất thích chuyển đổi một số cơ sở dữ liệu hiện tại sang Oracle và tận dụng sự hỗ trợ của nó đối với các thủ tục lưu sẵn Java, nhưng tùy chọn này hiện không có sẵn.Ngôn ngữ tốt hơn SQL cho các thủ tục lưu sẵn

Bạn sẽ đề xuất giải pháp thay thế nào trong cách cơ sở dữ liệu hỗ trợ các thủ tục được lưu trữ bằng các ngôn ngữ khác?

+0

@Kev Vui lòng mở câu hỏi này. – PHPst

Trả lời

27

Có một số trở ngại về kiến ​​trúc để có nhiều ngôn ngữ truy vấn thông minh hơn trong trình quản lý cơ sở dữ liệu. Cái chính là trình tối ưu hóa truy vấn. Một trong những ràng buộc thiết kế trên SQL là nó chỉ có thể sử dụng các cấu trúc có thể truy cập được với trình tối ưu hóa truy vấn. Điều này có nghĩa là ngôn ngữ và khả năng của nó được kết hợp chặt chẽ với khả năng của công cụ thực thi truy vấn và trình tối ưu hóa kế hoạch truy vấn.

Ràng buộc thiết kế chính khác là tính chất cơ học của hệ thống cơ sở dữ liệu - lập trình cơ sở dữ liệu gần như là duy nhất ở chỗ nó có thành phần cơ học. Hiệu suất truy vấn bị hạn chế bởi các ràng buộc cơ học của đầu đĩa tìm kiếm và độ trễ quay (thời gian chờ trước khi dữ liệu bạn muốn đến dưới đầu).

Điều này có hiệu quả ngăn cản nhiều trừu tượng thông minh có thể làm cho SQL mạnh hơn hoặc dễ làm việc hơn. Nhiều hệ thống quản lý cơ sở dữ liệu bổ sung SQL với các lựa chọn thay thế thủ tục có thể được sử dụng để tạo kịch bản lệnh. Tuy nhiên, chúng tương tác với DBMS bằng cách thực hiện một loạt các truy vấn SQL được xử lý bởi trình tối ưu hóa riêng lẻ. Một số ngôn ngữ thuộc loại này được vận chuyển với các nền tảng DBMS khác nhau bao gồm:

  • Oracle'sPL/SQLembedded Java. PL/SQL là thực sự dựa trên Ada - nó là khá 'trường học cũ' theo tiêu chuẩn hiện đại và có cơ sở mã kế thừa mà nó phải duy trì tương thích ngược. Không nhất thiết phải là môi trường lập trình dễ chịu nhất nhưng nó có cấu trúc cho các cơ sở như song song và hệ thống loại linh hoạt hợp lý . Một trong những chỉ trích chính của các thủ tục lưu trữ Java trên Oracle là bạn đang thanh toán cho cấp phép dựa trên dung lượng của Oracle trên CPU bạn đang chạy của JVM.

  • Máy chủ SQL CLR Integration. Hơi giống với Java Thủ tục lưu sẵn của Oracle, điều này cho phép CLR mô-đun được biên dịch từ C# (hoặc bất kỳ phần nào.net ngôn ngữ) được tải vào một phiên bản SQL Server và được thực hiện theo cùng cách như các thủ tục được lưu trữ. SQL Server cũng có API kiểu PostgreSQL để tạo chức năng tổng hợp tùy chỉnh thông qua tích hợp CLR và khác móc cho cơ sở mã SQL/CLR hỗn hợp.

  • PostgreSQL thực sự là hệ thống nơi ngôn ngữ phía sau tích hợp ban đầu là được phát triển. Hệ thống xuất một số native C API với các tiện ích cho chức năng tổng hợp tùy chỉnh, lưu trữ động cơ, tiện ích mở rộng thủ tục và các chức năng khác . The language interfaces được dựa trên API này và bao gồm: PL/pgSQL (một ngôn ngữ bespoke tương tự để PL/SQL), Python, PerlTcl.

    này đã làm cho nó vào dòng chính qua Illustra, một phiên bản thương mại hóa của Postgres, sau đó được mua lại bởi Informix (mà sau đó đã được mua lại bởi IBM). Các tính năng chính được kết hợp thành Informix On-Line, là vẫn được bán bởi IBM.

Một hạn chế quan trọng của các thứ tiếng là tương tác hạn chế của họ với các truy vấn optimizer (mặc dù các API C cho PostgreSQL không có hỗ trợ cho việc này). Tham gia trong kế hoạch truy vấn dưới dạng công dân hạng nhất yêu cầu người tối ưu hóa truy vấn có thể xem xét một cách hợp lý các tài nguyên mà hành động của bạn sẽ thực hiện. Trong thực tế, loại tương tác với trình tối ưu hóa truy vấn này chủ yếu hữu ích cho việc triển khai các công cụ lưu trữ.

Mức độ đào vào công cụ lưu trữ là (a) phần nào bí truyền nếu chức năng có sẵn (vì vậy hầu hết mọi người sẽ không có kỹ năng để làm điều này) và (b) có thể coi là rắc rối hơn là chỉ viết truy vấn trong SQL. Các hạn chế của trình tối ưu hóa truy vấn có nghĩa là bạn có thể sẽ không bao giờ có được mức trừu tượng trong SQL mà bạn có thể nhận được từ (nói) Python hoặc thậm chí C# hoặc Java.

Đường dẫn kháng ít nhất cho các truy vấn hiệu quả có thể là ghi truy vấn trong SQL bằng một số keo thủ tục theo một trong các ngôn ngữ khác. Trong một số trường hợp, tính toán thực sự cho vay chính nó theo cách tiếp cận thủ tục.

Điều này có thể trở thành một rắc rối và dẫn đến các cơ quan lớn của mã SQL soạn sẵn. Các tùy chọn thực sự duy nhất cho điều này là các hệ thống tạo mã SQL hoặc mã hóa bằng tay. Một ví dụ nhỏ về việc tạo mã là chức năng CRUD được cung cấp bởi các khung công tác nơi mà SQL này được tạo ra từ siêu dữ liệu. Một ví dụ phức tạp hơn có thể được nhìn thấy trong các công cụ ETL chẳng hạn như Oracle Warehouse Builder hoặc Wherescape Red hoạt động bằng cách tạo ra các bản vẽ tuyệt vời của mã thủ tục được lưu trữ từ mô hình.

Tôi thấy mình xây dựng các hệ thống tạo mã theo loại này hay cách khác trên cơ sở bán thường xuyên vì lý do chính xác này. Bất kỳ hệ thống templating sẽ làm cho điều này - Tôi đã có số dặm khá tốt từ CherryTemplate nhưng có rất nhiều mặt hàng như vậy xung quanh. Code Generation in Action là một cuốn sách khá hay về chủ đề này - tác giả sử dụng hệ thống dựa trên ruby ​​có tên đã trốn thoát tôi.

Chỉnh sửa: Nếu bạn nhìn vào 'Hiển thị kế hoạch thực hiện ước tính' cho một khối mã thủ tục, bạn sẽ nhận thấy rằng mỗi câu lệnh đều có kế hoạch truy vấn riêng. Thuật toán tối ưu hóa truy vấn chỉ có thể làm việc trên một câu lệnh SQL duy nhất, vì vậy một thủ tục sẽ có một khu rừng của các kế hoạch truy vấn. Bởi vì mã thủ tục có thể có 'side-effects', bạn không thể sử dụng type of algorithms được sử dụng trong tối ưu hóa truy vấn để giải thích về mã. Điều này có nghĩa là một trình tối ưu hóa truy vấn không thể tối ưu hóa toàn bộ một khối mã thủ tục. Nó chỉ có thể tối ưu hóa các câu lệnh SQL riêng lẻ.

+1

Wow cho nội dung! Cảm ơn tất cả các liên kết/con trỏ. – Learning

+0

Tôi đồng ý - +1 cho nội dung tuyệt vời. Tôi vẫn còn bối rối vào một thời điểm. Hầu hết các thủ tục được lưu trữ của tôi có nhiều câu lệnh SELECT, INSERT, UPDATE và/hoặc DELETE. Tôi nghĩ rằng tối ưu hóa truy vấn sẽ gặp khó khăn ở mức tốt nhất, và không phải là một mối quan tâm đáng kể trong việc lựa chọn ngôn ngữ. –

+0

Xem bản chỉnh sửa - trình tối ưu hóa tạo một loạt các kế hoạch cho các câu lệnh chọn, chèn, cập nhật và xóa riêng lẻ. – ConcernedOfTunbridgeWells

4

PostgreSQL có hỗ trợ cho nhiều quy trình ngôn ngữ kịch bản. Chính thức Perl, Python và Tcl. Là người bổ sung, PHP, Ruby, Java và có thể là nhiều người khác (chỉ Google cho pl < languagename>) có thể hoặc có thể không ở trong tình trạng hoạt động như bây giờ.

Ồ, và cả SQL Server 2005 trở đi đều hỗ trợ cho CLR stored procedures, nơi bạn có thể sử dụng ngôn ngữ .NET.

2

Oracle hỗ trợ các thủ tục lưu sẵn CLR để bạn có thể viết các procs được lưu trữ bằng bất kỳ ngôn ngữ .NET nào như C#, VB.NET hoặc IronPython. Điều này chỉ hoạt động khi máy chủ cơ sở dữ liệu chạy trên máy Windows. Bạn không thể làm điều đó khi cơ sở dữ liệu chạy trên Linux hoặc Unix.

1

DB2 cho Z/OS là cơ sở dữ liệu hỗ trợ hầu hết các ngôn ngữ như tôi biết. Nó hỗ trợ COBOL, C/C++, JAVA như là thủ tục lưu trữ, Nó tất nhiên cũng hỗ trợ thủ tục SQL.

1

Ngoài ra còn có một số hỗ trợ để viết các thủ tục được lưu trữ Oracle in Perl.

Các vấn đề liên quan