我只是想知道我是在浪费时间,还是有什么可以改进这个查询,从而提高性能。
在存储库中,我正在尝试获取最近的10个项目
public List<entity> GetTop10
{
get
{
return m_Context.entity.Where(x => x.bool == false).OrderByDescending(x => x.Created).Take(10).ToList();
}
}
但这需要很长时间,因为它的查询表中有超过11000行。所以我的问题是,无论如何我可以加速这种查询吗?
我正试图让我的SQL关于性能,我知道订单会降低它的速度,但我怎么能达到相同的效果呢?
由于
答案 0 :(得分:1)
您发布的特定查询是使用过滤索引的潜在候选者。假设您有一个SQL表:
CREATE TABLE Employees
(
ID INT IDENTITY(1,1) PRIMARY KEY,
Name NVARCHAR(100),
IsAlive BIT
)
您可以想象,通常您只想查询尚未(但)已经死亡的员工,以便最终得到这样的SQL:
SELECT Name FROM Employees WHERE IsAlive = 1
那么,为什么不创建一个过滤的索引:
CREATE INDEX IX_Employees_IsAliveTrue
ON Employees(IsAlive)
WHERE IsAlive = 1
所以现在如果你查询表格,它将使用这个索引,这个索引可能只是你桌子的一小部分,特别是如果你最近有一次僵尸入侵,你的90%的员工现在已经走了。
然而,像这样的实体框架:
var nonZombies = from e in db.Employees
where e.IsAlive == true
select e;
可能无法使用索引(SQL对筛选索引和参数化查询有问题)。为了解决这个问题,您可以在数据库中创建一个视图:
CREATE VIEW NonZombies
AS
SELECT ID, Name, IsAlive FROM Employees WHERE IsAlive = 1
现在您可以将其添加到您的框架中(如何执行此操作将取决于您是否首先使用代码/模型/数据库),现在您将能够确定哪些员工应该得到紧急关注(例如优先获取食物)和武器):
var nonZombies = from e in db.NonZombies
select e;
答案 1 :(得分:0)
从您的LINQ查询中将创建类似于此的SQL SELECT:
SELECT TOP(10) * FROM entity
WHERE bool = 0
ORDER BY Created DESC
类似,因为服务器选择具体列而不是'*'来将这些列映射到实体对象。
如果这对你来说太慢了。错误发生在数据库中,而不是在EntityFramework中。 所以尝试在表中添加一些索引。