我有一个正在C#中执行的查询,该查询占用了太多时间:

string Query = "SELECT COUNT(HISTORYID) FROM HISTORY WHERE YEAR(CREATEDATE) = YEAR(GETDATE()) ";
Query += "AND MONTH(CREATEDATE) = MONTH(GETDATE()) AND DAY(CREATEDATE) = DAY(GETDATE()) AND USERID = '" + EmployeeID + "' ";
Query += "AND TYPE = '5'";


然后,我使用SqlCommand Command =新的SqlCommand(查询,连接)和SqlDataReader Reader = Command.ExecuteReader()来读取数据。从C#执行需要一分钟,但是在SSMS中要快得多。

我从Google搜索中看到,您可以使用CompiledQuery做某些事情,但是我是否仍可以使用内置的SQL函数YEAR,MONTH,DAY和GETDATE感到困惑。

如果有人可以向我展示如何使用内置函数创建和调用编译查询的示例,我将不胜感激!提前致谢。

最佳答案

即使您在CREATEDATE上有一个索引,它也不会使用它。您需要更改日期逻辑,以将GETDATE()日期时间设置为如下所示的日期:

WHERE CREATEDATE>=DATEADD(day,DATEDIFF(day,0,GETDATE()),0)
   AND CREATEDATE<DATEADD(day,DATEDIFF(day,0,GETDATE()),0)+1 ...


当您使用列上的函数时,例如:YEAR(CREATEDATE),会阻止使用索引。

10-08 00:24