Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Ограничить выборку по таймауту? / 25 сообщений из 64, страница 1 из 3
27.11.2020, 14:16
    #40022774
Egoр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничить выборку по таймауту?
Хай, олл!

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

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

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

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

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

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

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

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

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

IMHO & AFAIK

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


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

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


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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

конкретика такая.
протокол, очищенный от лишних данных , сортируется по индексу в порядке убывания
далее применяется неиндексируемое условие поиска
нужно вывести первые две сотни записей.
когда под условие попадает много записей, тыщща из первого миллиона, то результат прилетает за секунду.
А когда в первой сотне миллионов только 50 нужных записей, то счет идет уже на минуты.
Сколько конкртено записей не известно.
Известно только, что нужные записи наверху протокола.
То есть в плане нет сортировки и чтение идет по индексу?
Ну тогда как сказал Леонид - минимизируй порцию фетча. Потом дофетчивай если необходимо.
...
Рейтинг: 0 / 0
27.11.2020, 17:11
    #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
27.11.2020, 17:30
    #40022845
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничить выборку по таймауту?
Egoр

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


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

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

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

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

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

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

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

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

Более правильный подход в нашем случае (запрос пытался вычислить текущую задолжность по account'у), был бы агригировать данные и не пытаться их расчитывать при входе на форму, но менять legacy код настолько серьезно мы не могли (не умели).
...
Рейтинг: 0 / 0
28.11.2020, 11:12
    #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
28.11.2020, 13:31
    #40022974
graycode
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничить выборку по таймауту?
Egoр,

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

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

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

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

Зачем?

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

Ограничьте время выполнения, будете получать ошибку вместо выборки.
...
Рейтинг: 0 / 0
28.11.2020, 18:24
    #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
28.11.2020, 19:18
    #40023032
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничить выборку по таймауту?
Stax
на правах попробовать шютку

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

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

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


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