powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Ограничить выборку по таймауту?
25 сообщений из 64, страница 1 из 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
25 сообщений из 64, страница 1 из 3
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Ограничить выборку по таймауту?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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