powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Ограничить выборку по таймауту?
64 сообщений из 64, показаны все 3 страниц
Ограничить выборку по таймауту?
    #40022774
Фотография Egoр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хай, олл!

есть таблица с протоколом, как водится, сдоровенная.
есть разные условия на отбор записей.
по одним десяток записей, по другим десяток тысяч.
Все записи не нужны. Достаточно пары сотен.
Для условий, где записей много, отлично работает rownum < 200
А условия, где всего пяток записей, ТFS не заканчивается до победного конца.
Протокол все больше - конец все дальше.
Можно как-то ограничить выборку, например, временем выполнения?
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40022776
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40022777
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AFAIK Ограничить можно через Oracle Database Resource Manager

но он сможет или прерывать выполнение запроса или понижать его приоритет

p.s. Что такое "TFS", который не заканчивается, - я не знаю )))
p.p.s. Попытка лечить следствия, а не причину. Нужно обсуждать какие реальные (а не выдуманные анал итиками) бизнес задачи есть, их реализовывать, создавать индексы (возможно переделывать структуру таблицы или делать matview) для реально требуемых по бизнесу запросов.
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40022798
Фотография Egoр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кобанчег, Leonid, спасибо.

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

TFS - table full scan.
Аналитик я. Моя бизнес задача - проанализировать протокол в системе.
Я реально выдумываю условия поиска в зависимости от ситуации.
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40022800
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Egoр

...
А выполнять запрос, например, минуту, и вернуть тот набор записей, который успел за минуту собраться.
...

Oracle и так возврашает данные в тот момент, когда они готовы в процессе fetch'а.

Т.ч. проблема НЕ сервера, а клиента. Пусть он уже готовые/зафетченные данные показывает сразу, не ожидая получения всего результата запроса

Например Allround Automation PL/SQL Developer ровно так и работает. Показывает начало(готовые данные), а остаток запрашивает/показывает по мере нажатия кнопочек (fetch next, fetch all) пользователем. Если за минуту ничего не показывается, то значит, что за минуту ничего и не найдено

IMHO & AFAIK

p.s. пока все выглядит как надуманная проблема
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40022801
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кобанчег


А лицензирование SQL Quarantine не листал?

SY.
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40022804
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
Кобанчег


А лицензирование SQL Quarantine не листал?

SY.
Я много чего листал, но что же я там должен был видеть?
Что делать
Код: plaintext
“_exadata_feature_on”=true
нельзя?
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40022806
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Egoр
вернуть тот набор записей, который успел за минуту собраться
За минуту может быть готово для фетча ровно ноль записей даже если в запросе одна таблица.
Например, есть аналитика и должна выполнится тяжелая сортировка или банально тяжелый group by.
Про много таблиц и говорить не стоит.
В некоторых случаях может помочь хинт first_rows.
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40022807
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Egoр,

Разбить протокол на партиции, ненужные и устаревшие данные удалить.
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40022809
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кобанчег
Я много чего листал, но что же я там должен был видеть?
Что делать
“_exadata_feature_on”=true
нельзя?


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

SY.
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40022819
Фотография Egoр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev

Oracle и так возврашает данные в тот момент, когда они готовы в процессе fetch'а.

Когда готовы - возвращает, а когда не готовы, то он их усиленно готовит.
Хочется ему сказать, чтобы он не слишком уж усердствовал.
Ограничить его количеством найденных записей я могу легко.
А как ограничить потраченным на поиск временем?
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40022823
Фотография Egoр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кобанчег
Egoр
вернуть тот набор записей, который успел за минуту собраться
За минуту может быть готово для фетча ровно ноль записей даже если в запросе одна таблица.
Например, есть аналитика и должна выполнится тяжелая сортировка или банально тяжелый group by.
Про много таблиц и говорить не стоит.
В некоторых случаях может помочь хинт first_rows.

конкретика такая.
протокол, очищенный от лишних данных , сортируется по индексу в порядке убывания
далее применяется неиндексируемое условие поиска
нужно вывести первые две сотни записей.
когда под условие попадает много записей, тыщща из первого миллиона, то результат прилетает за секунду.
А когда в первой сотне миллионов только 50 нужных записей, то счет идет уже на минуты.
Сколько конкртено записей не известно.
Известно только, что нужные записи наверху протокола.
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40022825
Фотография Egoр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
graycode
Egoр,

Разбить протокол на партиции, ненужные и устаревшие данные удалить.

так и подмывает сказать "не спортивно".
поправил предыдущее сообщение
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40022832
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Egoр

А как ограничить потраченным на поиск временем?

мож в следующих версиях добавят SAMPLE TIME (шучу конечно)

имхо
ТFS прервать по времени нельзя (по крайней мере в старых версиях)

и странно ето выглядит для непростейшего select * from t
на каком етапе плана прерывать

....
stax
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40022836
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Egoр
Кобанчег
пропущено...
За минуту может быть готово для фетча ровно ноль записей даже если в запросе одна таблица.
Например, есть аналитика и должна выполнится тяжелая сортировка или банально тяжелый group by.
Про много таблиц и говорить не стоит.
В некоторых случаях может помочь хинт first_rows.

конкретика такая.
протокол, очищенный от лишних данных , сортируется по индексу в порядке убывания
далее применяется неиндексируемое условие поиска
нужно вывести первые две сотни записей.
когда под условие попадает много записей, тыщща из первого миллиона, то результат прилетает за секунду.
А когда в первой сотне миллионов только 50 нужных записей, то счет идет уже на минуты.
Сколько конкртено записей не известно.
Известно только, что нужные записи наверху протокола.
То есть в плане нет сортировки и чтение идет по индексу?
Ну тогда как сказал Леонид - минимизируй порцию фетча. Потом дофетчивай если необходимо.
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40022837
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Самое просто - на клиенте.

В Allround Automation PL/SQL Developer - кнопочка "Break (Shift+ESC)" иконка в виде молнии )))

Что бы не очень усердствовал и не мешал остальным - Oracle Database Resource Manager. Понижение приоритета, в т.ч. вплоть до убийства запроса на стороне сервера.

Но сама по себе Ваша постановка задачи не корректная:
1. Прервать выполнение по своему желанию и вместо корректного ответа выдать неконсистентные данные (т.е. просто "ЧУШЬ") - Oracle так не умеет, это не РосСтат. Oracle пытается выдать единственный и правильный (с его точки зрения ответ). Поговорка "есть правда, есть лож, а есть статистика" это не про него.
2. Если Вы выполняете реально осмысленную бизнес задачу и не можете дождаться ответа - то нужно эскалировать проблему выше. Менять структуру данных, технику, используемый инструмент.


На хороших серверах, видел FTS (full table scan) который работал примерно со скорость 2-3 ГигиБайта в секунду (дисковая полка на FC) на поток. Табличка в 45 гигабайт обрабатывалась от 20 секунд (в один поток) до 5-6 секунд (в четыре потока)

"Бытовые" SSD, на обычном рабочем месте (офисном компьютере) вполне будут давать 400-500 Mb/s при емкости до терабайта. Т.ч. оборудовать офисное рабочее место с персональной копией таблицы (хоть Oracle, хоть PostgreSQL) и ее анализировать (даже террабайт=2000 секунд=полчаса) - вполне посильная задача.

Не говоря уже о том, что сделайте копию, создайте на копии индексы по тем полям, которые Вам нужны, и не мучайтесь.
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40022845
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Egoр

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


Это, к сожалению, не конкретика.

Нужно понимать изначальную задачу, структура таблиц, план.

сортируется по индексу в порядке убывания
Само по себе OK, но есть "нюансы" ( C ) Чапаев
далее применяется неиндексируемое условие поиска
Т.е. индекс НЕ подходит для данной задачи/запроса.
сотне миллионов
Если доступ по индексу, то это НЕ FTS.

И тут может быть все значительно хуже.

( описываю своими словами, далеко от действительности, но аналогии думаю более-менее верные )

Данные в базе могут лежат фрагментированно. Поэтому вместо последовательной вычитки большого блока, Oracle может делать "сотню миллионов" обращений по одному блоку (в худшем случае). Соответственно производительность падает ниже плинтуса.

На одном из проектов (legacy система, Oracle CC&B, изменить структуру не могли) пришлось делать "сверх широкий" индекс, куда вставлять все поля из SELECT'а. Запрос стал выполняться ТОЛЬКО на индексе, который хранится более-менее упорядоченно, скорость возрасла на порядки (вместо 2-3 минут открытия экрана, стало < 15 секунд).

Разумеется возрос объем и должна была упасть скорость вставки в данную таблицу. Но по крайне мере система хоть как-то заработала.

Более правильный подход в нашем случае (запрос пытался вычислить текущую задолжность по account'у), был бы агригировать данные и не пытаться их расчитывать при входе на форму, но менять legacy код настолько серьезно мы не могли (не умели).
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40022945
Фотография Egoр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонид, вот запрос
Код: plsql
1.
2.
3.
4.
5.
6.
with r as
(select * from t_log where note like :note
  order by log_id desc
  fetch first 200 rows only)
select * from r left join t_log_details using (log_id)
 order by log_id desc


работает великолепно, когда в t_log по log_id desc достаточно достаточно записей, соответствующих note like :note.
Но если в t_log в по log_id desc есть только 199 записей like :note, а следующая только через сотню миллионов,
то БД честно сканирует все эти сто миллионов, хотя уже на первом десятке можно было бы и остановится,
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40022974
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Egoр,

В протоколе должна быть дата, протокол скорее всего уже разбит по периодам на партиции, попробуйте ограничить поиск разумным периодом.
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40022990
Фотография Egoр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
graycode,

Считай, что условие note like :note содержит необходимые разумные ограничения.

Можно совсем упростить задачу.
Как выбрать sample из миллиардной таблицы по неиндексируемому условию, ограничив время работы?
Успели попасть строки в выборку - показать. Не успели - пустая выборка.

Через PL не предлагать. Борщ варить я и сам умею. ;)
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40022993
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Egoр
Считай

Зачем?

Egoр
Можно совсем упростить задачу.
Как выбрать sample из миллиардной таблицы по неиндексируемому условию, ограничив время работы?
Успели попасть строки в выборку - показать. Не успели - пустая выборка.

Ограничьте время выполнения, будете получать ошибку вместо выборки.
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40023027
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Egoр,

на правах попробовать шютку

rownum < f_time200(rownum,sysdate,200)

в ф-ции if time work < xxx then return 200 else return 1 /* rownum-1 */ end if

.....
stax
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40023032
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
на правах попробовать шютку

rownum < f_time200(rownum,sysdate,200)
Не смешно. Предикат будет проверен для каждой из лярда строк.
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40023103
Фотография Владимир СА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм... Мне кажется, если таблица из лярда записей (даже при сотнях млн.), то именно партиции должны быть рассмотрены в работе.
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40023229
varlamovvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы посмотрел в сторону SAMPLE SQL Clause

https://blogs.oracle.com/machinelearning/to-sample-or-not-to-sample-part-2

Я использовал SAMPLE для оценки количества возвращаемых строк.
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40023319
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что бы возвращались First Rows, то, насколько я понимаю, в плане не должно быть сортировки (можно попытаться избежать за счет прохода по индексу), в плане должен быть Nested Loops.

Что бы было максимально быстро, пытаться исключить доступ к таблицам. Как минимум, что бы доступа к t_log не было вообще (только Index Full Scan)

Ну и партиционирование, обработка запросов в несколько потоков.

IMHO & AFAIK

p.s. постановка задачи "ищем по like сами незнаем что, лишь бы что-то нашлось". Очень напомнило ТЗ на "секретную" систему мониторинга трафика ФСО. Когда трафик свален в таблицы, но никаких адекватных критериев поиска по ним не сформулировано. И (не знаю как называется должность) кто-то эти таблицы смотрит в PL/SQL Developer'е пытаясь "уязвимости" обнаружить )))
p.p.s. По нормальному, нужно в отдельную таблицу ключевые слова типа Навальный, Соболь и прочее выносить и триггером или job'ом сразу и проверять ))) ни оператор ни аналитик тут не нужен. Агенты ЦРУ и так всем известны.
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40023334
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev

p.s. постановка задачи "ищем по like сами незнаем что, лишь бы что-то нашлось".

имхо сдесь проще (обычная ситуация)
анализируем лог (одна широкая табличка) по некоторому параметру

основной отбор по индексу (допустим ранже) и чтоб не было сортировки (в плане нет сортировки)

для анализа достаточно около 200 "первых" по индексу записей
все ок когда индекс+фильтр набирают 200 записей скажем в "первом по индексу" миддионе строк (напр за 10сек)

но есть фильтры, которые отбирают 199 записей в первом млн, следуящая 200 очень далеко по индеску
и доберемся до нее за 20 мин

Egoр хочет как-то указать что 199 тож хватает, и после 10сек поиска отрабатываем как для rownum<=199 (stop key)

sample по времени

.....
stax
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40023347
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,

А 198-ми записей хватит, а 20-ти, а одной, а если ни одной записи не будет получено за отведенное время, но записи там где то есть, хотя было это давно и неправда?
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40023353
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
graycode
Stax,

А 198-ми записей хватит, а 20-ти, а одной, а если ни одной записи не будет получено за отведенное время, но записи там где то есть, хотя было это давно и неправда?

имхо
неважно сколько (200 для примера привел)

select * from (select /*+ index (t ii) */ from t sample интервал order by ii) r where rownum<200

не важно скоко вернет, мож и 0 строк, если за интервал не доберется ни до одной

.....
stax
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40023362
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,

Автору топика уже предлагали ограничить выборку разумным интервалом по дате появления записи в таблице и вообще разбить на разделы, а лишний мусор удалить или слить в архив и затем удалить, однако автор упорно ищет философский камень.
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40023364
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
graycode
Stax,

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


уверен, он ето знает

ищет другие возможности, которых возможно еще нет

.....
stax
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40023381
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
Egoр,

на правах попробовать шютку

rownum < f_time200(rownum,sysdate,200)

в ф-ции if time work < xxx then return 200 else return 1 /* rownum-1 */ end if

.....
stax


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

SY.
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40023384
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,

тогда вернет 0, и возможно надо увеличивать интервал работы

.....
stax
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40023386
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
Stax
Egoр,

на правах попробовать шютку

rownum < f_time200(rownum,sysdate,200)

в ф-ции if time work < xxx then return 200 else return 1 /* rownum-1 */ end if

.....
stax


А теперь помедитируй сколько раз выполнится f_time200(rownum,sysdate,200). Сравни с например:

rownum < f_time200(rownum,sysdate,nvl2(col1,200,200))

Ну и в случае FULL SCAN время выполнения может быть превышено в разы пока дойдет до первой подходящей строки.

SY.


Соломон, большая просьба не злоупотреблять модераторскими возможностями для ЛИЧНЫХ целей.
Если ступил, недочитал или т.п. то лучше признай, а не подтирай свои следы.
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40023388
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на
авторА теперь помедитируй сколько раз выполнится f_time200(rownum,sysdate,200). Сравни с например:

rownum < f_time200(rownum,sysdate,nvl2(col1,200,200))

был ответ 22239790

.....
stax
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40023391
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic

Соломон, большая просьба не злоупотреблять модераторскими возможностями для ЛИЧНЫХ целей.
Если ступил, недочитал или т.п. то лучше признай, а не подтирай свои следы.


А что редактировать собственные сообщения может только модератор???

SY.
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40023394
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
которых возможно еще нет

А, возможно, есть.
- Для ad-hoc запросов при типовых в аналитике предикатах равенства (тождества) могут подойти bitmap-индексы.
- Для иных вариантов можно попробовать Orace Text или напрячься собственной реализацией доменного индекса для нечеткого поиска.
- Для прерывания по timeout можно, к примеру, швыряться no_data_needed из pipelined
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40023397
Фотография Egoр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax, спасибо

В таком виде заработало
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with r0 as
(select * from t_log order by log_id desc),
r1 as
(select * from r0 where rownum < 1e7),
r as
(select * from r1 where note like :note
  order by log_id desc
  fetch first 200 rows only)
select * from r left join t_log_details using (log_id)
 order by log_id desc

Так, наверное, даже правильнее. Таймаут-таймауту рознь.
А тут явно сказано, хошь-как-хошь, а 1е7 записей просмотри.
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40023398
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
А что редактировать собственные сообщения может только модератор???
К модератору гораздо выше планка.
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40023499
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Egoр,

Интересный способ удалять гланды через одно место ...
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40023763
Фотография Egoр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
graycode,

У вас есть юзфулл предожения?
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40023765
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смотреть план запроса.

С учетом "не заканчивается до победного конца" и "в таком виде заработало" не удивлюсь, если в исходном запросе Hash Join образовался.
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40023829
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Egoр,

Выше было много предложений ...

Ограничивать период по идентификатору довольно странное решение, могу предложить разве что получать идентификатор соответствующий вашему
Код: plsql
1.
2.
3.
4.
with r0 as
(select * from t_log order by log_id desc),
r1 as
(select * from r0 where rownum < 1e7),


и затем использовать его в select * from r1 where log_id > :p_id and note like :note, в зависимости от прироста объемов хватит на неделю или месяц.
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40023830
Правильный Вася
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Egoр
Аналитик я. Моя бизнес задача - проанализировать протокол в системе.
Я реально выдумываю условия поиска в зависимости от ситуации.

Т.е. никаких формальных правил нет?
Каждый раз новый поиск с новыми условиями по абсолютно любым полям протокола?
А они какого типа - тупо CLOB?

Если сортируется по log_id, то почему вместо выдирания всех протоколов с сортировкой в одном запросе не заменить на N запросов (по числу протоколов) с прямым отбором по log_id и уже доп.условиям? Это и быстрее выполняется, и ответы есть сразу, и можно остановиться на любом, не выполняя остальных.
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40023877
Фотография Egoр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
graycode,

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

А ваш последний вариант по сути есть усложнение моего.
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40023888
Фотография Egoр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правильный Вася,

Ага. примерно так.
Есть протокол. Есть некое внешнее неформализуемое событие.
Нужно просмотреть последние записи протокола, которые могут иметь отношение к этому событию.
Сколько этих записей - не известно.
Начинаю с двухсот. Если не хватает, то увеличиваю, 500, 1000, 5000 ...
И иной раз случается, что запсиси для выбранного условия в таблице заканчиваются.

Ваше предложение, честно говоря, не понял.
"заменить на N запросов по числе протоколов"? пртокол-то один.
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40024035
Правильный Вася
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Egoр
Ваше предложение, честно говоря, не понял.
"заменить на N запросов по числе протоколов"? пртокол-то один.

Из постановки задачи я понял, что log_id не уникальный, т.е. несколько записей относятся к одному протоколу, идентифицируемому этим log_id, а самих протоколов много. Тогда и можно брать протокол с конкретно его записями, а не все протоколы с их записями сразу.
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40024060
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Egoр
А ваш последний вариант по сути есть усложнение моего.

Чего чего? С этого момента поподробнее пожалуйста, в чем усложнение?
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40024174
Melkomyagkii_newbi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Egoр
Леонид, вот запрос
Код: plsql
1.
2.
3.
4.
5.
6.
with r as
(select * from t_log where note like :note
  order by log_id desc
  fetch first 200 rows only)
select * from r left join t_log_details using (log_id)
 order by log_id desc


работает великолепно, когда в t_log по log_id desc достаточно достаточно записей, соответствующих note like :note.
Но если в t_log в по log_id desc есть только 199 записей like :note, а следующая только через сотню миллионов,
то БД честно сканирует все эти сто миллионов, хотя уже на первом десятке можно было бы и остановится,


если бы :note были вида 'SMTH%' то помогло бы создание индекса по note.
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40024200
Фотография Egoр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
graycode
Egoр
А ваш последний вариант по сути есть усложнение моего.

Чего чего? С этого момента поподробнее пожалуйста, в чем усложнение?

Для log_id > :p_id нужен :p_id
Получить :p_id, соответствующий моему rownum < 1e7, можно через условие rownum < 1e7
Но зачем получать :p_id и подставлять его в log_id > :p_id, если уже rownum < 1e7
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40024392
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Egoр
Но зачем получать :p_id и подставлять его в log_id > :p_id, если уже rownum < 1e7

Наверное чтобы каждый раз не выполнять rownum < 1e7, не?
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40024954
Фотография Egoр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
graycode,

Если каждый раз не выполнять, то по любому будет читаться 1e7 записей минимум.
Каждый раз кол-во записей будет не меньше предыдущего.
То есть, прочитано будет не меньше записей, чем в моем варианте.
Значит и выигрыша не будет.
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40025361
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Egoр,

Не надо фантазировать.
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40025402
Фотография Egoр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
graycode, у вас есть гипотеза?
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40025544
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Egoр

Есть протокол. Есть некое внешнее неформализуемое событие.
Нужно просмотреть последние записи протокола, которые могут иметь отношение к этому событию.
Сколько этих записей - не известно.
Начинаю с двухсот. Если не хватает, то увеличиваю, 500, 1000, 5000 ...


Прикольная задача. Типа результат нужен ASAP?

Чтобы был честный таймаут, пропусти запрос

select * from t_log order by log_id desc

через PIPELINE функцию, в которой следи за тайматом.

Через переменную в глобальном контексте можно будет даже завершать сканирование лога по требованию из отдельной сессии, если результат запроса уже нужен.

И немного практической теории.

Нужно установить оптимизатору SQL запросов цель FIRS_ROWS (OPTIMIZER_MODE). И избегать операций, которые для выполнения требуют полного набора данных.

Поскольку приложение клиента может тянуть записи сервера блоками, нужно ограничить размер такого блока 1 по крайней мере для выборки записей, которые нужны ASAP. Тогда система не будет ждать наполнения маршрутки большого блока (которое может и не случиться), а сразу вернёт первые записи. А дальше по желанию, можно будет выбирать оставшиеся записи.
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40026104
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Just for fun решение с помощью параллельного concurrent union-all, где в одной части реальный запрос, а во-второй тупо таймаут:
3 seconds
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
SQL> ho cat tests/stop/stop1.sql
with
function f_raise return int as
begin
   raise NO_DATA_NEEDED;
end;

v(start_hsecs, delta, flag) as (
  select
    hsecs as start_hsecs,
    0 as delta,
    1 as flag
  from v$timer
  union all
  select
    v.start_hsecs,
    (t.hsecs-v.start_hsecs)/100 as delta,
    case when (t.hsecs-v.start_hsecs)/100 > 3 /* seconds */
           then
             --v.flag*-1 -- return last row
             --v.flag/0 -- raise ORA-01447: divisor is equal to zero
             f_raise()
           else v.flag+1
    end as flag
  from v, v$timer t
  where v.flag>0
   and t.hsecs>=v.start_hsecs
)
select --+ pq_concurrent_union
*
from (
   select
     a
   from (select level a from dual connect by level<15) o2
     union all
   select
     flag
   from v
   where flag<=0
);
/
SQL> set arrays 5
SQL> @tests/stop/stop1.sql

         A
----------
         1
         2
         3
         4
         5
         6
         7
         8
         9
        10
ERROR:
ORA-06548: no more rows needed
ORA-06512: at line 5

10 rows selected.

Elapsed: 00:00:03.14



зы. спасибо, SeaGate за фикс с TTT
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40026107
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
стоп, правка - предыдущее еще не работает так как надо из-за PX SELECTOR (он выполняется в координаторе)
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40026120
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
хотя не, все ок - все вроде работает:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
with
function f_raise return int as
begin
   raise NO_DATA_NEEDED;
end;

v(start_hsecs, delta, flag) as (
  select
    hsecs as start_hsecs,
    0 as delta,
    1 as flag
  from v$timer
  union all
  select
    v.start_hsecs,
    (t.hsecs-v.start_hsecs)/100 as delta,
    case when (t.hsecs-v.start_hsecs)/100 > 3 /* seconds */
           then
             --v.flag*-1 -- return last row
             --v.flag/0 -- raise ORA-01447: divisor is equal to zero
             f_raise()
           else v.flag+1
    end as flag
  from v, v$timer t
  where v.flag>0
   and t.hsecs>=v.start_hsecs
)
select --+ pq_concurrent_union
*
from (
   select 
     a
   from (select level a from dual connect by level<1e7) o2
     union all
   select
     flag
   from v
   where flag<=0
);
/

          A
-----------
           1
           2
           3
...skipped...
      6397
      6398
      6399
      6400
ERROR:
ORA-12801: error signaled in parallel query server P001
ORA-06548: no more rows needed
ORA-06512: at line 5



6400 rows selected.

Elapsed: 00:00:04.73

plan
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
Plan hash value: 2762812321

--------------------------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                                      | Name     | E-Rows |E-Bytes| Cost (%CPU)| E-Time   |    TQ  |IN-OUT| PQ Distrib |  OMem |  1Mem | Used-Mem |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                               |          |        |       |     2 (100)|          |        |      |            |       |       |          |
|   1 |  PX COORDINATOR                                |          |        |       |            |          |        |      |            | 73728 | 73728 |          |
|   2 |   PX SEND QC (RANDOM)                          | :TQ10000 |      3 |    39 |     2   (0)| 00:00:01 |  Q1,00 | P->S | QC (RAND)  |       |       |          |
|   3 |    VIEW                                        |          |      3 |    39 |     2   (0)| 00:00:01 |  Q1,00 | PCWP |            |       |       |          |
|   4 |     UNION-ALL                                  |          |        |       |            |          |  Q1,00 | PCWP |            |       |       |          |
|   5 |      PX SELECTOR                               |          |        |       |            |          |  Q1,00 | PCWP |            |       |       |          |
|   6 |       VIEW                                     |          |      1 |    13 |     2   (0)| 00:00:01 |  Q1,00 | PCWP |            |       |       |          |
|   7 |        CONNECT BY WITHOUT FILTERING            |          |        |       |            |          |  Q1,00 | PCWP |            | 73728 | 73728 |          |
|   8 |         FAST DUAL                              |          |      1 |       |     2   (0)| 00:00:01 |  Q1,00 | PCWP |            |       |       |          |
|   9 |      PX SELECTOR                               |          |        |       |            |          |  Q1,00 | PCWP |            |       |       |          |
|* 10 |       VIEW                                     |          |      2 |    26 |     0   (0)|          |  Q1,00 | PCWP |            |       |       |          |
|  11 |        UNION ALL (RECURSIVE WITH) BREADTH FIRST|          |        |       |            |          |  Q1,00 | PCWP |            |  2048 |  2048 | 2048  (0)|
|* 12 |         FIXED TABLE FULL                       | X$KSUTM  |      1 |    12 |     0   (0)|          |  Q1,00 | PCWP |            |       |       |          |
|  13 |         NESTED LOOPS                           |          |      1 |    38 |     0   (0)|          |  Q1,00 | PCWP |            |       |       |          |
|  14 |          RECURSIVE WITH PUMP                   |          |        |       |            |          |  Q1,00 | PCWP |            |       |       |          |
|* 15 |          FIXED TABLE FULL                      | X$KSUTM  |      1 |    12 |     0   (0)|          |  Q1,00 | PCWP |            |       |       |          |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------

Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------

   1 - SEL$9
   3 - SET$2        / from$_subquery$_004@SEL$9
   4 - SET$2
   6 - SEL$11       / O2@SEL$10
   7 - SEL$11
   8 - SEL$11       / DUAL@SEL$11
  10 - SET$1        / V@SEL$12
  11 - SET$1
  12 - SEL$88122447 / X$KSUTM@SEL$4
  13 - SEL$314B0EE1
  15 - SEL$314B0EE1 / X$KSUTM@SEL$8

Predicate Information (identified by operation id):
---------------------------------------------------

  10 - filter("FLAG"<=0)
  12 - filter((INTERNAL_FUNCTION("CON_ID") AND "INST_ID"=USERENV('INSTANCE')))
  15 - filter(("KSUTMTIM">="V"."START_HSECS" AND INTERNAL_FUNCTION("CON_ID") AND "INST_ID"=USERENV('INSTANCE')))


RTSM report
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
SQL Monitoring Report

SQL Text
------------------------------
with function f_raise return int as begin raise NO_DATA_NEEDED; end; v(start_hsecs, delta, flag) as ( select hsecs as start_hsecs, 0 as delta, 1 as flag from v$timer union all select v.start_hsecs, (t.hsecs-v.start_hsecs)/100 as delta, case when (t.hsecs-v.start_hsecs)/100 > 3 /* seconds */ then --v
.flag*-1 -- return last row --v.flag/0 -- raise ORA-01447: divisor is equal to zero f_raise() else v.flag+1 end as flag from v, v$timer t where v.flag>0 and t.hsecs>=v.start_hsecs ) select --+
pq_concurrent_union * from ( select a from (select level a from dual connect by level<1e7) o2 union all select flag from v where flag<=0 )

Error: ORA-12801
------------------------------
ORA-12801: error signaled in parallel query server P001
ORA-06548: no more rows needed
ORA-06512: at line 5


Global Information
------------------------------
 Status              :  DONE (ERROR)
 Instance ID         :  1
 Session             :  SYS (507:8917)
 SQL ID              :  2zcsk1c02wd7z
 SQL Execution ID    :  16777216
 Execution Started   :  12/09/2020 17:26:49
 First Refresh Time  :  12/09/2020 17:26:49
 Last Refresh Time   :  12/09/2020 17:26:53
 Duration            :  4s
 Module/Action       :  SQL*Plus/-
 Service             :  pdb1
 Program             :  sqlplus.exe
 Fetch Calls         :  66

Global Stats
=================================================================
| Elapsed |   Cpu   |    IO    | Fetch | Buffer | Write | Write |
| Time(s) | Time(s) | Waits(s) | Calls |  Gets  | Reqs  | Bytes |
=================================================================
|    4.39 |    4.26 |     0.12 |    66 |     4M |    76 |  15MB |
=================================================================

Parallel Execution Details (DOP=2 , Servers Allocated=2)
==========================================================================================================
|      Name      | Type  | Server# | Elapsed |   Cpu   |    IO    | Buffer | Write | Write | Wait Events |
|                |       |         | Time(s) | Time(s) | Waits(s) |  Gets  | Reqs  | Bytes | (sample #)  |
==========================================================================================================
| PX Coordinator | QC    |         |    0.00 |    0.00 |          |        |       |     . |             |
| p000           | Set 1 |       1 |    0.00 |    0.00 |          |        |       |     . |             |
| p001           | Set 1 |       2 |    4.38 |    4.26 |     0.12 |     4M |    76 |  15MB |             |
==========================================================================================================

SQL Plan Monitoring Details (Plan Hash Value=2762812321)
==========================================================================================================================================================================================
| Id |                    Operation                     |   Name   |  Rows   | Cost |   Time    | Start  | Execs |   Rows   | Write | Write |  Mem  | Temp  | Activity | Activity Detail |
|    |                                                  |          | (Estim) |      | Active(s) | Active |       | (Actual) | Reqs  | Bytes | (Max) | (Max) |   (%)    |   (# samples)   |
==========================================================================================================================================================================================
|  0 | SELECT STATEMENT                                 |          |         |      |         5 |     +0 |     3 |     6455 |       |       |     . |     . |          |                 |
|  1 |   PX COORDINATOR                                 |          |         |      |         5 |     +0 |     3 |     6455 |       |       |     . |     . |          |                 |
|  2 |    PX SEND QC (RANDOM)                           | :TQ10000 |       3 |    2 |         3 |     +2 |     2 |    12409 |       |       |     . |     . |          |                 |
|  3 |     VIEW                                         |          |       3 |    2 |         3 |     +2 |     2 |    12409 |       |       |     . |     . |          |                 |
|  4 |      UNION-ALL                                   |          |         |      |         3 |     +2 |     2 |    12409 |       |       |     . |     . |          |                 |
|  5 |       PX SELECTOR                                |          |         |      |         3 |     +2 |     2 |    12409 |       |       |     . |     . |          |                 |
|  6 |        VIEW                                      |          |       1 |    2 |         3 |     +2 |     1 |    12409 |       |       |     . |     . |          |                 |
|  7 |         CONNECT BY WITHOUT FILTERING             |          |         |      |         3 |     +2 |     1 |    12409 |       |       |     . |     . |          |                 |
|  8 |          FAST DUAL                               |          |       1 |    2 |         1 |     +2 |     1 |        1 |       |       |     . |     . |          |                 |
|  9 |       PX SELECTOR                                |          |         |      |           |        |     1 |          |       |       |     . |     . |          |                 |
| 10 |        VIEW                                      |          |       2 |      |         3 |     +2 |     1 |        0 |       |       |     . |     . |          |                 |
| 11 |         UNION ALL (RECURSIVE WITH) BREADTH FIRST |          |         |      |         4 |     +1 |     1 |     566K |    76 |  15MB |  31MB |  16MB |   100.00 | Cpu (4)         |
| 12 |          FIXED TABLE FULL                        | X$KSUTM  |       1 |      |         1 |     +2 |     1 |        1 |       |       |     . |     . |          |                 |
| 13 |          NESTED LOOPS                            |          |       1 |      |         3 |     +2 |  566K |     566K |       |       |     . |     . |          |                 |
| 14 |           RECURSIVE WITH PUMP                    |          |         |      |         3 |     +2 |  566K |     566K |       |       |     . |     . |          |                 |
| 15 |           FIXED TABLE FULL                       | X$KSUTM  |       1 |      |         3 |     +2 |  566K |     566K |       |       |     . |     . |          |                 |
==========================================================================================================================================================================================


1 row selected.

...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40026157
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender
Код: plsql
1.
2.
3.
4.
5.
6.
      6399
      6400
ERROR:
ORA-12801: error signaled in parallel query server P001
ORA-06548: no more rows needed
ORA-06512: at line 5


Ну говорил жеж - из pipelined швырять ее надо, а не разбрасывать где попало :)
Воспроизвести аналогичный предложенному эффект при этом можно посредством parallel pipelined.
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40026221
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
andrey_anonymous,

pipeline слишком просто и скучно, к тому же требует создания объектов, жесткой привязки к запросу, да и одним чистым pipeline без какого-нибудь трюка типа этого не получится - если внутри pipeline функции у тебя будет "бесконечный" запрос, который "уйдет в себя", то в pl/sql управление не вернется. С PTF (polymorphic table functions) было бы чуточку интереснее, но все равно в-основном скучный кодинг...
а тут все в одном простом запросе. Изначально вообще была более простая идея для хохмы: написать pure sql запрос, который сам закончится по таймауту - это оказалось совсем легко:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
with v(start_hsecs, delta, flag) as (
  select
    hsecs as start_hsecs,
    0 as delta,
    1 as flag
  from v$timer
  union all
  select
    v.start_hsecs,
    (t.hsecs-v.start_hsecs)/100 as delta,
    case when (t.hsecs-v.start_hsecs)/100 > 3 /* seconds */
           then
             v.flag*-1 -- return last row
             --v.flag/0 -- raise ORA-01447: divisor is equal to zero
             --f_raise()
           else v.flag+1
    end as flag
  from v, v$timer t
  where v.flag>0
   and t.hsecs>=v.start_hsecs
)
select *
from v
where flag<0;

START_HSECS      DELTA       FLAG
----------- ---------- ----------
   73402666       3.01    -479586

Elapsed: 00:00:03.01


оказалось слишком просто, поэтому добавил "типа реальный запрос с данными"
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40026223
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
В целом, если уж решать такое в реальной задаче для продуктива, то совершенно логично, что делалось бы стандартными средствами (в порядке убывания распространнености решений):
1. обычный запрос + клиентское прерыванием запроса ("ORA-01013: user requested cancel of current operation");
2. Resource manager с лимитами (со своими общеизвестными нюансами);
3. запуск запроса в отдельном процессе/джобе и передача результатов через стандартные же средства межпроцессорного взаимодействия, типа dbms_pipe, с стандартными же вариантами прерывания этого процесса, типа cancel sql
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40027662
Фотография SeaGate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Staxмож в следующих версиях добавят SAMPLE TIME (шучу конечно)


Есть недокументированный _query_execution_time_limit. Трассируется через oradebug component time_limit. В описании указано "Query execution time limit in seconds". Тесты в 19.3 для определенного класса запросов с разным значением параметра:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
SQL> @time_limit
SQL> set echo on
SQL>
SQL> conn tc/tc@localhost/pdb
Connected.
SQL>
SQL> set timing on
SQL>
SQL> select count(*) from sys.obj$, sys.obj$;

  COUNT(*)
----------
 529690225

Elapsed: 00:00:11.72
SQL>
SQL> alter session set events 'trace[time_limit]';

Session altered.

Elapsed: 00:00:00.00
SQL>
SQL> alter session set "_query_execution_time_limit"=1;

Session altered.

Elapsed: 00:00:00.00
SQL> select count(*) from sys.obj$, sys.obj$;

  COUNT(*)
----------
   8968150

Elapsed: 00:00:00.80
SQL> select count(*) from sys.obj$, sys.obj$, sys.obj$;

  COUNT(*)
----------
   9604309

Elapsed: 00:00:00.88
SQL> select count(*) from sys.obj$, sys.obj$, sys.obj$, sys.obj$;

  COUNT(*)
----------
   9686108

Elapsed: 00:00:00.91
SQL> alter session set "_query_execution_time_limit"=2;

Session altered.

Elapsed: 00:00:00.00
SQL> select count(*) from sys.obj$, sys.obj$;

  COUNT(*)
----------
  16994136

Elapsed: 00:00:01.60
SQL> select count(*) from sys.obj$, sys.obj$, sys.obj$;

  COUNT(*)
----------
  19177667

Elapsed: 00:00:01.75
SQL> select count(*) from sys.obj$, sys.obj$, sys.obj$, sys.obj$;

  COUNT(*)
----------
  19247635

Elapsed: 00:00:01.82
SQL> alter session set "_query_execution_time_limit"=4;

Session altered.

Elapsed: 00:00:00.00
SQL> select count(*) from sys.obj$, sys.obj$;

  COUNT(*)
----------
  36334656

Elapsed: 00:00:03.20
SQL> select count(*) from sys.obj$, sys.obj$, sys.obj$;

  COUNT(*)
----------
  38554782

Elapsed: 00:00:03.50
SQL> select count(*) from sys.obj$, sys.obj$, sys.obj$, sys.obj$;

  COUNT(*)
----------
  39392890

Elapsed: 00:00:03.64
SQL> alter session set "_query_execution_time_limit"=8;

Session altered.

Elapsed: 00:00:00.00
SQL> select count(*) from sys.obj$, sys.obj$;

  COUNT(*)
----------
  72226768

Elapsed: 00:00:06.40
SQL> select count(*) from sys.obj$, sys.obj$, sys.obj$;

  COUNT(*)
----------
  75848093

Elapsed: 00:00:07.00
SQL> select count(*) from sys.obj$, sys.obj$, sys.obj$, sys.obj$;

  COUNT(*)
----------
  78749244

Elapsed: 00:00:07.28
SQL> alter session set "_query_execution_time_limit"=0;

Session altered.

Elapsed: 00:00:00.00
SQL> select count(*) from sys.obj$, sys.obj$;

  COUNT(*)
----------
 529690225

Elapsed: 00:00:11.72
SQL>
SQL> alter session set events 'trace[time_limit] off';

Session altered.

Elapsed: 00:00:00.00


Наблюдается определенный паттерн в том, через какое время прерывается этот класс запросов:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
[oracle@myhostname trace]$ grep --no-group-separator -A1 opiSetupTimeLimitCtx orcl_ora_2737.trc
        opiSetupTimeLimitCtx(): Row source stop times (current = 2336498755.0000
        00, limitPerNode = 200000.000000, timelimt = 1000000)
        opiSetupTimeLimitCtx(): Row source stop times (current = 2337299841.0000
        00, limitPerNode = 125000.000000, timelimt = 1000000)
        opiSetupTimeLimitCtx(): Row source stop times (current = 2338175746.0000
        00, limitPerNode = 90909.090909, timelimt = 1000000)
        opiSetupTimeLimitCtx(): Row source stop times (current = 2339085960.0000
        00, limitPerNode = 400000.000000, timelimt = 2000000)
        opiSetupTimeLimitCtx(): Row source stop times (current = 2340686668.0000
        00, limitPerNode = 250000.000000, timelimt = 2000000)
        opiSetupTimeLimitCtx(): Row source stop times (current = 2342437536.0000
        00, limitPerNode = 181818.181818, timelimt = 2000000)
        opiSetupTimeLimitCtx(): Row source stop times (current = 2344256865.0000
        00, limitPerNode = 800000.000000, timelimt = 4000000)
        opiSetupTimeLimitCtx(): Row source stop times (current = 2347457649.0000
        00, limitPerNode = 500000.000000, timelimt = 4000000)
        opiSetupTimeLimitCtx(): Row source stop times (current = 2350958501.0000
        00, limitPerNode = 363636.363636, timelimt = 4000000)
        opiSetupTimeLimitCtx(): Row source stop times (current = 2354595996.0000
        00, limitPerNode = 1600000.000000, timelimt = 8000000)
        opiSetupTimeLimitCtx(): Row source stop times (current = 2360996788.0000
        00, limitPerNode = 1000000.000000, timelimt = 8000000)
        opiSetupTimeLimitCtx(): Row source stop times (current = 2367997594.0000
        00, limitPerNode = 727272.727273, timelimt = 8000000)


Судя по всему, limitPerNode = timelimt / (execution_plan_lines-1) (исключаем SELECT STATEMENT). Если так, то это можно использовать, чтобы получить окончание запроса в точное время.
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40027669
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SeaGate
Есть недокументированный _query_execution_time_limit.

хах, забыл про него за 5 с половиной лет
появился в 12.1.0.2: https://www.freelists.org/post/oracle-l/query-execution-time-limit,1
...
Рейтинг: 0 / 0
Ограничить выборку по таймауту?
    #40027673
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeaGate,

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

тут недавно ссылку давали, так там подсмотрел что в новых версияях отличную команду открылы для дба

ALTER SYSTEM CANCEL SQL

мож из дебагера вытащили наружу

.....
stax
...
Рейтинг: 0 / 0
64 сообщений из 64, показаны все 3 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Ограничить выборку по таймауту?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]