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

nếu khác trong CTE?

thử:

;with CTE_AorB
(
    select * from table_A WHERE (condition true)
    union all
    select * from table_B WHERE NOT (condition true)
),
CTE_C as
(
   select * from CTE_AorB // processing is removed
)

chìa khóa với điều kiện tìm kiếm động là đảm bảo một chỉ mục được sử dụng, Dưới đây là một bài viết rất toàn diện về cách xử lý chủ đề này:

Điều kiện tìm kiếm động trong T-SQL của Erland Sommarskog

nó bao gồm tất cả các vấn đề và phương pháp cố gắng viết truy vấn với nhiều điều kiện tìm kiếm tùy chọn. Điều chính bạn cần quan tâm không phải là sự trùng lặp mã, mà là việc sử dụng một chỉ mục. Nếu truy vấn của bạn không thể sử dụng một chỉ mục, nó sẽ hoạt động kém. Có một số kỹ thuật có thể được sử dụng, có thể có hoặc không cho phép sử dụng một chỉ mục.

đây là mục lục:

  Introduction
      The Case Study: Searching Orders
      The Northgale Database
   Dynamic SQL
      Introduction
      Using sp_executesql
      Using the CLR
      Using EXEC()
      When Caching Is Not Really What You Want
   Static SQL
      Introduction
      x = @x OR @x IS NULL
      Using IF statements
      Umachandar's Bag of Tricks
      Using Temp Tables
      x = @x AND @x IS NOT NULL
      Handling Complex Conditions
   Hybrid Solutions – Using both Static and Dynamic SQL
      Using Views
      Using Inline Table Functions
   Conclusion
   Feedback and Acknowledgements
   Revision History

nếu bạn đang sử dụng phiên bản SQL Server 2008 thích hợp, có một kỹ thuật bổ sung có thể được sử dụng, hãy xem: Điều kiện Tìm kiếm Động trong Phiên bản T-SQL cho SQL 2008 (SP1 CU5 trở lên)

Nếu bạn đang sử dụng phiên bản SQL Server 2008 thích hợp đó, bạn chỉ có thể thêm OPTION (RECOMPILE) cho truy vấn và giá trị của biến cục bộ tại thời điểm chạy được sử dụng để tối ưu hóa.

Hãy xem xét điều này, OPTION (RECOMPILE) sẽ lấy mã này (nơi không thể sử dụng chỉ mục nào với mớ OR này s):

WHERE
    (@search1 IS NULL or [email protected])
    AND (@search2 IS NULL or [email protected])
    AND (@search3 IS NULL or [email protected])

và tối ưu hóa nó tại thời điểm chạy (miễn là chỉ @ Search2 được chuyển vào với một giá trị):

WHERE
    [email protected]

và một chỉ mục có thể được sử dụng (nếu bạn có một chỉ mục được xác định trên Cột 2)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tối ưu hóa truy vấn SQL - Cách xác định khi nào và nếu cần

  2. Cách thả cơ sở dữ liệu bằng cách sử dụng TSQL và GUI - Hướng dẫn sử dụng SQL Server / TSQL Phần 25

  3. Mọi Bảng Người dùng có nên có Chỉ mục được phân cụm không?

  4. Lọc câu lệnh SELECT theo thời gian trong ngày

  5. Bỏ cơ sở dữ liệu SQL Server thông qua C #