0

假设我在数据库中有一个包含 10k 条记录的表。我不再需要实际使用那些 10k 记录,但我仍然需要将它们保存在数据库中。该表现在将用于存储新数据。因此,除了表中已经存在的 10K 记录之外,还会有更多记录出现。与“旧”的 10K 记录相反,我确实需要处理新插入的数据。现在我这样做是为了获取我需要的数据:

List<Stuff> l = (from x in db.Table
            where x.id > id
            select x).ToList();

我现在的问题是:LINQ(或一般的 SQL)中的子句如何在幕后工作?where是否要搜索整个表,直到(x.id > id)为真?因为假设表将从 10k 记录增加到 20K。如果我知道我只需要从某个点开始查看,那么查看整个 20 k 记录会有点傻。

在使用 LINQ to 实体时,我遇到了性能问题(不是戏剧性的,但足以被它激怒),我有点不明白,因为现代计算机筛选一个完全没有问题仅有 2 万条记录。有人建议我使用存储过程而不是 LINQ 查询,但我不知道这是否会提高性能?

任何反馈将不胜感激。

4

1 回答 1

2

它的行为就像一个措辞相似的 SQL 查询。问题是您遇到的开销是发生在查询中还是发生在查询到列表的转换中。您编写的查询本身应该等同于:

Select ID, Column1, Column2, Column3, ... , Column(n+1)
From db.Table
Where ID > id

根据数据的性质,此查询应该相当快。但是,在对其采取行动之前,查询本身不会被执行。在这种情况下,您将其转换为列表,这相当于对其进行操作。我找不到有人对我提出的关于这种做法的评论,但我发现它对保持性能清洁也很有帮助。除非您有一些非常具体的需要,否则您应该将查询保留为IQueryable. 将它们转换为列表会使工作量加倍,因为首先必须执行查询,然后必须将结果集转换为适当的IEnumerable(在本例中为列表)。

所以你有两个潜在的瓶颈。简单的查询可能需要很长时间才能查询大量数据,或者记录的数量可能会在创建列表的位置出现瓶颈。另一种可能性是ID在这种情况下的性质。如果它是数字,那将为您节省一些时间。如果它正在执行基于文本的搜索,那么它会更重。

要回答您的具体问题,是的,它将搜索数据库中的每条记录并返回与表达式匹配的所有记录。编辑:如果数据库在相关列上有适当的索引,它不会搜索每条记录,而是使用索引来执行搜索。来自@Pleun 的评论。

至于使用存储过程,这是一大堆废话,但它是一个完全可以接受的替代方案。我有几个程序经常对一个拥有超过 4000 万条记录的数据库运行类似的查询,到目前为止,我遇到的唯一性能问题是多个用户执行快速触发查询时的 CPU 使用率。为了解决您的特定问题,我建议您在 SQL Management Studio 中对其进行一些调整,直到您想要的查询以可接受的速度返回您的界面。然后,您可以将该查询转换为兼容的 Linq 语句。只要您将其保留为 a,IQueryable它应该会显示出类似的结果。

于 2012-06-20T18:31:48.670 回答