【问题标题】:How to optimize this? [closed]如何优化这个? [关闭]
【发布时间】:2013-04-03 06:59:16
【问题描述】:

所以我有这段代码可以将代理列表作为一条 sql 指令添加到本地 SQLite 数据库。

public void Add(List<Broker> brokers)
{
    if(brokers == null || brokers.size() == 0)
      return;

    String sql = "INSERT INTO " + TABLE_NAME + " SELECT " + brokers.get(0).getId() + " AS '" + COLUMN_BROKERID + "', "+ brokers.get(0).getOfficeId() + " AS '" + COLUMN_OFFICEID +  "', '"+ brokers.get(0).getName() + "' AS '" + COLUMN_NAME +  "', "+ brokers.get(0).getSuccessRate() + " AS '" + COLUMN_SUCCESSRATE +  "'";

    for(int i=1; i<brokers.size(); i++)
    {
        sql = sql + " UNION SELECT " + brokers.get(i).getId() + ", " + brokers.get(i).getOfficeId() + ", '" + brokers.get(i).getName() + "', " + brokers.get(i).getSuccessRate();
    }

    databaseManager.ExecuteNonQuery(sql);
 }

但是让这个速度减慢很多的是字符串“sql”的变化。最后一行是对ExecuteNonQuery() 的调用,需要一毫秒,但上面需要很多时间。如何加快速度?

【问题讨论】:

标签: java sql optimization


【解决方案1】:

首先我建议使用StringBuilder 来构建您的查询字符串。请注意,它不是线程安全的;如果需要,请使用StringBuffer

大致是这样的:

    StringBuilder sb = new StringBuilder();
    sb.append("INSERT INTO ");
    sb.append(TABLE_NAME);
    sb.append(" SELECT ");
    sb.append(brokers.get(0).getId());
    sb.append(" AS '");
    sb.append(COLUMN_BROKERID);

使用 10.000 个代理,原始方法在我的机器上需要 13984 毫秒。重构为 StringBuilder 会将其缩小到 15 或 16 毫秒。

接下来,您可以尝试使用String formatting。大致是这样的:

String test = String.format("INSERT INTO %1...", TABLE_NAME);

很难说它是否表现更好,但你可以衡量它并决定它是否会提高性能。

【讨论】:

  • 试过了,没用
  • 你按照(更新的)例子试过了吗?它给我带来了 1.000 倍的收益...
【解决方案2】:

永远不要使用字符串来构建 SQL 查询。

改为使用PreparedStatement 并设置占位符。这既是类型安全的,又消除了 SQL 注入的风险。

如果您的查询由于运行时的条件而必须以编程方式构建,请使用@mthmulders 建议来构建准备好的语句。

【讨论】:

  • 也许您可以展示如何使用PreparedStatement 进行INSERT INTO ... SELECT ... UNION 构造。我同意一般来说,PreparedStatements 是一个不错的选择,但(还)不了解如何将这个查询构建为单个语句
  • @mthmulders 好吧,您可以按照与直接语句完全相同的方式为 PreparedStatement 构建字符串,以便将变量 union 添加到完整字符串中,然后在创建 PreparedStatement。唯一的缺点是,您必须再次迭代才能设置占位符。
猜你喜欢
  • 2021-02-26
  • 2017-11-17
  • 2022-01-20
  • 2013-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-03
相关资源
最近更新 更多