如何将SQL Server表拉入内存以对其运行查询

时间:2013-01-14 23:04:40

标签: c# sql-server linq datatable dataview

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

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

var dv = CreateTheDataViewFromDatabase();

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

这会比查询数据库好很多次吗?我担心数据视图上没有索引,所以在内存中获取它的好处可能会丢失。

4 个答案:

答案 0 :(得分:3)

我希望最快的方法是生成一个单独的查询,按顺序返回结果,对于整套" 50K简单选择",这样你就可以运行整个事情单个查询并按顺序迭代结果。

这样做的原因是当您将表拉到内存时,您将丢失可能在sql server中可用的任何索引信息,以帮助查询结果。当然,惩罚是您的查询返回50K查询值的数据,但如果您从数据区域与数据表相比,您应该能够避免在客户端的内存中保留不必要的信息。

答案 1 :(得分:1)

是的,您可以使用DataTable将Linq用于AsEnumerable。例如:

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

确保添加对System.Data.DataSetExtensions

的引用

更新:动态SQL

可以动态建立您的条件。请查看Dynamic LINQPredicate Builder

答案 2 :(得分:1)

听起来您的程序花费了大量时间与数据库进行通信。如果您查询数据库一次并将结果保存在计算机的内存中,则可以大大加快该过程。如果您使用ADO.NET Entity Data Model,则可以轻松查询数据库并将您在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 herehere时找到一些不错的示例。

答案 3 :(得分:0)

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

首先,需要提取的数据总量是多少。如果这个数量需要大量内存以至于虚拟内存大量启动,那么你将失去速度的所有好处。操作系统需要分页。

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