CFSCRIPT中的缓慢事务性能

时间:2012-10-17 11:35:33

标签: mysql coldfusion coldfusion-9

我最近注意到我们的产品的邮政编码位置(纬度和长坐标)不正确,用于许多“短”邮政编码 - 即“AB10”而不是“ABD 1PT”等。

邮政编码数据库/表格用于在谷歌地图上生成图钉,我现在已经知道,当我们将短邮政编码合并到包含完整邮政编码的表格时,有些(约2200)未正确输入经度和纬度错误的方式。

显然这是一个简单的修复,因此我决定编写一个小脚本来处理不正确的值(基本上是交换它们)。

这就是我所拥有的:

<cfscript>

  /** Fetch the wrong postcodes data **/
  db  = "postcodes";
  sql = "
    SELECT
      postcode, longitude, latitude
    FROM
      postcodes
    WHERE
      longitude > latitude
  ";
  q    = new Query(sql = trim(sql), datasource = db);
  data = q.execute().getResult();

  if (structKeyExists(form, "execute")) {
    if (isQuery(data) && data.recordCount > 0) {
      transaction action="begin" 
      { 
        try {
          qUpdate = new Query(
            datasource = db, 
            sql = "UPDATE postcodes SET longitude = :longitude, latitude = :latitude WHERE postcode = :postcode"
          );
          for (x = 1; x <= data.recordCount; x++) {
            writeOutput("<p>" & data["postcode"][x] & "</p>");

            qUpdate.addParam(name = "longitude", value = data["latitude"][x], cfsqltype = "CF_SQL_DOUBLE");
            qUpdate.addParam(name = "latitude", value  = data["longitude"][x], cfsqltype = "CF_SQL_DOUBLE");
            qUpdate.addParam(name = "postcode", value  = data["postcode"][x], cfsqltype = "CF_SQL_VARCHAR");

            qUpdate.execute();
            qUpdate.clearParams();
          }
          transactionCommit();
        } catch (any e) {
          transactionRollback();
          writeOutput("<p>The database transaction failed, rolling back changes</p>");
          writeDump(e);
        }
      }
      writeOutput("#data.recordCount# postcodes have been updated");  
    } else {
      writeOutput("There were no incorrect postcodes found in the database");
    }
  }
</cfscript>
<cfoutput>
  <form name="update" action="" method="post">
    <input type="hidden" name="execute" value="1"/>
    <input type="submit" name="update" value="Update #val(data.recordCount)# Postcodes"/>
  </form>
</cfoutput>

<!--- <cfdump var="#data#"/> --->

脚本包含在一个事务中,因为我计划在实时服务器上运行它,但是在本地测试脚本之后它继续运行了一个多小时!

邮政编码数据库包含近170万条记录,只有三列全部正确编入索引postcode, longitude, latitude第一个查询返回正确的2,200条结果。

我已经检查过ColdFusion管理员中的组件缓存设置,看看我的本地是否缺少这个设置,但它已打开!

所以我的问题 - 为什么执行这么长时间?

我们正在使用mysql和ACF 9。

2 个答案:

答案 0 :(得分:5)

为什么在CF中呢?只需在SQL中完成所有操作,它就会快得多。我不使用mysql,但有点像这样的东西:

UPDATE postcodes 
SET longitude = newlongitude,
latitude = newlatitude 
FROM (SELECT latitude AS newlongitude, longitude AS newlatitude FROM postcodes 
         WHERE longitude > latitude)

答案 1 :(得分:0)

执行这么长时间的原因可能是因为你在这个位上循环了2,200次:

writeOutput("<p>" & data["postcode"][x] & "</p>");

qUpdate.addParam(name = "longitude", value = data["latitude"][x], cfsqltype = "CF_SQL_DOUBLE");
qUpdate.addParam(name = "latitude", value  = data["longitude"][x], cfsqltype = "CF_SQL_DOUBLE");
qUpdate.addParam(name = "postcode", value  = data["postcode"][x], cfsqltype = "CF_SQL_VARCHAR");

qUpdate.execute();
qUpdate.clearParams();

使用SQL解决此问题,您将不会遇到此问题。