|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
Хай, олл! есть таблица с протоколом, как водится, сдоровенная. есть разные условия на отбор записей. по одним десяток записей, по другим десяток тысяч. Все записи не нужны. Достаточно пары сотен. Для условий, где записей много, отлично работает rownum < 200 А условия, где всего пяток записей, ТFS не заканчивается до победного конца. Протокол все больше - конец все дальше. Можно как-то ограничить выборку, например, временем выполнения? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2020, 14:16 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
AFAIK Ограничить можно через Oracle Database Resource Manager но он сможет или прерывать выполнение запроса или понижать его приоритет p.s. Что такое "TFS", который не заканчивается, - я не знаю ))) p.p.s. Попытка лечить следствия, а не причину. Нужно обсуждать какие реальные (а не выдуманные анал итиками) бизнес задачи есть, их реализовывать, создавать индексы (возможно переделывать структуру таблицы или делать matview) для реально требуемых по бизнесу запросов. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2020, 14:31 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
Кобанчег, Leonid, спасибо. Но вопрос не в том, чтобы прервать выполнение и вернуть ошибку. А выполнять запрос, например, минуту, и вернуть тот набор записей, который успел за минуту собраться. TFS - table full scan. Аналитик я. Моя бизнес задача - проанализировать протокол в системе. Я реально выдумываю условия поиска в зависимости от ситуации. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2020, 15:34 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
Egoр ... А выполнять запрос, например, минуту, и вернуть тот набор записей, который успел за минуту собраться. ... Oracle и так возврашает данные в тот момент, когда они готовы в процессе fetch'а. Т.ч. проблема НЕ сервера, а клиента. Пусть он уже готовые/зафетченные данные показывает сразу, не ожидая получения всего результата запроса Например Allround Automation PL/SQL Developer ровно так и работает. Показывает начало(готовые данные), а остаток запрашивает/показывает по мере нажатия кнопочек (fetch next, fetch all) пользователем. Если за минуту ничего не показывается, то значит, что за минуту ничего и не найдено IMHO & AFAIK p.s. пока все выглядит как надуманная проблема ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2020, 15:41 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
SY Что делать Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2020, 15:48 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
Egoр вернуть тот набор записей, который успел за минуту собраться Например, есть аналитика и должна выполнится тяжелая сортировка или банально тяжелый group by. Про много таблиц и говорить не стоит. В некоторых случаях может помочь хинт first_rows. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2020, 15:52 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
Egoр, Разбить протокол на партиции, ненужные и устаревшие данные удалить. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2020, 15:54 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
Кобанчег Я много чего листал, но что же я там должен был видеть? Что делать “_exadata_feature_on”=true нельзя? Каюсь, забыл. Конечно можно, это же не у нас где за нарушение лицензии ой как схлопочешь . SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2020, 16:00 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev Oracle и так возврашает данные в тот момент, когда они готовы в процессе fetch'а. Когда готовы - возвращает, а когда не готовы, то он их усиленно готовит. Хочется ему сказать, чтобы он не слишком уж усердствовал. Ограничить его количеством найденных записей я могу легко. А как ограничить потраченным на поиск временем? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2020, 16:40 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
Кобанчег Egoр вернуть тот набор записей, который успел за минуту собраться Например, есть аналитика и должна выполнится тяжелая сортировка или банально тяжелый group by. Про много таблиц и говорить не стоит. В некоторых случаях может помочь хинт first_rows. конкретика такая. протокол, очищенный от лишних данных , сортируется по индексу в порядке убывания далее применяется неиндексируемое условие поиска нужно вывести первые две сотни записей. когда под условие попадает много записей, тыщща из первого миллиона, то результат прилетает за секунду. А когда в первой сотне миллионов только 50 нужных записей, то счет идет уже на минуты. Сколько конкртено записей не известно. Известно только, что нужные записи наверху протокола. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2020, 16:52 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
graycode Egoр, Разбить протокол на партиции, ненужные и устаревшие данные удалить. так и подмывает сказать "не спортивно". поправил предыдущее сообщение ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2020, 16:59 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
Egoр А как ограничить потраченным на поиск временем? мож в следующих версиях добавят SAMPLE TIME (шучу конечно) имхо ТFS прервать по времени нельзя (по крайней мере в старых версиях) и странно ето выглядит для непростейшего select * from t на каком етапе плана прерывать .... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2020, 17:05 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
Egoр Кобанчег пропущено... За минуту может быть готово для фетча ровно ноль записей даже если в запросе одна таблица. Например, есть аналитика и должна выполнится тяжелая сортировка или банально тяжелый group by. Про много таблиц и говорить не стоит. В некоторых случаях может помочь хинт first_rows. конкретика такая. протокол, очищенный от лишних данных , сортируется по индексу в порядке убывания далее применяется неиндексируемое условие поиска нужно вывести первые две сотни записей. когда под условие попадает много записей, тыщща из первого миллиона, то результат прилетает за секунду. А когда в первой сотне миллионов только 50 нужных записей, то счет идет уже на минуты. Сколько конкртено записей не известно. Известно только, что нужные записи наверху протокола. Ну тогда как сказал Леонид - минимизируй порцию фетча. Потом дофетчивай если необходимо. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2020, 17:09 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
Самое просто - на клиенте. В 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 секунд=полчаса) - вполне посильная задача. Не говоря уже о том, что сделайте копию, создайте на копии индексы по тем полям, которые Вам нужны, и не мучайтесь. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2020, 17:11 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
Egoр протокол, очищенный от лишних данных , сортируется по индексу в порядке убывания далее применяется неиндексируемое условие поиска нужно вывести первые две сотни записей. когда под условие попадает много записей, тыщща из первого миллиона, то результат прилетает за секунду. А когда в первой сотне миллионов только 50 нужных записей, то счет идет уже на минуты. Сколько конкртено записей не известно. Известно только, что нужные записи наверху протокола. Это, к сожалению, не конкретика. Нужно понимать изначальную задачу, структура таблиц, план. сортируется по индексу в порядке убывания Само по себе OK, но есть "нюансы" ( C ) Чапаев далее применяется неиндексируемое условие поиска Т.е. индекс НЕ подходит для данной задачи/запроса. сотне миллионов Если доступ по индексу, то это НЕ FTS. И тут может быть все значительно хуже. ( описываю своими словами, далеко от действительности, но аналогии думаю более-менее верные ) Данные в базе могут лежат фрагментированно. Поэтому вместо последовательной вычитки большого блока, Oracle может делать "сотню миллионов" обращений по одному блоку (в худшем случае). Соответственно производительность падает ниже плинтуса. На одном из проектов (legacy система, Oracle CC&B, изменить структуру не могли) пришлось делать "сверх широкий" индекс, куда вставлять все поля из SELECT'а. Запрос стал выполняться ТОЛЬКО на индексе, который хранится более-менее упорядоченно, скорость возрасла на порядки (вместо 2-3 минут открытия экрана, стало < 15 секунд). Разумеется возрос объем и должна была упасть скорость вставки в данную таблицу. Но по крайне мере система хоть как-то заработала. Более правильный подход в нашем случае (запрос пытался вычислить текущую задолжность по account'у), был бы агригировать данные и не пытаться их расчитывать при входе на форму, но менять legacy код настолько серьезно мы не могли (не умели). ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2020, 17:30 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
Леонид, вот запрос Код: plsql 1. 2. 3. 4. 5. 6.
работает великолепно, когда в t_log по log_id desc достаточно достаточно записей, соответствующих note like :note. Но если в t_log в по log_id desc есть только 199 записей like :note, а следующая только через сотню миллионов, то БД честно сканирует все эти сто миллионов, хотя уже на первом десятке можно было бы и остановится, ... |
|||
:
Нравится:
Не нравится:
|
|||
28.11.2020, 11:12 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
Egoр, В протоколе должна быть дата, протокол скорее всего уже разбит по периодам на партиции, попробуйте ограничить поиск разумным периодом. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.11.2020, 13:31 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
graycode, Считай, что условие note like :note содержит необходимые разумные ограничения. Можно совсем упростить задачу. Как выбрать sample из миллиардной таблицы по неиндексируемому условию, ограничив время работы? Успели попасть строки в выборку - показать. Не успели - пустая выборка. Через PL не предлагать. Борщ варить я и сам умею. ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.11.2020, 15:15 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
Egoр Считай Зачем? Egoр Можно совсем упростить задачу. Как выбрать sample из миллиардной таблицы по неиндексируемому условию, ограничив время работы? Успели попасть строки в выборку - показать. Не успели - пустая выборка. Ограничьте время выполнения, будете получать ошибку вместо выборки. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.11.2020, 15:36 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
Egoр, на правах попробовать шютку rownum < f_time200(rownum,sysdate,200) в ф-ции if time work < xxx then return 200 else return 1 /* rownum-1 */ end if ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
28.11.2020, 18:24 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
Stax на правах попробовать шютку rownum < f_time200(rownum,sysdate,200) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.11.2020, 19:18 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
Хм... Мне кажется, если таблица из лярда записей (даже при сотнях млн.), то именно партиции должны быть рассмотрены в работе. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2020, 07:28 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
Я бы посмотрел в сторону SAMPLE SQL Clause https://blogs.oracle.com/machinelearning/to-sample-or-not-to-sample-part-2 Я использовал SAMPLE для оценки количества возвращаемых строк. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2020, 01:09 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
Что бы возвращались First Rows, то, насколько я понимаю, в плане не должно быть сортировки (можно попытаться избежать за счет прохода по индексу), в плане должен быть Nested Loops. Что бы было максимально быстро, пытаться исключить доступ к таблицам. Как минимум, что бы доступа к t_log не было вообще (только Index Full Scan) Ну и партиционирование, обработка запросов в несколько потоков. IMHO & AFAIK p.s. постановка задачи "ищем по like сами незнаем что, лишь бы что-то нашлось". Очень напомнило ТЗ на "секретную" систему мониторинга трафика ФСО. Когда трафик свален в таблицы, но никаких адекватных критериев поиска по ним не сформулировано. И (не знаю как называется должность) кто-то эти таблицы смотрит в PL/SQL Developer'е пытаясь "уязвимости" обнаружить ))) p.p.s. По нормальному, нужно в отдельную таблицу ключевые слова типа Навальный, Соболь и прочее выносить и триггером или job'ом сразу и проверять ))) ни оператор ни аналитик тут не нужен. Агенты ЦРУ и так всем известны. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2020, 12:57 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev p.s. постановка задачи "ищем по like сами незнаем что, лишь бы что-то нашлось". имхо сдесь проще (обычная ситуация) анализируем лог (одна широкая табличка) по некоторому параметру основной отбор по индексу (допустим ранже) и чтоб не было сортировки (в плане нет сортировки) для анализа достаточно около 200 "первых" по индексу записей все ок когда индекс+фильтр набирают 200 записей скажем в "первом по индексу" миддионе строк (напр за 10сек) но есть фильтры, которые отбирают 199 записей в первом млн, следуящая 200 очень далеко по индеску и доберемся до нее за 20 мин Egoр хочет как-то указать что 199 тож хватает, и после 10сек поиска отрабатываем как для rownum<=199 (stop key) sample по времени ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2020, 13:44 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
Stax, А 198-ми записей хватит, а 20-ти, а одной, а если ни одной записи не будет получено за отведенное время, но записи там где то есть, хотя было это давно и неправда? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2020, 14:28 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
graycode Stax, А 198-ми записей хватит, а 20-ти, а одной, а если ни одной записи не будет получено за отведенное время, но записи там где то есть, хотя было это давно и неправда? имхо неважно сколько (200 для примера привел) select * from (select /*+ index (t ii) */ from t sample интервал order by ii) r where rownum<200 не важно скоко вернет, мож и 0 строк, если за интервал не доберется ни до одной ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2020, 14:45 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
Stax, Автору топика уже предлагали ограничить выборку разумным интервалом по дате появления записи в таблице и вообще разбить на разделы, а лишний мусор удалить или слить в архив и затем удалить, однако автор упорно ищет философский камень. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2020, 14:59 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
graycode Stax, Автору топика уже предлагали ограничить выборку разумным интервалом по дате появления записи в таблице и вообще разбить на разделы, а лишний мусор удалить или слить в архив и затем удалить, однако автор упорно ищет философский камень. уверен, он ето знает ищет другие возможности, которых возможно еще нет ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2020, 15:03 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
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. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2020, 15:38 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
SY, тогда вернет 0, и возможно надо увеличивать интервал работы ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2020, 15:41 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
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. Соломон, большая просьба не злоупотреблять модераторскими возможностями для ЛИЧНЫХ целей. Если ступил, недочитал или т.п. то лучше признай, а не подтирай свои следы. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2020, 15:45 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
на авторА теперь помедитируй сколько раз выполнится f_time200(rownum,sysdate,200). Сравни с например: rownum < f_time200(rownum,sysdate,nvl2(col1,200,200)) был ответ 22239790 ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2020, 15:50 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
Elic Соломон, большая просьба не злоупотреблять модераторскими возможностями для ЛИЧНЫХ целей. Если ступил, недочитал или т.п. то лучше признай, а не подтирай свои следы. А что редактировать собственные сообщения может только модератор??? SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2020, 15:57 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
Stax которых возможно еще нет А, возможно, есть. - Для ad-hoc запросов при типовых в аналитике предикатах равенства (тождества) могут подойти bitmap-индексы. - Для иных вариантов можно попробовать Orace Text или напрячься собственной реализацией доменного индекса для нечеткого поиска. - Для прерывания по timeout можно, к примеру, швыряться no_data_needed из pipelined ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2020, 16:01 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
Stax, спасибо В таком виде заработало Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Так, наверное, даже правильнее. Таймаут-таймауту рознь. А тут явно сказано, хошь-как-хошь, а 1е7 записей просмотри. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2020, 16:09 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
SY А что редактировать собственные сообщения может только модератор??? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2020, 16:10 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
Egoр, Интересный способ удалять гланды через одно место ... ... |
|||
:
Нравится:
Не нравится:
|
|||
01.12.2020, 00:02 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
graycode, У вас есть юзфулл предожения? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.12.2020, 20:30 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
Смотреть план запроса. С учетом "не заканчивается до победного конца" и "в таком виде заработало" не удивлюсь, если в исходном запросе Hash Join образовался. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.12.2020, 20:35 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
Egoр, Выше было много предложений ... Ограничивать период по идентификатору довольно странное решение, могу предложить разве что получать идентификатор соответствующий вашему Код: plsql 1. 2. 3. 4.
и затем использовать его в select * from r1 where log_id > :p_id and note like :note, в зависимости от прироста объемов хватит на неделю или месяц. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2020, 02:25 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
Egoр Аналитик я. Моя бизнес задача - проанализировать протокол в системе. Я реально выдумываю условия поиска в зависимости от ситуации. Т.е. никаких формальных правил нет? Каждый раз новый поиск с новыми условиями по абсолютно любым полям протокола? А они какого типа - тупо CLOB? Если сортируется по log_id, то почему вместо выдирания всех протоколов с сортировкой в одном запросе не заменить на N запросов (по числу протоколов) с прямым отбором по log_id и уже доп.условиям? Это и быстрее выполняется, и ответы есть сразу, и можно остановиться на любом, не выполняя остальных. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2020, 03:29 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
graycode, Предложений было много, но все сводились к измению поставки задачи. Однако частое ее переформулирование привело к решению. А ваш последний вариант по сути есть усложнение моего. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2020, 11:29 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
Правильный Вася, Ага. примерно так. Есть протокол. Есть некое внешнее неформализуемое событие. Нужно просмотреть последние записи протокола, которые могут иметь отношение к этому событию. Сколько этих записей - не известно. Начинаю с двухсот. Если не хватает, то увеличиваю, 500, 1000, 5000 ... И иной раз случается, что запсиси для выбранного условия в таблице заканчиваются. Ваше предложение, честно говоря, не понял. "заменить на N запросов по числе протоколов"? пртокол-то один. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2020, 11:47 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
Egoр Ваше предложение, честно говоря, не понял. "заменить на N запросов по числе протоколов"? пртокол-то один. Из постановки задачи я понял, что log_id не уникальный, т.е. несколько записей относятся к одному протоколу, идентифицируемому этим log_id, а самих протоколов много. Тогда и можно брать протокол с конкретно его записями, а не все протоколы с их записями сразу. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2020, 18:10 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
Egoр А ваш последний вариант по сути есть усложнение моего. Чего чего? С этого момента поподробнее пожалуйста, в чем усложнение? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2020, 20:37 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
Egoр Леонид, вот запрос Код: plsql 1. 2. 3. 4. 5. 6.
работает великолепно, когда в t_log по log_id desc достаточно достаточно записей, соответствующих note like :note. Но если в t_log в по log_id desc есть только 199 записей like :note, а следующая только через сотню миллионов, то БД честно сканирует все эти сто миллионов, хотя уже на первом десятке можно было бы и остановится, если бы :note были вида 'SMTH%' то помогло бы создание индекса по note. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2020, 11:26 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
graycode Egoр А ваш последний вариант по сути есть усложнение моего. Чего чего? С этого момента поподробнее пожалуйста, в чем усложнение? Для log_id > :p_id нужен :p_id Получить :p_id, соответствующий моему rownum < 1e7, можно через условие rownum < 1e7 Но зачем получать :p_id и подставлять его в log_id > :p_id, если уже rownum < 1e7 ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2020, 12:39 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
Egoр Но зачем получать :p_id и подставлять его в log_id > :p_id, если уже rownum < 1e7 Наверное чтобы каждый раз не выполнять rownum < 1e7, не? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2020, 22:00 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
graycode, Если каждый раз не выполнять, то по любому будет читаться 1e7 записей минимум. Каждый раз кол-во записей будет не меньше предыдущего. То есть, прочитано будет не меньше записей, чем в моем варианте. Значит и выигрыша не будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2020, 22:47 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
Egoр, Не надо фантазировать. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 17:43 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
graycode, у вас есть гипотеза? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 19:50 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
Egoр Есть протокол. Есть некое внешнее неформализуемое событие. Нужно просмотреть последние записи протокола, которые могут иметь отношение к этому событию. Сколько этих записей - не известно. Начинаю с двухсот. Если не хватает, то увеличиваю, 500, 1000, 5000 ... Прикольная задача. Типа результат нужен ASAP? Чтобы был честный таймаут, пропусти запрос select * from t_log order by log_id desc через PIPELINE функцию, в которой следи за тайматом. Через переменную в глобальном контексте можно будет даже завершать сканирование лога по требованию из отдельной сессии, если результат запроса уже нужен. И немного практической теории. Нужно установить оптимизатору SQL запросов цель FIRS_ROWS (OPTIMIZER_MODE). И избегать операций, которые для выполнения требуют полного набора данных. Поскольку приложение клиента может тянуть записи сервера блоками, нужно ограничить размер такого блока 1 по крайней мере для выборки записей, которые нужны ASAP. Тогда система не будет ждать наполнения маршрутки большого блока (которое может и не случиться), а сразу вернёт первые записи. А дальше по желанию, можно будет выбирать оставшиеся записи. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 12:21 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
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.
зы. спасибо, SeaGate за фикс с TTT ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 19:28 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
стоп, правка - предыдущее еще не работает так как надо из-за PX SELECTOR (он выполняется в координаторе) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 19:30 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
хотя не, все ок - все вроде работает: Код: 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.
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.
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.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 20:30 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
xtender Код: plsql 1. 2. 3. 4. 5. 6.
Ну говорил жеж - из pipelined швырять ее надо, а не разбрасывать где попало :) Воспроизвести аналогичный предложенному эффект при этом можно посредством parallel pipelined. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 22:44 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
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.
оказалось слишком просто, поэтому добавил "типа реальный запрос с данными" ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 02:52 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
В целом, если уж решать такое в реальной задаче для продуктива, то совершенно логично, что делалось бы стандартными средствами (в порядке убывания распространнености решений): 1. обычный запрос + клиентское прерыванием запроса ("ORA-01013: user requested cancel of current operation"); 2. Resource manager с лимитами (со своими общеизвестными нюансами); 3. запуск запроса в отдельном процессе/джобе и передача результатов через стандартные же средства межпроцессорного взаимодействия, типа dbms_pipe, с стандартными же вариантами прерывания этого процесса, типа cancel sql ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 03:01 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
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.
Наблюдается определенный паттерн в том, через какое время прерывается этот класс запросов: Код: 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.
Судя по всему, limitPerNode = timelimt / (execution_plan_lines-1) (исключаем SELECT STATEMENT). Если так, то это можно использовать, чтобы получить окончание запроса в точное время. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2020, 15:39 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
SeaGate Есть недокументированный _query_execution_time_limit. хах, забыл про него за 5 с половиной лет появился в 12.1.0.2: https://www.freelists.org/post/oracle-l/query-execution-time-limit,1 ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2020, 15:50 |
|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#18+
SeaGate, я тож про отладчик думал, но у меня нет практического опыта, так несколько раз не вполне удачно пробовал, и бросил тут недавно ссылку давали, так там подсмотрел что в новых версияях отличную команду открылы для дба ALTER SYSTEM CANCEL SQL мож из дебагера вытащили наружу ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2020, 15:53 |
|
|
start [/forum/topic.php?all=1&fid=52&tid=1880610]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
71ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
89ms |
get tp. blocked users: |
1ms |
others: | 282ms |
total: | 478ms |
0 / 0 |