代码之家  ›  专栏  ›  技术社区  ›  Nap

在SQL或代码中更好地对聚合数据进行分组(就性能而言)

  •  0
  • Nap  · 技术社区  · 15 年前

    我想就通过连接字符串来生成聚合数据征求意见。如果我有一个列聚合,但是我想连接到一个聚合列中,那么在性能方面哪个更快?执行一个SQL,然后在代码中进行聚合。或者选择主数据,然后一次查询一个。

    例如:

    TABLE_A        
    COL_A_1         COL_A_2
    A               a
    B               b
    C               c
    
    TABLE_B
    COL_B_1         COL_B_2
    a               Text1
    a               Text2
    a               Text3
    b               Text4
    b               Text5
    

    该表在col_a_2=col_b_1处联接,聚合列为col_b_2。

    选项1 (做一个SQL)

    SELECT TABLE_1.COL_A_1, TABLE_1.COL_A_2, TABLE_2.COL_B_2 
    FROM TABLE_A 
    LEFT OUTER JOIN TABLE_B ON TABLE_A.COL_A_2 = TABLE_2.COL_B_1
    ORDER BY TABLE_1.COL_A_1
    

    然后在代码中,对结果集进行循环,并聚合col_b_1。(使用Java的EX)

    String oldColA1 = "";
    InfoEntity currInfo = null;
    for (InfoEntity info : infoList) {
      if (!oldColA1.equals(info.colA1)) {
        currInfo = info;
      }
    
      if (currInfo.colB2 == null || currInfo.colB2.equals("")) {
        currInfo.colB2 = info.colB2;
      } else {
        currInfo.colB2 += info.colB2;
      }
      oldColA1 = info.colA1;
    }
    

    选项2 (执行多个SQL)

    SELECT TABLE_1.COL_A_1, TABLE_1.COL_A_2
    FROM TABLE_A 
    ORDER BY TABLE_1.COL_A_1
    

    然后为每个代码选择(EX-Java)

    for (InfoEntity info : infoList) {
      // Select TableB entity based on info.colA2
      ...
      tableBList = dao.selectTableB(info.colA2);
      ...
      for (TableBEntity b : tableBList) {
        info.colB2 += b.colB2;
      }
    }
    

    我通常做选项1,因为我认为让多个SQL选择可能会很昂贵。但我对此不确定。但是有没有其他的方法来进行这种聚合呢?我已经搜索了网络,在标准的SQL中没有字符串串联聚合。而且,表A上的说明过于简化,通常表A是多个表连接在一起的复杂查询,表B也是如此。

    1 回复  |  直到 15 年前
        1
  •  3
  •   OMG Ponies    15 年前

    我通常做选项1,因为我认为进行多个SQL选择代价很高。

    你是对的-到数据库的访问应该尽可能少。

    尽管-mysql有 GROUP_CONCAT ,自4.1以来。使用SQL Server,可以使用:

    SELECT @out = COALESCE(@out + ',' + t.column, t.column)
      FROM TABLE t
    

    检查 this link 例如,它应该在Oracle9i+中工作。