我在 sql server 的表上运行 > 50K 简单选择,我真的很想加快速度。我读过您可以将数据拉入内存并使用数据视图之类的东西进行查询。
有没有办法在 Linq 中使用某些东西来结束 -
var dv = CreateTheDataViewFromDatabase();
var result = dv.Where("CategoryId=2 And Uncle='bob'");
这会比多次查询数据库快得多吗?我担心数据视图上没有索引,因此可能会丢失将其保存在内存中的收益。
我在 sql server 的表上运行 > 50K 简单选择,我真的很想加快速度。我读过您可以将数据拉入内存并使用数据视图之类的东西进行查询。
有没有办法在 Linq 中使用某些东西来结束 -
var dv = CreateTheDataViewFromDatabase();
var result = dv.Where("CategoryId=2 And Uncle='bob'");
这会比多次查询数据库快得多吗?我担心数据视图上没有索引,因此可能会丢失将其保存在内存中的收益。
我希望最快的方法是生成一个查询,该查询按顺序返回整个“50K 简单选择”集的结果,这样您就可以将整个事情作为一个查询运行并迭代结果依次。
这样做的原因是,当您将表拉到内存中时,您会丢失任何可能在 sql server 中可用以帮助查询结果的索引信息。当然,代价是您的查询返回了 50K 查询价值的数据,但是如果您针对数据读取器和数据表正确执行此操作,您应该能够避免在客户端的内存中保留不必要的信息。
听起来您的程序正在花费大量时间与数据库进行通信。如果您查询数据库一次并将结果保存在计算机的内存中,您可以大大加快该过程。如果您使用的是ADO.NET 实体数据模型,那么您可以轻松地查询数据库并将检索到的记录保存在 IEnumerable 中。然后,您可以使用 LINQ 对保存的值执行查询。
//Get the data from your database
public IEnumerable<DataValue> GetDataValues()
{
try
{
using (var db = new MyEntities())
{
return (from data in db.DataValues
select data).ToList();
}
}
catch(Exception e)
{
Console.WriteLine(e);
}
}
//Perform operations on the data
public void DoSomething()
{
var data = GetDataValues();
var result = data.Where(p => p.CategoryId == 2 && p.Uncle == "Bob");
//etc...
}
如其他答案所示,这是可能的,但有一些事情需要考虑:
首先,需要提取的数据总量是多少。如果该数量需要如此多的内存以致虚拟内存大量启动,那么您将失去所有速度优势,因为操作系统需要的时间长短在分页上。
其次,50k+ 的查询数量很多。考虑进行设计更改/重构以减少查询量。不同算法的好处可能会超过您建议的解决方案。