【发布时间】:2009-06-10 20:12:32
【问题描述】:
我编写了一个导入器,它将数据从平面表复制到其他几个表中,并通过给定的 XML 映射它们。这是针对商店数据库的,其中每个产品可以有多个属性,每个属性可以有几种不同的语言,这意味着它可以很快地汇总大量数据。
目前有超过 50,000 行。我当前的导入代码如下所示:
string query = "SELECT * FROM " + tableDataProducts + " ORDER BY "
+ productIdField;
DataSet importData = new DataSet();
Hashtable data = new Hashtable();
db.DoSelectQuery(query, ref importData, tableDataProducts);
foreach (DataRow row in importData.Tables[0].Rows) {
foreach (MapEntry e in mapping[tableObjPropertyValue]) {
string value = row[e.ImportXmlAttributeName].ToString();
if (value.Equals("null",
StringComparison.OrdinalIgnoreCase)
|| value.Length < 1)
continue;
data.Clear();
data.Add("ProductSN", productIdToSn[row[
productIdField].ToString()]);
data.Add("ObjPropertyGroupID", "0");
data.Add("ObjPropertyID", e.ObjPropertyID);
data.Add("LanguageID", e.LanguageID);
data.Add("Value", value);
db.DoPreparedInsertQuery(tableObjPropertyValue, data);
}
}
可以看出,我首先从平面导入表中读取数据,然后遍历代表单个产品的每一行,对于每个产品,我遍历属性映射并将每个属性复制到名为 data 的 Hashtable 中。 null 值被跳过。
将所有列复制到哈希表后,我插入行。
目前,此方法每分钟仅处理大约 700 行,这导致此导入需要大约一小时。我该如何优化它?
[编辑]
这是 XML 的简化版本,因为实际的 XML 太大而无法在此处显示:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<DATAPACKET Version="2.0">
<METADATA>
<FIELDS>
<FIELD FieldName="source_id" DisplayLabel="source_id" FieldType="String" FieldClass="TField"/>
<FIELD FieldName="data_field" DisplayLabel="data_field" FieldType="Unknown" FieldClass="TField"/>
</FIELDS>
</METADATA>
<ROWDATA>
<ROW source_id="data_1" data_field="some string"/>
<ROW source_id="data_2" data_field="another string"/>
</ROWDATA>
</DATAPACKET>
此 XML 被导入到单个表中,每个字段都成为一列。有一个映射 XML,如下所示:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<DATAPACKET Version="2.0">
<METADATA>
<FIELDS>
<FIELD FieldName="source_id" DisplayLabel="source_id" FieldType="String" FieldClass="TField"/>
<FIELD FieldName="target" DisplayLabel="target" FieldType="Unknown" FieldClass="TField"/>
</FIELDS>
</METADATA>
<ROWDATA>
<ROW source_id="data_1" target="products::id"/>
<ROW source_id="data_2" target="products::name"/>
</ROWDATA>
</DATAPACKET>
目标属性包含目标表和列,格式如下:target='table::column'。
【问题讨论】:
标签: c# mysql optimization import