[英]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秒的时间来获取所有内容。
我需要一种减少加载时间的方法,这是我尝试过的方法。
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及更高版本上,您可以创建聚合值的实例化视图,并显着提高性能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.