0

我最近注意到我们的产品对于一些“短”邮政编码的邮政编码位置(纬度和长坐标)不正确 - 即“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。

4

2 回答 2

5

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

UPDATE postcodes 
SET longitude = newlongitude,
latitude = newlatitude 
FROM (SELECT latitude AS newlongitude, longitude AS newlatitude FROM postcodes 
         WHERE longitude > latitude)
于 2012-10-17T12:40:35.690 回答
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 解决这个问题,你就不会遇到这个问题。

于 2012-10-17T22:24:54.640 回答