EF和LINQ查询数据库速度

时间:2014-10-31 11:30:54

标签: c# performance linq entity-framework

我只是想知道我是在浪费时间,还是有什么可以改进这个查询,从而提高性能。

在存储库中,我正在尝试获取最近的10个项目

    public List<entity> GetTop10
    {
        get
        {
            return m_Context.entity.Where(x => x.bool == false).OrderByDescending(x => x.Created).Take(10).ToList();
        }
    }

但这需要很长时间,因为它的查询表中有超过11000行。所以我的问题是,无论如何我可以加速这种查询吗?

我正试图让我的SQL关于性能,我知道订单会降低它的速度,但我怎么能达到相同的效果呢?

由于

2 个答案:

答案 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中。 所以尝试在表中添加一些索引。