使用两个数据库表提高查询/处理RegExp函数的速度

时间:2010-10-28 00:54:38

标签: .net sql sql-server regex

我有一个程序,它有一个从一个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);

}

2 个答案:

答案 0 :(得分:0)

如果你有SQL 2005+,你可以构建一些CLR来在SQL中执行正则表达式。非常便利。相当快。然后,您可以处理SQL中的所有内容,并将代码推送到基于集合的操作而不是循环。

http://msdn.microsoft.com/en-us/magazine/cc163473.aspx

答案 1 :(得分:0)

答案可能不是在该HTML上运行正则表达式,而是以其他方式解析它,例如使用HTML agility pack。使用正则表达式解析HTML是“糟糕的”,做很多事情都非常“糟糕”。 (这将取决于正则表达式,但它们可以编写,因此它们对于此任务来说效率非常低。)