Sql как разбить запрос на части
Перейти к содержимому

Sql как разбить запрос на части

Как разбить массивный запрос данных на несколько запросов

Мне нужно выбрать все строки из таблицы с миллионами строк (чтобы предварительно загрузить сетку данных 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 вроде так, а вообще почитай где нибудь про это..

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *