ber*_*ner 11 sql linq performance entity-framework
所以,代码非常简单:
var result = dbContext.Skip(x).Take(y).ToList();
Run Code Online (Sandbox Code Playgroud)
当x很大(~1.000.000)时,查询非常慢.y很小 - 10,20.
这个的SQL代码是:(来自sql profiler)
SELECT ...
FROM ...
ORDER BY ...
OFFSET x ROWS FETCH NEXT y ROWS ONLY
Run Code Online (Sandbox Code Playgroud)
问题是,是否有人知道如何加快这种分页?谢谢.
你是对的,Skip().Take() 方法在 SQL 服务器上很慢。当我注意到我使用了另一种方法并且效果很好时。我没有使用 Linq Skip().Take() - 它编写你展示的代码 - ,我明确地将 SQL 编写为:
select top NTake ... from ... order by ... where orderedByValue > lastRetrievedValue
Run Code Online (Sandbox Code Playgroud)
这个工作得很快(考虑到我有按列排序的索引)。
与其他方式相比,在数据库中导航一百万条记录总是很慢,数据库必须“跳过”一百万条记录,它通过在内存中创建结果然后丢弃前一百万行来做到这一点。
您是否考虑过非 sql 替代方案(solr、lucene 等),至少先获取行的 id,然后在 () 查询中使用 where id?
或者,您可以拥有一个主表的搜索表(预制表),其中仅包含最少的数据和 ID,因此您可以跳过该表并获取 ID 并使用这些查询大表。
归档时间: |
|
查看次数: |
6784 次 |
最近记录: |