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

Tại sao truy vấn chậm lại đáng kể nếu trong mệnh đề WHERE, hằng số được thay thế bằng một tham số (có cùng giá trị)?

Như Martin đã đề xuất trong một bình luận dưới câu hỏi, vấn đề là máy chủ SQL không đẩy đúng vị ngữ từ mệnh đề WHERE - hãy xem liên kết trong bình luận của anh ấy.

Tôi đã kết thúc với việc tạo một hàm có giá trị bảng do người dùng xác định và sử dụng nó với toán tử ÁP DỤNG CHÉO để tạo chế độ xem.

Hãy xem giải pháp của chính nó.

Hàm có giá trị trong bảng do người dùng xác định

CREATE FUNCTION [dbo].[TestFunction] (@Id INT)
RETURNS TABLE 
AS
RETURN 
(
    WITH
    Hierarchy (Id,  ParentId, Data, Depth)
    AS(
    SELECT Id, ParentId, NULL AS Data, 0 AS Depth FROM Test Where Id = @Id
    UNION ALL
    SELECT h.Id, t.ParentId, COALESCE(h.Data, t.Data), Depth + 1 AS Depth
        FROM Hierarchy h
            INNER JOIN Test t ON t.Id = h.ParentId
    )
    SELECT * FROM Hierarchy
)

Xem

CREATE VIEW [dbo].[TestView]
AS
SELECT t.Id, t.ParentId, f.Data, f.Depth
FROM
    Test AS t
    CROSS APPLY TestFunction(Id) as f

Truy vấn với hằng số

SELECT * FROM TestView WHERE Id = 69

Truy vấn với tham số

DECLARE @Id INT
SELECT @Id = 69
SELECT * FROM TestView WHERE Id = @Id

Truy vấn với parmater thực thi về cơ bản nhanh như truy vấn với hằng số.

Cảm ơn Martin và những người khác nữa!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Máy chủ sql sắp xếp dữ liệu của bạn như thế nào?

  2. Chia phạm vi ngày thành một hàng mỗi tháng trong máy chủ sql

  3. SQL RANK () so với ROW_NUMBER ()

  4. Làm cách nào để loại trừ Ngày cuối tuần trong truy vấn SQL Server?

  5. Cách đổi tên Ràng buộc khóa chính cho nhiều bảng trong cơ sở dữ liệu SQL Server - Hướng dẫn sử dụng SQL Server / TSQL Phần 64