C# 针对未知提示和IQueryable的SQL优化
我有一段代码,使用IQueryable根据日期进行选择。这里的sql性能导致超时。如果这是纯SQL,我会使用(针对(@date UNKNOWN)进行优化C# 针对未知提示和IQueryable的SQL优化,c#,sql,linq,C#,Sql,Linq,我有一段代码,使用IQueryable根据日期进行选择。这里的sql性能导致超时。如果这是纯SQL,我会使用(针对(@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; DateTime
DateTime now = DateTime.UTC Now;
var results = from item in items.Find()
where item.startDate <= now
where item.endDate > now
select item;
return results;
DateTime now=DateTime.UTC now;
var results=来自items.Find()中的项
item.startDate现在在哪里
选择项目;
返回结果;
有没有一种好方法可以添加此提示?或者我应该将其作为存储过程移动到数据库中?我看不出提示如何帮助您提高性能。您应该首先正确地查询,并在SQL探查器上查看实体框架生成的SQL。如果您的数据库的设计和我期望的一样
var results = item.Where(x=> x.startDate <= now && x.endDate > now)
var results=item.Where(x=>x.startDate now)
查看此相关问题,了解sql server上的索引提示,总结一下,不能将它们用于linq
假设:
Find()
返回一个IQueryable
,并且在startDate
和endDate
上有索引
我不知道如何向Linq添加查询提示,因为它们是特定于提供者的,但您可以尝试以下几点:
使用&&
而不是多个where
子句:
DateTime now = DateTime.UTCNow;
var results = from item in items.Find()
where item.startDate <= now
&& item.endDate > now
select item;
我不认为这些代码会被编译。这不是确切的代码,我把它拉出来并更改了变量名以简化它。我们已经编译的代码现在已经运行了一段时间。不过,我会清理它以使它更清晰。这是一个简单的查询,卡在sql server中。你设置了正确的索引吗?选择性是什么为什么要使用
Find()
不带键?所有项目都要存储,然后按谓词过滤。如果数据在范围上严重倾斜,优化提示确实会有帮助;如果第一次运行的查询有一组非典型的值,可能会发生非常糟糕的事情是的,我现在正在阅读,我将编辑我的帖子
string sql = @"SELECT * FORM Items " +
"WHERE startDate <= @asOf
" AND endDate > @asOf"
var results = db.ExecuteStoreQuery<Item>(sql, new [] {now});