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

Làm thế nào để cải thiện hiệu suất của hàm không xác định của một cột trong mệnh đề where hoặc tham gia?

Bên cạnh hàm không xác định, vấn đề tôi thấy là bạn thực hiện các phép tính trên một trường. Điều này (thường) làm cho bất kỳ chỉ mục nào trên trường không thể sử dụng được bởi truy vấn.

Đoạn thứ hai của liên kết này ( Mười lỗi lập trình SQL phổ biến (Hàm trên các cột được lập chỉ mục trong vị từ) ) cung cấp thông tin chi tiết hơn về thời điểm điều này xảy ra, cách tránh nó và đôi khi các trình tối ưu hóa có thể sử dụng các chỉ mục mặc dù sử dụng các chức năng.

Nói tóm lại, thay vì dựa vào các trình tối ưu hóa được cải tiến, bạn thường có thể thay đổi truy vấn bằng cách giữ nguyên trường (không thực hiện bất kỳ phép tính nào trên đó), nhưng thay vào đó thực hiện các phép tính (đảo ngược) đối với các giá trị khác. Trong trường hợp của bạn cho đến ngày hiện tại được cung cấp bởi GetDate() . Sau đó, truy vấn có thể sử dụng chỉ mục của trường table1.Date .

Vì vậy, bạn có thể sử dụng một cái gì đó như:

SELECT COUNT(*) 
FROM table1
WHERE table1.Date
      BETWEEN
             /* First Day of Current Month */
          AND 
             /* Last Day of Current Month */

Và bạn chỉ cần tìm các hàm giúp bạn có được ngày đầu tiên và ngày cuối cùng của tháng hiện tại.

Bài đăng trên blog này có thể giúp bạn: sql-server-query-to-find-first-and-last-day-current-month /

Tuyệt vời hơn nữa, câu hỏi / câu trả lời StackOverflow này: simple-way-to-create-a-date-that-is-the-first day-of-the-month-given -a-ngày khác

Tôi sẽ phải kiểm tra nhưng tôi nghĩ rằng sự thay đổi nhỏ này của những điều trên sẽ làm được:

SELECT COUNT(*) 
FROM table1
WHERE table1.Date 
      >=      /* First Day of Current Month */
        DATEADD(mm, DATEDIFF(mm, 0, GetDate() ), 0) 
  AND table1.Date 
      <       /* First Day of Next Month */
        DATEADD(mm, 1 + DATEDIFF(mm, 0, GetDate() ), 0) 


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server 2008 so sánh hai bảng trong cùng một cơ sở dữ liệu và cột nhận được thay đổi

  2. sql server 2008 - tìm bảng nào chứa văn bản cụ thể

  3. Thay dấu phẩy giữa dấu ngoặc kép bằng dấu cách

  4. Làm cách nào để xóa bằng INNER JOIN với SQL Server?

  5. Lặp qua từng giá trị đến số seq