SQL优化未知提示和IQueryable

时间:2014-01-29 16:26:34

标签: c# sql linq

我有一段使用IQueryable根据日期选择的代码。这里的sql性能导致超时。如果这是直接的SQL,我会使用(OPTIMIZE FOR(@date UNKNOWN)。但是,使用

DateTime now = DateTime.UTC Now;

var results = from item in items.Find()
where item.startDate <= now
where item.endDate > now 
select item;

return results;

有没有一个好方法来添加这个提示?或者我应该将其作为存储过程移动到数据库?

2 个答案:

答案 0 :(得分:1)

我没有看到提示如何帮助您提高性能。您应首先获得正确的查询,并在SQL事件探查器上查看由Entity Framework生成的SQL。如果您的数据库按我预期的那样设计,则以下代码段应该会提供不错的性能。

var results = item.Where(x=> x.startDate <= now && x.endDate > now)

在sql server上查看关于索引提示的相关问题,总结一下,不能和linq一起使用。

How do I get LinqToSql to pass “index hints” to sql server?

答案 1 :(得分:1)

假设:Find()返回IQueryablestartDateendDate上有索引

我不知道向Linq添加查询提示的方法,因为它们是提供者特定的,但您可以尝试一些事情:

使用&&代替多个where子句:

DateTime now = DateTime.UTCNow;
var results = from item in items.Find()
              where item.startDate <= now 
                 && item.endDate > now 
              select item;

通过ExecuteStoreQuery执行直接SQL:

string sql = @"SELECT * FORM Items " + 
              "WHERE startDate <= @asOf
              "  AND endDate > @asOf"
var results = db.ExecuteStoreQuery<Item>(sql, new [] {now});