繁体   English   中英

将3个不同的数据表合并为1个并使用SQL进行性能测试

[英]Combine 3 different datatables into 1 and performance with SQL

我被要求做一份报告,其中包含我们使用的3种不同的水晶报告。 这些报告已经非常缓慢且繁重,无法完成一项大报告。 因此,我在VS 2010中创建了一些小应用程序。

我的主要问题是,我有3个需要结合使用的数据集设计器创建的数据表(相同的架构)。 我创建了一个空表来存储组合值。 这些查询已经非常庞大,因此将它们组合到SQL查询中实际上是不可能的。

我也没有对SQL Server(2005)的写权限,因为该服务器由创建我们的MRP程序的公司维护。 尽管我总是可以要求支持人员向服务器添加视图。

因此,我的3个数据表包括人工成本,材料成本和分包成本。 我需要创建一个总成本表,并按ID添加每个表的所有“成本”列。 所有表都有查找和选择它们的键。

问题是,当我获取所有当前作业时,这是可以的(400条记录为500毫秒),因为我有一个查询,该查询将仅获取工作中的作业。 库存问题出在哪里,因为我不知道这些工作何时完成,所以我必须获取整个数据库(大约10000个带有子查询的工作,每个子查询最多具有100条记录),这是我的3个表的数据。 这大约需要5000到8000ms,尽管与水晶报表相比它非常快,但存在一个问题。

我需要创建一个汇总表,该表将合并我创建的所有这些不同的表,但是我还需要执行两次,对于每个输出日期,每次执行一次。 因此,我的数据始终在更改,因为它们基于Date参数。 目前,大约需要12到20秒的时间来获取所有内容。

我需要一种减少加载时间的方法,这是我尝试过的方法。

  • 尝试了for循环以合并3个表
  • 然后尝试使用DataReader类读取每一行,并使用数据集设计器创建的FindBy Key方法在另一个表中查找值,我必须这样做两次。 (它似乎比for循环快一点)
  • 与Linq一起尝试过,不认为​​这是可能的,它会带来更多性能吗?
  • 试图做一个动态查询,使用“ WHERE IN 逗号分隔列表 ”(与获取所有数据库相比,实际上使执行时间翻了一番)
  • 试图将我的库存查询与我的费用查询结合起来(这也增加了时间)

1-有什么办法可以更有效地合并我的桌子? 合并和求和我3个表的记录的最快方法是什么?

2-有什么方法可以提高查询性能而无需访问服务器?

以下是我用于参考的一些代码:

    public static void Fill()
    {

        DateTime Date = Data.Date;

        AllieesDBTableAdapters.CoutMatTableAdapter mat = new AllieesDBTableAdapters.CoutMatTableAdapter();
        AllieesDBTableAdapters.CoutLaborTableAdapter lab = new AllieesDBTableAdapters.CoutLaborTableAdapter();
        AllieesDBTableAdapters.CoutSTTableAdapter st = new AllieesDBTableAdapters.CoutSTTableAdapter();

        Data.allieesDB.CoutTOT.Clear();

        //Around 2 sec each Fill
        mat.FillUni(Data.allieesDB.CoutMat, Date);
        Data.allieesDB.CoutMat.CopyToDataTable(Data.allieesDB.CoutTOT, LoadOption.OverwriteChanges);

        lab.FillUni(Data.allieesDB.CoutLabor, Date);
        MergeTable(Data.allieesDB.CoutLabor);

        st.FillUni(Data.allieesDB.CoutST, Date);
        MergeTable(Data.allieesDB.CoutST);

    }

这是MergeTable方法(我尝试过的For循环在Comment中)

    private static void MergeTable(DataTable Table)
    {

        AllieesDB.CoutTOTDataTable dtTOT = Data.allieesDB.CoutTOT;

        DataTableReader r = new DataTableReader(Table);


        while (r.Read())
        {
            DataRow drToT = dtTOT.FindByWO(r.GetValue(2).ToString());

            if (drToT != null)
            {
                drToT["Cout"] = (decimal)drToT["Cout"] + (decimal)r.GetValue(3);
            } else
            {

                EA_CoutsDesVentes.AllieesDB.CoutTOTRow row = dtTOT.NewCoutTOTRow();

                for (int j = 0; j < r.FieldCount; j++)
                {
                    if (r.GetValue(j) != null)
                    {
                        row[j] = r.GetValue(j);
                    } else
                    {
                        row[j] = null;
                    }
                }

                dtTOT.AddCoutTOTRow(row);
            }
            Application.DoEvents();
        }

        //try
        //{
        //    for (int i = 0; i < Table.Rows.Count; i++)
        //    {
        //        DataRow drSource = Table.Rows[i];
        //        DataRow drToT = dtTOT.FindByWO(drSource["WO"].ToString());

        //if (drToT != null)
        //{
        //    drToT["Cout"] = (decimal)drToT["Cout"] + (decimal)drSource["Cout"];
        //} else
        //{
        //    
        //    EA_CoutsDesVentes.AllieesDB.CoutTOTRow row = dtTOT.NewCoutTOTRow();

        //    for (int j = 0; j < drSource.Table.Columns.Count; j++)
        //    {
        //        if (drSource[j] != null)
        //        {
        //            row[j] = drSource[j];
        //        } else
        //        {
        //            row[j] = null;
        //        }
        //    }

        //    dtTOT.AddCoutTOTRow(row);
        //}
        //Application.DoEvents();
        //    }
        //} catch (Exception)
        //{
        //}

在Sql Server 2005及更高版本上,您可以创建聚合值的实例化视图,并显着提高性能。

查看使用SQL Server 2005索引视图提高性能

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM