动态查询最快的方式在200万个内存行中

时间:2018-03-25 08:04:37

标签: c# .net algorithm data-structures

我在内存中有200万行数据,我想应用动态groupby和dynamic where(动态过滤器)子句。我需要最多10秒的记录。我试过这样做:

  1. 动态Linq,它工作正常,但返回结果超过60秒,这是不可接受的。

  2. 我使用了数据表并应用了过滤器和计算功能,它在20-30秒内返回数据。

  3. 是否有任何其他数据结构,库或某些方法/算法可用于加速此查询以使用动态组合和动态过滤器工具在10秒或更短时间内获得结果。

    我的数据包含以下字段

    "Company"
    "City"
    "SellPrice"
    "BuyPrice"
    

    我正在CompanyCity字段上动态分组,并在price字段上执行聚合功能

    并将其称为:

     public DataTable GroupBy(string[] gorupByColumns, string aggregateColumn, DataTable table, string columnName, string Formula, string whereClause)
        {
            bool IsNoGroupIng = false;
            DataTable d;
            if (!string.IsNullOrEmpty(whereClause))
            {
                table.DefaultView.RowFilter = whereClause;
                d = table.DefaultView.ToTable();
                table.DefaultView.RowFilter = "";
                table = table.DefaultView.ToTable();
            }
            else
            {
                d = table.DefaultView.ToTable();
            }
            DataView dv = new DataView(d);
            DataTable dtGroup = null;
            if (gorupByColumns.Length ==1 && string.IsNullOrWhiteSpace(gorupByColumns[0]))
            {
                dtGroup = dv.ToTable();
                IsNoGroupIng = true;
            }
            else
            {
                dtGroup = dv.ToTable(true, gorupByColumns);
            }
            if (columnName.ToLower() == "sum")
            {
                dtGroup.Columns.Add(columnName, typeof(double));
    
            }
            else
            {
                dtGroup.Columns.Add(columnName, typeof(double));
    
            }
            foreach (DataRow dr in dtGroup.Rows)
            {
                if (IsNoGroupIng)
                {
                    dr[columnName] = d.Compute(Formula, "");
                    break;
                }
                string operation = string.Empty;
                for (int i = 0; i < dtGroup.Columns.Count -1; i++)
                {
                    if (i>0)
                    {
                        operation += " AND ";
                    }
                    operation += dtGroup.Columns[i].ColumnName + " = '" + dr[i] + "'";
                }
                dr[columnName] = d.Compute(Formula, operation);
            }
            if (IsNoGroupIng && dtGroup.Rows.Count > 0)
            {
                DataTable dTable = new DataTable();
                dTable.Columns.Add(columnName, typeof(double));
                DataRow row = dTable.NewRow();
                row[columnName] = dtGroup.Rows[0][columnName];
                dTable.Rows.Add(row);
                return dTable;
            }
            return dtGroup;
        }
    

    GroupBy(arr,“Price”,dt,“MyCustomColumn”,“Sum(Price)”,“Country IN('Country1.Country2')”);

0 个答案:

没有答案