Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 针对未知提示和IQueryable的SQL优化_C#_Sql_Linq - Fatal编程技术网

C# 针对未知提示和IQueryable的SQL优化

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

我有一段代码,使用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 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});