|
Ограничить выборку по таймауту?
|
|||
---|---|---|---|
#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 |
|
|
start [/forum/topic.php?fid=52&msg=40023032&tid=1880610]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
28ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
others: | 17ms |
total: | 142ms |
0 / 0 |