Подсчитайте повторяющиеся строки в базе данных H2 - PullRequest
0 голосов
/ 06 мая 2020

У меня есть база данных H2 с 120m строками и 4 столбцами только с целочисленными значениями. Я пытаюсь подсчитать все повторяющиеся строки.

Это оператор выбора:

SELECT a, b, c, d, COUNT(*) AS dupes FROM t1 GROUP BY a, b, c, d HAVING COUNT(*) > 1;

Когда я использую этот оператор в базе данных с ~ 4 миллионами строк, он отлично работает. В базе данных с числом строк> 4 м он вызывает исключение ArrayOutOfBounds. В базе данных с более чем ~ 10 миллионами строк я получаю OutOfMemoryError (увеличение Java Heap Space не помогло) или ошибку нехватки физической памяти.

Как я могу улучшить инструкцию select? Как сделать его более эффективным для строк> 10 млн и почему возникает исключение ArrayOutOfBounds с строками> 4 млн?

1 Ответ

0 голосов
/ 06 мая 2020

К сожалению, H2 требует много памяти для сгруппированных запросов с большим количеством строк в результате, если не присутствует совместимый индекс для предложения GROUP BY. Если у вас недостаточно памяти, вам необходимо определить такой индекс.

CREATE INDEX T1_ABCD_IDX ON T1(A, B, C, D);

Такое исключение AIOOBE выглядит как ошибка, но обходной путь тот же.

...