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

Tại sao UDF lại chậm hơn nhiều so với truy vấn con?

UDF là một hộp đen đối với trình tối ưu hóa truy vấn, do đó nó được thực thi cho mọi hàng. Bạn đang thực hiện con trỏ theo từng hàng. Đối với mỗi hàng trong một nội dung, hãy tìm kiếm một id ba lần trong một bảng khác. Điều này xảy ra khi bạn sử dụng UDF vô hướng hoặc đa câu lệnh (UDF nội dòng chỉ đơn giản là macro mở rộng sang truy vấn bên ngoài)

Một trong nhiều bài viết về vấn đề này là "Hàm vô hướng, nội tuyến và hiệu suất:Một tiêu đề giải trí cho một bài viết nhàm chán".

Các truy vấn phụ có thể được tối ưu hóa để tương quan và tránh các hoạt động theo từng hàng.

Điều bạn thực sự muốn là:

SELECT
   uc.id AS creator,
   uu.id AS updater,
   uo.id AS owner,
   a.[name]
FROM
    asset a
    JOIN
    user uc ON uc.user_pk = a.created_by
    JOIN
    user uu ON uu.user_pk = a.updated_by
    JOIN
    user uo ON uo.user_pk = a.owned_by

Cập nhật tháng 2 năm 2019

SQL Server 2019 bắt đầu khắc phục sự cố này.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ràng buộc SQL DEFAULT để Chèn cột có giá trị mặc định vào bảng SQL Server

  2. Mệnh đề WHERE có điều kiện trong SQL Server

  3. Làm thế nào để biết nếu một cột được tính toán là xác định trong SQL Server

  4. Chuyển bảng dưới dạng tham số vào UDF máy chủ sql

  5. Sử dụng câu lệnh IF ELSE dựa trên Count để thực hiện các câu lệnh Chèn khác nhau