Более быстрое получение данных SQL с помощью Java и поиск больших данных - PullRequest
1 голос
/ 06 июня 2011

У меня есть таблица с более чем 100 тысячами данных, состоящих из числовых пар.Пример которого приведен ниже.

   A          B
   0010     0010 
    0010     0011 
    0010     0019 
    0010     0056
    0011     0010 
    0011     0011 
    0011     0019 
    0011     0040
    0019     0010
    0019     0058 

Здесь числа в столбце A содержат возможные пары в столбце B. Пояснение: у пользователя будет несколько таких чисел в диапазоне от 10 до 100.Теперь, как мы видим, для 0010 - 0011 и 0019 присутствует.Таким образом, если у пользователя есть список, содержащий 0010 и 0011, будет показано предупреждение о том, что эта пара не разрешена, и наоборот.

Как это сделать в Java?Загрузка хеш-карты со всеми данными не кажется хорошим вариантом, хотя поиск будет намного быстрее.

, пожалуйста, предложите.Спасибо

Тестовый случай:

num = 0010;  //value from list which user will be passing
test(num){
if(num.equals("0019")||num.equals("0011")) //compairing with database 
System.out.println("incompatible pair present");
}

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

Ответы [ 7 ]

2 голосов
/ 06 июня 2011

Пока вопрос не станет более понятным ... Обработка больших объемов данных, которые уже хранятся в базе данных, позвольте мне дать вам рекомендацию: что бы вы здесь ни делали, рассмотрите решение с помощью SQL вместо Java. Или, по крайней мере, написать SQL с результирующим ResultSet, который впоследствии будет легко оценить в Java.

Но пока вопрос не так ясен ...

1 голос
/ 06 июня 2011

Пытаетесь ли вы найти записи, в которых значение A совпадает, а значение B отличается?

SELECT t1.a, t1.b, t2.b 
FROM MyTable t1, MyTable t2 
WHERE t1.a = t2.b AND t1.b <> t2.b
0 голосов
/ 08 июня 2011

Простое - определенно не масштабируемое решение - если ваши диапазоны действительно равны 0000 - 9999.

Просто создайте таблицу байтов с 999999 записями.Каждая запись состоит из простого 0 для разрешенного или 1 для недопустимого.Чтобы найти запись в таблице, логически объедините две пары пар (ключ = первый * 1000 + второй).

Более масштабируемое решение для базы данных - создать таблицу с составным первичным ключом (пара1 и пара2)просто наличие записи, указывающей на запрещенную пару.

0 голосов
/ 08 июня 2011

Чтобы прояснить вопрос: у вас есть таблица, содержащая два числа в каждой записи, которые объявлены «несовместимыми».У вас есть список номеров пользователей, и вы хотите проверить, содержит ли этот список «несовместимые номера».Правильно?

Вот вам простой SQL (взяв пример из комментария):

SELECT *
FROM   incompatible
WHERE  A IN (1, 14, 67) AND B IN (1, 14, 67);

Этот SQL возвращает все несовместимости.Когда набор результатов пуст, нет никаких несовместимостей, и все в порядке.Если вы хотите получить только этот факт, вы можете написать SELECT 1 ....Конечно, SQL должен быть построен динамически, чтобы содержать номера пользователей в предложениях IN.

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

0 голосов
/ 06 июня 2011

Если я правильно понял, что вы хотите сделать ...

Создайте уникальный индекс для t1(a,b).Поместите новую пару пользователя в оператор INSERT внутри блока try .Перехватите исключения нарушения ключа (будет SQLException, возможно подкласс в зависимости от вашей RDBMS) и объясните пользователю, что это запрещенная пара.

0 голосов
/ 06 июня 2011

Похоже, что ваша проблема ограничена очень маленькой областью - почему вы не можете создать экземпляр двумерного массива bool и установить его на true всякий раз, когда индексы двух чисел создают неподдерживаемую комбинацию.

Пример использования:

if (forbiden[10][11] || forbiden[11][10]) 
{
   throw new Exception("pairs of '10' and '11' are not allowed");
}

Вы можете создать экземпляр этого массива из базы данных, просмотрев данные один раз и установив этот массив.Вам просто нужно перевести 0010 на 10.У вас будет мусор в индексах 0–9, но вы можете устранить его, «переместив» индекс, вычтя его из 9.

Это затрагивает ваш вопрос?

0 голосов
/ 06 июня 2011

Если вам не хватает места в куче, попробуйте использовать постоянный кеш, например ehcache .Я предлагаю вам проверить фактическое потребление памяти, прежде чем приступить к этому решению, хотя

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...