У меня есть программа, которая должна запускать запросы на несколько очень больших таблиц Oracle (самая большая с десятками миллионов строк). Вывод этих запросов подается в другой процесс, который (в качестве побочного эффекта) может записывать ход запроса (т. Е. Извлекается последняя строка).Каков наилучший способ обеспечения согласованного заказа в запросе Oracle?
Было бы неплохо, если в какой-то причине задача остановилась на полпути по какой-либо причине, ее можно было бы перезапустить. Чтобы это произошло, запрос должен возвращать строки в последовательном порядке, поэтому его нужно сортировать. Очевидно, что нужно сортировать первичный ключ; однако, вероятно, это будет штраф за это с точки зрения производительности (доступ к индексу) по сравнению с неупорядоченным решением. Учитывая, что перезапуск может никогда не произойти, это нежелательно.
Есть ли какой-то трюк, чтобы обеспечить последовательный заказ по-другому? Любые другие предложения по поддержанию производительности в этом случае?
EDIT: Я оглядывался и видел «заказ по rowid». Это полезно или даже возможно?
EDIT2: Я добавляю некоторые тесты:
- При отсутствии приказа: 17 секунд.
- С заказом от PK: 46 секунд.
- С заказом rowid: 43 секунды.
Таким образом, любой заказ имеет дикий эффект на производительность, а использование rowid мало чем отличается. Принятый ответ - нет простого способа сделать это.
Почему, по вашему мнению, будет использоваться доступ к индексу? Если большая часть данных будет извлечена, индекс будет бессмысленным. Ваша единственная гарантия для строк, отображаемых в последовательном порядке (например, по возрастанию первичного ключа), заключается в использовании предложения ORDER BY. Однако вам также нужно учитывать такие вещи, как, если кто-то вставляет новые данные, которые появляются на середине в упорядоченном наборе результатов, между запуском и перезапуском запроса? Это может отбросить вещи. Однако сортировка вашего набора результатов, скорее всего, повлияет на производительность. – Boneist
Вы можете предположить для этого случая, что базовые таблицы не будут изменены. Я предполагаю, что для доступа к строкам требуется доступ к индексу, если используется порядок. – rghome
Индекс не обязательно будет использоваться для сортировки. И это не основные изменения таблиц, о которых я говорил, но скажем, что у вас есть строки с идентификаторами pk 1, 3, 5 и 7, поэтому вы заказываете свои результаты в столбце id. Предположим, что вы остановились после третьей строки, а затем кто-то вставляет строку с id = 4. Когда вы перезагружаете свой запрос, строка с id = 5 уже не является третьей в результирующем наборе, это четвертый, поэтому ваши результаты не являются согласованный по обеим прогонам. – Boneist