我有一个程序,它有一个从一个SQL数据库表(“html”)检索相对较短的文本字符串的函数,在其上运行一些正则表达式查询,然后将输出存储在另一个数据库表中(“profiles” “)。 “Html”有大约800万条记录和“个人资料”只存储结果。它目前非常慢 - 在快速服务器上每条记录超过1秒。我希望有人能够指出一些我能够解决的明显问题:
dataComm dc = new dataComm(@"SERVER1", "html");
dataComm dc_bp = new dataComm(@"SERVER1", "profiles");
Int32 numinserted = 0;
for (int selectc = 0; selectc < 85000; selectc++)
{
DataTable dt = dc.fetchData("SELECT top 100 * from html where processed=0");
label3.Text = "Iteration " + selectc + " of 85,000";
string sq="";
string squpdate = "";
Int32 thisid=0;
for (int i = 0; i < dt.Rows.Count; i++)
{
// CODE THAT RUNS THE REGULAR EXPRESSIONS.
thisid = Convert.ToInt32(dt.Rows[i]["ID"]);
sq += @"INSERT INTO profiles (field1, field2, [etc.]) VALUES ('value1','value2', [etc.]); ";
numinserted++;
squpdate += "UPDATE html SET processed=1 WHERE ID=" + thisid.ToString() + "; ";
}
dc.executeNonQuery(squpdate);
}
答案 0 :(得分:0)
如果你有SQL 2005+,你可以构建一些CLR来在SQL中执行正则表达式。非常便利。相当快。然后,您可以处理SQL中的所有内容,并将代码推送到基于集合的操作而不是循环。
答案 1 :(得分:0)
答案可能不是在该HTML上运行正则表达式,而是以其他方式解析它,例如使用HTML agility pack。使用正则表达式解析HTML是“糟糕的”,做很多事情都非常“糟糕”。 (这将取决于正则表达式,但它们可以编写,因此它们对于此任务来说效率非常低。)