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

Cách chuyển đổi thực thi Row by row sang cách tiếp cận dựa trên SET trong SQL

Cho đến khi cấu trúc bảng và dữ liệu mẫu kết quả mong đợi không được cung cấp, dưới đây là một số điều nhanh chóng mà tôi thấy có thể được cải thiện (một số trong số đó đã được đề cập bởi những người khác ở trên):

  1. Vòng lặp WHILE cũng là một con trỏ. Vì vậy, việc thay đổi thành vòng lặp while sẽ không giúp mọi thứ nhanh hơn.
  2. Sử dụng con trỏ LOCAL FAST_FORWARD trừ khi bạn cần theo dõi lại bản ghi. Điều này sẽ giúp quá trình thực thi nhanh hơn nhiều.
  3. Có, tôi đồng ý rằng có cách tiếp cận dựa trên SET sẽ là nhanh nhất trong hầu hết các trường hợp, tuy nhiên nếu bạn phải lưu trữ tập kết quả trung gian ở đâu đó, tôi khuyên bạn nên sử dụng bảng tạm thay vì biến bảng. Bảng tạm thời là 'ít ác hơn' giữa 2 tùy chọn này. Dưới đây là một số lý do tại sao bạn nên cố gắng tránh sử dụng một biến bảng:

    • Vì SQL Server sẽ không có bất kỳ thống kê trước nào về biến bảng trong quá trình xây dựng trên Kế hoạch thực thi, nó sẽ luôn xem xét rằng chỉ một bản ghi sẽ được biến bảng trả về trong quá trình xây dựng kế hoạch thực thi. Và theo đó, Storage Engine sẽ chỉ gán càng nhiều bộ nhớ RAM để thực hiện truy vấn. Nhưng trên thực tế, có thể có hàng triệu bản ghi mà biến bảng có thể giữ trong quá trình thực thi. Nếu điều đó xảy ra, SQL Server sẽ buộc phải đổ dữ liệu vào đĩa cứng trong quá trình thực thi (và bạn sẽ thấy nhiều PAGEIOLATCH trong sys.dm_os_wait_stats) làm cho các truy vấn chậm hơn.
    • Một cách để loại bỏ vấn đề trên là cung cấp gợi ý TÙY CHỌN cấp câu lệnh (RECOMPILE) ở cuối mỗi truy vấn trong đó giá trị bảng được sử dụng. Điều này sẽ buộc SQL Server phải xây dựng Kế hoạch thực thi của các truy vấn đó mỗi lần trong thời gian chạy và vấn đề cấp phát bộ nhớ ít hơn có thể tránh được. Tuy nhiên, nhược điểm của điều này là:SQL Server sẽ không còn có thể tận dụng kế hoạch thực thi đã được lưu trong bộ nhớ cache cho thủ tục được lưu trữ đó và sẽ yêu cầu biên dịch lại mọi lúc, điều này sẽ làm giảm hiệu suất ở một mức độ nào đó. Vì vậy, trừ khi bạn biết rằng dữ liệu trong bảng bên dưới thay đổi thường xuyên hoặc bản thân quy trình được lưu trữ không thường xuyên được thực thi, thì cách tiếp cận này không được Microsoft MVPs khuyến nghị.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thủ tục mong đợi tham số không được cung cấp

  2. Tôi đang cố gắng tạo một thủ tục được lưu trữ để tạo thông tin đăng nhập và người dùng cơ sở dữ liệu?

  3. Bạn có đang sử dụng đúng công cụ giám sát hiệu suất cơ sở dữ liệu không?

  4. Đặt đối chiếu cơ sở dữ liệu trong Entity Framework Code-First Initializer

  5. Chuyển đổi SQL từ varchar thành uniqueidentifier không thành công trong chế độ xem