Группировать агрегированные данные лучше в SQL или в CODE (с точки зрения производительности)

StackOverflow https://stackoverflow.com/questions/1712397

Вопрос

Я хотел бы узнать мнение о создании агрегированных данных путем объединения строк.Если у меня есть агрегированный столбец, но я хочу объединить его в агрегированный столбец, что будет быстрее с точки зрения производительности?Выполнение одного 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)

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 нет агрегации конкатенации строк.Кроме того, иллюстрация в TableA слишком упрощена: обычно TableA представляет собой сложный запрос из нескольких объединенных таблиц, как и TableB.

Это было полезно?

Решение

Обычно я использую вариант 1, потому что считаю, что выполнение множественного выбора SQL обходится дорого.

Вы правы - обращений к базе данных должно быть как можно меньше.

Однако групповая конкатенация возможна - MySQL имеет ГРУППА_CONCAT, начиная с 4.1.С SQL Server вы можете использовать:

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

Проверять эта ссылка для примера, который должен работать в Oracle 9i+.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top