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

Tối ưu hóa truy vấn SQL bằng cách loại bỏ toán tử Sắp xếp trong kế hoạch Thực thi

Trước tiên, bạn nên xác minh rằng việc sắp xếp thực sự là một nút cổ chai về hiệu suất. Thời gian sắp xếp sẽ phụ thuộc vào số lượng phần tử được sắp xếp và số lượng cửa hàng cho một cửa hàng mẹ cụ thể có thể sẽ nhỏ. (Giả sử rằng toán tử sắp xếp được áp dụng sau khi áp dụng mệnh đề where).

Đó là một sự khái quát hóa quá mức. Thông thường, một toán tử sắp xếp có thể được di chuyển vào chỉ mục một cách đáng kể và nếu chỉ một vài hàng đầu tiên của tập kết quả được tìm nạp, có thể giảm đáng kể chi phí truy vấn, bởi vì cơ sở dữ liệu không còn phải tìm nạp tất cả các hàng phù hợp (và sắp xếp chúng tất cả) để tìm những cái đầu tiên, nhưng có thể đọc các bản ghi theo thứ tự tập hợp kết quả và dừng lại khi tìm thấy đủ các bản ghi.

Trong trường hợp của bạn, dường như bạn đang tìm nạp toàn bộ tập kết quả, vì vậy việc sắp xếp như vậy không có khả năng làm mọi thứ tồi tệ hơn nhiều (trừ khi tập kết quả là rất lớn). Ngoài ra, trong trường hợp của bạn, việc xây dựng một chỉ mục được sắp xếp hữu ích có thể không phải là chuyện nhỏ, vì mệnh đề where chứa dấu hoặc.

Bây giờ, nếu bạn vẫn muốn loại bỏ toán tử sắp xếp đó, bạn có thể thử:

SELECT [Phone]
FROM [dbo].[Store]
WHERE [ParentStoreId] = 10
AND [Type] in (0, 1)
ORDER BY [Phone]    

Ngoài ra, bạn có thể thử chỉ mục sau:

CREATE NONCLUSTERED INDEX IX_Store ON dbo.[Store]([ParentStoreId], [Phone], [Type])

để thử yêu cầu trình tối ưu hóa truy vấn thực hiện quét phạm vi chỉ mục trên ParentStoreId chỉ, sau đó quét tất cả các hàng phù hợp trong chỉ mục, xuất chúng nếu Type diêm. Tuy nhiên, điều này có thể gây ra nhiều I / O ổ đĩa hơn và do đó làm chậm truy vấn của bạn hơn là tăng tốc độ.

Chỉnh sửa :Phương án cuối cùng, bạn có thể sử dụng

SELECT [Phone]
FROM [dbo].[Store]
WHERE [ParentStoreId] = 10
AND [Type] = 0
ORDER BY [Phone]

UNION ALL

SELECT [Phone]
FROM [dbo].[Store]
WHERE [ParentStoreId] = 10
AND [Type] = 1
ORDER BY [Phone]

với

CREATE NONCLUSTERED INDEX IX_Store ON dbo.[Store]([ParentStoreId], [Type], [Phone])

và sắp xếp hai danh sách trên máy chủ ứng dụng, nơi bạn có thể hợp nhất (như trong sắp xếp hợp nhất) các danh sách được sắp xếp trước, do đó tránh được việc sắp xếp hoàn chỉnh. Nhưng đó thực sự là một tối ưu hóa vi mô, trong khi tăng tốc độ sắp xếp theo thứ tự cường độ, không có khả năng ảnh hưởng nhiều đến tổng thời gian thực thi của truy vấn, vì tôi mong đợi nút cổ chai là mạng và I / O đĩa, đặc biệt là do đĩa sẽ thực hiện nhiều truy cập ngẫu nhiên vì chỉ mục không được phân cụm.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để xem các tham số của procs hiện đang chạy trong SQL Server 2008

  2. Cách chuyển giá trị tên cột làm đối số SQL bằng cách sử dụng trình giữ chỗ

  3. Máy chủ sql sắp xếp dữ liệu của bạn như thế nào?

  4. Kết nối chuỗi SQL độc lập với cơ sở dữ liệu trong Rails

  5. Cách @@ MAX_CONNECTIONS hoạt động trong SQL Server