Как разбить массивный запрос данных на несколько запросов
Мне нужно выбрать все строки из таблицы с миллионами строк (чтобы предварительно загрузить сетку данных Coherence). Как разделить этот запрос на несколько запросов, которые могут выполняться одновременно несколькими потоками?
Сначала я подумал о подсчете всех записей и выполнении:
Но это не сработало. Теперь я застрял.
Любая помощь будет очень признательна.
4 ответа
Если у вас есть лицензия Enterprise Edition, самый простой способ достичь этой цели — параллельный запрос.
Для одноразовых или специальных запросов используйте подсказку PARALLEL:
Число в подсказке — это количество подчиненных запросов, которые вы хотите выполнить; в этом случае база данных будет запускать четыре потока.
Если вы хотите, чтобы каждый запрос к таблице можно было распараллелить, тогда навсегда измените определение таблицы:
Обратите внимание, что база данных не всегда будет использовать параллельный запрос; оптимизатор решит, подходит ли это. Параллельный запрос работает только с полным сканированием таблицы или сканированием диапазона индексов, которые пересекают несколько разделов.
Есть ряд предостережений. Параллельный запрос требует, чтобы у нас было достаточно ядер, чтобы удовлетворить предложенное количество потоков; если у нас есть только один двухъядерный процессор, установка степени параллелизма 16 не ускорит запрос волшебным образом. Также нам нужны запасные мощности ЦП; если сервер уже привязан к процессору, то параллельное выполнение только усугубит ситуацию. Наконец, подсистемы ввода-вывода и хранения должны быть способны удовлетворить параллельный спрос; SAN здесь могут быть крайне бесполезны.
Как всегда в вопросах производительности, крайне важно провести некоторое сравнение с реалистичными объемами данных в репрезентативной среде, прежде чем переходить к работе.
Что делать, если у вас нет Enterprise Edition? Что ж, можно имитировать параллельное выполнение вручную. Том Кайт называет это «Сделай сам параллелизм». Я сам использовал эту технику, и она работает хорошо.
Главное — вычислить общий диапазон ROWID, которые применяются к таблице, и разделить их на несколько заданий. В отличие от некоторых других решений, предложенных в этом потоке, каждое задание выбирает только те строки, которые ему нужны. Г-н Кайт резюмировал технику в старой ветке AskTom, в том числе жизненно важный сценарий разделения: найдите здесь.
Разделение таблицы и запуск потоков — это ручная задача: хорошо, если она выполняется один раз, но довольно утомительна, чтобы выполнять ее часто. Поэтому, если вы используете версию 2 11g, вам следует знать, что существует новый пакет PL/SQL DBMS_PARALLEL_EXECUTE, который автоматизирует это для нас.
Как разбить SQL запрос на составные части для дальнейшего использования в SQLiteDatabase?
Всем привет.
С JAVAй я знаком недавно и стандартные средства работы с SQL мне не понравились.
Я привык запрос писать «одной строкой». Но в классе SQLiteDatabase нельзя отправить сырой запрос, а нужно отдельно заполнять данными каждый метод (.update(), .query(), .insert() . ).
Пример:
Есть ли стандартные методы для разбора запроса, чтобы его в последующем использовать в .insert(String table, String nullColumnHack, ContentValues values) и т.п.? А то в ручную парсить побаиваюсь, мало ли, ошибусь где-нибудь ))
Как разбить SQL запрос на два?
Неуверен что тебе это ускорит, полагаю даже что атормозит, бд для того и нужны чтобы обрабатывать здоровые массивы данных, если хочешь разбить и юзать результаты запроса, попробуй Кашировать запрос..
Неуверен что все получится как я говрю, но теория такова(на практики я сам это не использовал)
Для того чтобы первый запрос не изменил саму базу данных, а результат получился как бы в памяти юзаем кэширование Query1->CachedUpdates=true;
Да и еще помести с Data Access компонент UpdateSQL чтобы после выполнения селекта
подсоедини к компоненту Query (получившаяся татаблица ака результат годен не только для чтения но и для модификации). ., делаешь нужный запрос и в консе сохраняешь хеш ApplyUpdate вроде так, а вообще почитай где нибудь про это..