Выполнение «Оптимизированных» операций над множествами на java.util.ArrayList или в SQL - PullRequest
0 голосов
/ 11 июля 2011

Это первый раз, когда мне нужно задать вопрос, чтобы мой запрос был решен до того, как сегодня предыдущие потоки смогли выполнить мои запросы.

Сценарий: У меня есть две таблицы (скажем,A & B) в базе данных с одними и теми же строками и несколькими строками.Следует отметить, что в обеих таблицах миллионы строк или, по крайней мере, больше миллиона.

Теперь я должен выполнить над ними операции над множествами, как нет.одинаковых рядов (пересечение), нет.новых строк (AB) и нет.старых строк (BA).

У меня есть два варианта: 1) я могу выполнять операции над множествами в виде запроса к базе данных.

2) или я могу получить записи и выполнитьоперации над java.util.ArrayLIst в памяти.

Но в обоих случаях это занимает слишком много времени, около 5-10 минут, что может быть лучшим ( OPTIMIZED ) подходом для этого.

Пожалуйста, помогите.

Ответы [ 3 ]

1 голос
/ 11 июля 2011

Прежде всего, union, minus и т. Д. Являются не операциями с таблицами, а с результатами операторов select. В вашем случае вы сканируете огромные таблицы, создаете огромные наборы результатов и затем сравниваете каждый из результатов. Это очень медленно. Вы должны оптимизировать таким образом, чтобы индексы могли быть использованы.

Во-вторых, загрузка результатов из БД в Java, а затем их обработка по своей сути медленнее, чем обработка в БД и получение готового результата в Java.

0 голосов
/ 11 июля 2011

Я бы оставил это до базы данных.

Если у таблиц еще нет первичного ключа, вы можете создать столбец (проиндексированный) в обеих таблицах, в котором хранится хэш значений столбцов, используйтеэтот столбец для более простых сравнений, например:

SELECT COUNT(*)
FROM a JOIN b ON a.hash = b.hash
    AND a.ColA = b.ColA
    AND a.ColB = b.ColB
0 голосов
/ 11 июля 2011

Выберите подход, основанный на базе данных, потому что сотни человеко-лет потратили на оптимизацию логики запросов СУБД.Я уверен, что вы не хотите копировать эти усилия в вашем клиенте.Если использование SQL в настоящее время слишком медленное, убедитесь, что все необходимые индексы на месте, и выполните анализ плана выполнения запроса (как это сделать в разных системах управления базами данных), чтобы найти узкие места в вашем запросе (например, полную таблицу).сканирование).

...