Конференция "Базы" » Отмена выполнения запроса
 
  • sniknik © (12.03.08 11:28) [20]
    > Кстати приведенный в начале пример не рабочий - States сразу после выполения запроса = stClose...
    тебе что зря про асинхронные запросы говорили?... естественно он у тебя stClose при ...  -> [7] первый абзац.
  • Johnmen © (12.03.08 11:33) [21]

    > DmitriyG. ©   (12.03.08 11:11) [17]
    > есть ситуации когда необходимо бывает стянуть
    > на клиента тысяч 50 записей

    Можно поподробней, что за ситуации, когда надо сразу столько записей?
  • Ega23 © (12.03.08 11:36) [22]

    > Можно поподробней, что за ситуации, когда надо сразу столько
    > записей?


    Есть, у меня аккурат сейчас такая.
    Правда там, фактически, ID с небольшим заголовком тянется. А вот вся дополнительная инфа - уже через Master-detail и по одной записи...  :)
  • ANB (12.03.08 11:49) [23]

    > цель разве в этом? а если возможен тот же результат вообще
    > без джойнов, или групп... засчитается? ;)

    Значится надо пройти по 20 миллионам договоров, по истории (около 100 миллионов записей) определить группу риска на дату, по остаткам в разрезе договоров (около 2-х миллиардов записей) вытащить на дату остатки разных 4-х типов, по таблице коммиссий в разрезе договоров (чуть больше миллиарда записей) вытащить остатки по 6 типам коммиссий на дату, выкинуть проданные и закрытые на дату договора (отсеется около 10%) тоже по таблицам с историей(2 таблицы, около 5 миллионов записей в каждой), по таблице продаж договоров (около 40 миллионов записей) уточнить тип договора. На основании выгребленных данных раскидать остатки и комиссии по отдельным полям, все сложить, сгруппировав по вычисленным типам договоров.
    Т.е. на выходе примерно 5 записей.
    Менять  структуру и заводить индексы низзя. Можно пользоваться времянками.
  • ANB (12.03.08 11:54) [24]

    > не единственный, а разумный (!)... делать показ по другому
    > (по вашему) только затем чтобы после делать "костыль" из
    > цикла с ProcessMessages вместо стандартной выборки сообщений,
    >  делающий тоже самое только хуже, глупо.

    В принципе - вариант.
    Только модальная форма же внутри себя сообщения обрабатывает - как тогда проверять, что запрос уже выполнился и уже мона форму закрыть ? Или придется писать свой цикл обработки сообщений.
    Можно, конечно, в отдельном потоке запрос выполнять, но неудобно и граблей много.

    Может поподробнее разжуешь - как с модальной формой это аккуратно сделать ?
  • sniknik © (12.03.08 12:00) [25]
    > Менять  структуру и заводить индексы низзя.
    ?, а дышать во время программирования можно?

    как это без индексов? а что ты тогда называешь оптимизацией, фулскан сменяный на ... фулскан?
    можеш считать впечатлил... теперь понимаю откуда у тебя извращенные фантазии с заменой ShowModal...
  • ANB (12.03.08 12:08) [26]

    > как это без индексов? а что ты тогда называешь оптимизацией,
    >  фулскан сменяный на ... фулскан?

    1. Индексы почти все нужные есть. Для выборки менее миллиона договоров (если запрошен конкретный тип, договоров с которым немного) я по ним запрос и сделал - за 20 секунд все считает (хотя все равно надо формочку показывать)
    Нельзя тока новые индексы добавлять.
    2. Фулл-скан фулл-скану - рознь. Правда, виртуозной оптимизацией мой начальник занимается. В частности, была аналогичная задача. План был на индексах. Считался больше суток да еще и RBS кончался через раз. После перевода на фулл-скан стал считаться 2 часа. Я не очень опытен в такой оптимизации, посему из того кода постоянно приемы и деру нагло.
  • sniknik © (12.03.08 12:09) [27]
    > как тогда проверять, что запрос уже выполнился и уже мона форму закрыть ?
    событие при завершении есть, я говорил.

    > Можно, конечно, в отдельном потоке запрос выполнять
    "асинхронность" сама свой поток сделает, не стоит парится.

    > но неудобно и граблей много.
    Form.ShowModal; в одном месте и Form.Close; в другом это слишком много граблей?... нда, а ваша структура базы без индексов это что?
  • sniknik © (12.03.08 12:12) [28]
    > 1. Индексы почти все нужные есть.
    по дате нету, если вам для "определить группу риска на дату" приходится "20 миллионам договоров" сканировать. или они все на один день? ("на дату") ???
  • ANB (12.03.08 12:20) [29]

    > событие при завершении есть, я говорил.

    Все. Понял. В бефоре - поднять форму, в афтер - закрыть.
    Чет в одаке у меня эти события не всегда корректно ловились, посему я и ставил циклы ожидания.
    Впрочем, обычно мне приходилась выполнять не запросы, а просто долго работующую хранимку/блок.
    Действительно, вариант самый удобный, а мультик мона готовый на форму ожидания кинуть.
    Единственно - нарывался на странный эффект, когда модальная форма уходила на задний план и приложение клинило. Причем даже в тодае такой эффект иногда вылезает.


    > по дате нету, если вам для "определить группу риска на дату"
    > приходится "20 миллионам договоров" сканировать. или они
    > все на один день? ("на дату") ???

    20 миллионов - это действующие договора. Для каждого из которых надо рассчитать несколько параметров. А потом уже эти параметры сложить.
    Индекс по дате в историях есть - я же написал, есть запрос по индексам, но на количестве договоров более 2 миллионов его клинит.
  • sniknik © (12.03.08 12:25) [30]
    > когда модальная форма уходила на задний план и приложение клинило.
    родитель у формы nil был.

    > 20 миллионов - это действующие договора. ...
    не. "лечение по фотографии" надо прекращать, вот с чего "его клинит" на 2х миллионах? у меня в тесте на 40ка не клинило а вас на 2х... не понимаю.
  • ANB (12.03.08 12:46) [31]

    > родитель у формы nil был.

    Не, нормально все прописывал - все равно, если переключаться между окнами, иногда пропадает. Особливо ShowMessage этим грешит.


    > у меня в тесте на 40ка не клинило а вас на 2х... не понимаю.

    А сколько таблиц и какого размера к этим 40-ка прикручивал ?

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

    Ща приходится учится работать с большими объемами, для которых такие вещи не всегда прокатывают.

    Короче - если сможешь на оракле еще ускорить такой запрос и аналогичные - начальник возьмет на работу с окладом не меньше моего (а то и больше). Сейчас у нас 2 человека сидят на оптимизации, один из которых - начальник и есть.
  • ANB (12.03.08 12:49) [32]

    > вот с чего "его клинит" на 2х миллионах?

    Не то чтобы совсем клинит, но фулл-скан стабильно где то за час все перелопачивает, причем количество договоров уже сильно не влияет на время. А по индексу - больше 2-х часов я ждать уже замучался. Да и юзеры жалуются, что падает с ошибкой (под RBS места не сильно много и увеличивать его значительно уже особо некуда).
  • DmitriyG. © (13.03.08 11:07) [33]
    Я конечно извиняюся за назойлисвость, но получается рабочего варианта отмены запросы пока никто не предложил. Дискусии на фига это нужно и что нужно оптимизировать и тому подобное конечно хорошо... Но бывают ситуации, что нужно прервать запрос, который будет выполняться даже заведомо 5 минут...
  • Sergey13 © (13.03.08 12:00) [34]
    > [33] DmitriyG. ©   (13.03.08 11:07)

    В оракловом инструменте PL/SQL Delveloper это, насколько я понял, реализовано примерно так. Каждый запрос выполняется в отдельной сессии. При зависании запроса срубается сессия.
  • sniknik © (13.03.08 12:17) [35]
    > Каждый запрос выполняется в отдельной сессии.
    им наверное приходится "выкручиваться" потому, что используемые ими компоненты/методы не поддерживают потоков/сессий/асинхронности самостоятельно. для ADO у которого есть асинхронный режим это лишнее.

    > но получается рабочего варианта отмены запросы пока никто не предложил.
    ты просто не понял предложенного, как не понял и найденного кода ([2]) который вполне рабочий, при определенных обстоятельствах.
    ...
    можно и проще. вот код который отменяет запрос (прямой и точный ответ на заданный вопрос)
    ADODataSet1.Close;


    помогло? без понимания то.
    (на самом деле просто прерывается работа клиентского потока, сервер его все одно "докрутит", но это практически у всех так)
  • ANB (13.03.08 13:04) [36]

    > При зависании запроса срубается сессия.

    Нет. Более того, сессию замучаешься срубать, если она чего то делает.
    Девелопер открывает отдельную сессию для каждого окошка (если включена соответствующая настройка). За счет этого мона одновременно выполнять несколько запросов параллельно в разных окнах.
    Есть специальная команда в OCI - "срубить запрос".
  • ANB (13.03.08 13:07) [37]

    > сервер его все одно "докрутит", но это практически у всех
    > так

    в оракле не так. хотя можно умудрится проигнорить срубание. особенно, если выполняется хранимка.
    Кстати, в мс скл, если лезть через DBLib, тоже аккуратно все срубается. Пример - QA.
  • Правильный_Вася (13.03.08 13:10) [38]
    не знаю, будет жить или нет, но в качестве идеи

    написать функцию, которая будет опрашивать некую сессионную переменную в БД (если такие есть в скуле)
    при необходимости отмены запроса она выставляется из программы в нужное значение
    функция встраивается в where запроса, ей передается параметром некое поле из таблицы (чтоб оптимизатор не подумал, что значение функции можно посчитать один раз и успокоиться), а сама функция возвращает нечто, что явно не дает выполниться остальной части запроса (напримар, false для условия and во where)
  • Sergey13 © (13.03.08 13:29) [39]
    > [36] ANB   (13.03.08 13:04)

    Тогда почему кнопочка убийства запроса доступна только при многосессионной настройке?
 
Конференция "Базы" » Отмена выполнения запроса
Есть новые Нет новых   [134433   +21][b:0][p:0.001]