Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Sql tĩnh so với động

Mã ví dụ của bạn rất đơn giản nên sẽ có một chút khác biệt, nhưng trong trường hợp đó, phiên bản tĩnh rất có thể sẽ thực thi tốt hơn.

Lý do chính để sử dụng SQL động cho hiệu suất là khi câu lệnh SQL có thể thay đổi theo một cách đáng kể - tức là bạn có thể thêm mã bổ sung vào mệnh đề WHERE trong thời gian chạy dựa trên trạng thái của hệ thống (hạn chế bởi truy vấn phụ trên Địa chỉ, nếu Địa chỉ đã nhập, v.v.).

Một lý do khác là đôi khi việc sử dụng biến Bind làm tham số có thể phản tác dụng.

Một ví dụ là nếu bạn có một cái gì đó giống như trường trạng thái, nơi dữ liệu không được phân phối đồng đều (nhưng được lập chỉ mục).

Hãy xem xét 3 câu lệnh sau, khi 95% dữ liệu được 'xử lý'

   SELECT col FROM table 
   WHERE status = 'U'-- unprocessed
   AND company = :company

   SELECT col FROM table 
   WHERE status = 'P' -- processed
   AND company = :company

   SELECT col FROM table
   WHERE status = :status
   AND company = :company

Trong phiên bản cuối cùng, Oracle sẽ chọn một phương án giải thích chung. Trong phiên bản đầu tiên, nó có thể quyết định kế hoạch tốt nhất là bắt đầu với chỉ mục về trạng thái (biết rằng các mục nhập 'Chưa được xử lý là một phần rất nhỏ trong tổng số).

Bạn có thể triển khai điều đó thông qua các câu lệnh tĩnh khác nhau, nhưng khi bạn có các câu lệnh phức tạp hơn chỉ thay đổi bằng một vài ký tự, thì SQL động có thể là một lựa chọn tốt hơn.

Nhược điểm

Mỗi lần lặp lại cùng một câu lệnh SQL động sẽ dẫn đến một phân tích cú pháp mềm, đây là một chi phí nhỏ so với một câu lệnh tĩnh, nhưng vẫn là một chi phí chung.

Mỗi câu lệnh sql MỚI (động hoặc tĩnh) cũng dẫn đến một khóa trên SGA (bộ nhớ dùng chung) và có thể dẫn đến việc đẩy các câu lệnh 'cũ' ra ngoài.

Một thiết kế hệ thống tồi, nhưng phổ biến là cho một người nào đó sử dụng SQL động để tạo các lựa chọn đơn giản chỉ khác nhau theo khóa - tức là

SELECT col FROM table WHERE id = 5
SELECT col FROM table WHERE id = 20
SELECT col FROM table WHERE id = 7

Các câu lệnh riêng lẻ sẽ nhanh chóng, nhưng hiệu suất tổng thể của hệ thống sẽ kém đi, vì nó đang giết chết các tài nguyên được chia sẻ.

Ngoài ra - việc mắc lỗi tại thời điểm biên dịch khó hơn nhiều với SQL động. Nếu sử dụng PL / SQL, điều này đang bỏ qua việc kiểm tra thời gian biên dịch tốt. Ngay cả khi sử dụng thứ gì đó như JDBC (nơi bạn chuyển tất cả mã cơ sở dữ liệu của mình thành chuỗi - ý kiến ​​hay!), Bạn có thể nhận được trình phân tích cú pháp trước để xác thực nội dung JDBC. SQL động =chỉ kiểm tra thời gian chạy.

Tổng chi phí

Tổng chi phí của việc thực thi ngay lập tức là nhỏ - nó tính bằng phần nghìn giây - tuy nhiên, nó có thể tăng lên nếu điều này nằm trong một vòng lặp / trên một phương thức được gọi một lần cho mỗi đối tượng / v.v. Tôi đã từng cải thiện tốc độ gấp 10 lần bằng cách thay thế động. SQL với SQL tĩnh được tạo. Tuy nhiên, điều này làm phức tạp mã và chỉ được thực hiện vì chúng tôi yêu cầu tốc độ.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Xóa các số 0 ở đầu khỏi nhà phát triển varchar sql

  2. oracle SQL cộng với cách kết thúc lệnh trong tệp SQL?

  3. Thời lượng của dữ liệu trong bảng Tạm thời chung?

  4. Hướng dẫn từng bước để cài đặt hộp ảo Oracle

  5. Tuyên bố Oracle