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

SELECT TOP chậm, bất kể ORDER BY

Và do đó, bắt đầu trò chơi đáng tiếc là "cố gắng vượt qua trình tối ưu hóa (vì nó không phải lúc nào cũng biết tốt nhất)".

Bạn có thể thử đặt các phần lọc vào một truy vấn con hoặc CTE:

SELECT TOP 30 *
FROM
   (SELECT *
   FROM myview, foo, bar 
   WHERE shared=1 AND [joins and other stuff]) t
ORDER BY sortcode;

Điều này có thể đủ để buộc nó phải lọc trước (nhưng trình tối ưu hóa trở nên "thông minh hơn" với mỗi bản phát hành và đôi khi có thể nhìn thấu những trò tai quái như vậy). Hoặc bạn có thể phải đi xa đến mức đặt mã này vào một UDF . Nếu bạn viết UDF dưới dạng một hàm có giá trị bảng đa câu, với bộ lọc bên trong, sau đó truy vấn UDF đó bằng TOP x của bạn / ORDER BY , bạn đã bắt buộc khá tốt thứ tự truy vấn (vì SQL Server hiện không thể tối ưu hóa xung quanh các UDF đa dạng).

Tất nhiên, suy nghĩ về nó, giới thiệu UDF chỉ là một cách để che giấu những gì chúng ta đang thực sự làm - tạo một bảng tạm thời, sử dụng một truy vấn để điền nó (dựa trên bộ lọc WHERE), sau đó truy vấn khác để tìm TOP x từ bảng tạm thời.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cảnh báo tác nhân SQL Server

  2. Làm thế nào để chọn tất cả các bản ghi từ một bảng mà không tồn tại trong một bảng khác?

  3. Cách thay đổi một cột từ Null thành Not Null trong SQL Server

  4. SQL Server sử dụng CPU cao khi tìm kiếm bên trong chuỗi nvarchar

  5. Cách lọc Hàng có Giá trị Null trong Câu lệnh Chọn trong SQL Server - Hướng dẫn sử dụng SQL Server / TSQL Phần 110