编译Linq查询与建立

我有一个查询,我在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 = new SqlCommand(Query,Connection)和SqlDataReader Reader = Command.ExecuteReader()读取数据。 这从C#执行需要一分多钟,但在SSMS中更快。

我从谷歌搜索中看到,你可以用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) ,可防止使用索引。


编译查询不会在这里帮助你:编译时间不可能是一分钟内的重要部分。 我假设你已经有了一个索引,包括一些或所有的(createdate, userid, type) 。 如果不是,请添加索引。

一个可能的问题是,您使用函数将阻止正在使用的创建的索引,从而导致索引扫描或表扫描变慢。 重写你的查询来改用BETWEEN,它应该能够使用索引。 这会让它变得更快。

另外,在查询中使用EXPLAIN来查看它正在使用的索引(如果有的话)。 在这里发布信息。


Linq to Sql并不是解决你的所有查询性能问题的神奇工具。 实际上它会产生类似的查询。 相反,请分析您的查询以找出缓慢的位置,并通过调整查询和/或调整索引来解决这些问题。

另外,我必须指出,这是一个不好的做法:

AND USERID = '" + EmployeeID + "' "

相反,尝试使用参数化查询。 这意味着您可以使用:

AND USERID=@UserId

然后,在执行该命令之前设置该参数(假设NVARCHAR(255),请根据需要调整):

commmand.Parameters.Add("@UserId", SqlDbType.NVarChar, 255).Value = EmployeeID;
链接地址: http://www.djcxy.com/p/60279.html

上一篇: Compiled Linq Queries with Built

下一篇: Speed up LINQ inserts