3

我在 sql server 的表上运行 > 50K 简单选择,我真的很想加快速度。我读过您可以将数据拉入内存并使用数据视图之类的东西进行查询。

有没有办法在 Linq 中使用某些东西来结束 -

var dv = CreateTheDataViewFromDatabase();

var result = dv.Where("CategoryId=2 And Uncle='bob'");

这会比多次查询数据库快得多吗?我担心数据视图上没有索引,因此可能会丢失将其保存在内存中的收益。

4

4 回答 4

3

我希望最快的方法是生成一个查询,该查询按顺序返回整个“50K 简单选择”集的结果,这样您就可以将整个事情作为一个查询运行并迭代结果依次。

这样做的原因是,当您将表拉到内存中时,您会丢失任何可能在 sql server 中可用以帮助查询结果的索引信息。当然,代价是您的查询返回了 50K 查询价值的数据,但是如果您针对数据读取器和数据表正确执行此操作,您应该能够避免在客户端的内存中保留不必要的信息。

于 2013-01-14T23:11:46.390 回答
1

是的,您可以使用 Linq 针对您DataTableAsEnumerable. 例如:

var rows = from row in dt.AsEnumerable()
            where row.Field<int>("CategoryId") == 2 && row.Field<string>("Uncle") == "bob" 
            select row;

确保添加对System.Data.DataSetExtensions

更新:动态 SQL

可以即时建立您的条件。看看动态 LINQ谓词生成器

于 2013-01-14T23:09:08.810 回答
1

听起来您的程序正在花费大量时间与数据库进行通信。如果您查询数据库一次并将结果保存在计算机的内存中,您可以大大加快该过程。如果您使用的是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...
}

您可以在此处此处找到一些关于使用 LINQ 的体面示例。

于 2013-01-15T02:57:41.990 回答
0

如其他答案所示,这是可能的,但有一些事情需要考虑:

首先,需要提取的数据总量是多少。如果该数量需要如此多的内存以致虚拟内存大量启动,那么您将失去所有速度优势,因为操作系统需要的时间长短在分页上。

其次,50k+ 的查询数量很多。考虑进行设计更改/重构以减少查询量。不同算法的好处可能会超过您建议的解决方案。

于 2013-01-14T23:17:15.183 回答