Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ODAC, зависает приложение при прокрутке 
:(
    Опции темы
AndreyZ53
Дата 13.1.2015, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 22.8.2008

Репутация: нет
Всего: 2



Доброго времени суток. Для доступа к oraсle использую компоненты odaс.

Вопрос заключается в том, что когда делаю запрос, то приложение зависает, так как в базе миллионы записей и пока найдет нужную, то проходит порядка 12 минут. Это дело понятное. Данный вопрос я решил, установив свойство nonbloсking компонента TOraQuery в True и добавил анимацию. Теперь запрос выполняется в отдельном потоке, приложение не виснет, а при помощи анимации (бегунок), пользователь видит, что приложение не зависло и что-то ищет.

Но теперь вопрос вот в чем, если там из 10 миллиона записей нашло 100 тысяч, то в dbgrid (у меня грид с ehlib 3.6, бесплатной версии), то он отображает по 25-50 записей, начинаю прокручивать грид, приложение опять зависает, чтобы отобразить следующие 25-50 записей на минут 5, но уже именно зависает. А как мне можно сделать и тут, чтобы оно не зависало и появлялась анимация, что оно ищет остальные записи, может кто подскажет?
--------------------
https://itbases.ru/
PM MAIL WWW Skype   Вверх
Vas
Дата 13.1.2015, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



Цитата(AndreyZ53 @  13.1.2015,  19:08 Найти цитируемый пост)
Вопрос заключается в том, что когда делаю запрос, то приложение зависает, так как в базе миллионы записей и пока найдет нужную, то проходит порядка 12 минут.

Тут видимо все-таки надо с индексами на таблицу разобраться, миллион записей и 12 минут - это как-то очень много, тем более для оракуля. Такое чувство, что не TOraQuery используется, а TOraTable с включенным свойством filtered  и установленым фильтром.


Цитата(AndreyZ53 @  13.1.2015,  19:08 Найти цитируемый пост)
Но теперь вопрос вот в чем, если там из 10 миллиона записей нашло 100 тысяч

Нужны ли пользователю все 100 тысяч записей сразу не задавались таким вопросом?


Цитата(AndreyZ53 @  13.1.2015,  19:08 Найти цитируемый пост)
то он отображает по 25-50 записей, начинаю прокручивать грид, приложение опять зависает, чтобы отобразить следующие 25-50 записей на минут 5, но уже именно зависает.

А если в TOraQuery установить выбор не по 25 записей, а например по 1000 пусть пользователь минутку покрутит, а потом подумает и обратиться к фильтру с помощью которого отберет те нужные 10-100 записей. Если конечно фильтр у вас предусмотрен в программе.


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
AndreyZ53
Дата 13.1.2015, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 22.8.2008

Репутация: нет
Всего: 2



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

База не моя, существует уже много лет, как пришел на работу, она уже стояла там с 2007 года, каждый месяц в нее добавляется по 350-400 тысяч записей.

Использую именно OraQuery, я с odaс не так давно работаю, еще мало про него знаю.

Индекса конечно есть в базе, но я с ораклом как-то не очень, база есть, подключился, просто хочу для себя написать приложение небольшое, чтобы оно выводило мне набор записей за день по определенному условию, а не каждый раз я бы подключался к oraсle через sqldeveloper и что-то там делал.

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

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

Но программку тоже хочу сделать не абы как. Потому что ставить буду нескольким сотрудникам. А то они начнут прокручивать или долго запрос делаться, то подумают, что не работает и все, начнут через процесс завершать.

В OraQuery выставил 1000 записей чтобы выводило, но может можно как-то ускорить быстроту выполнения запроса в многомиллионной БД?

Это сообщение отредактировал(а) AndreyZ53 - 13.1.2015, 20:38
--------------------
https://itbases.ru/
PM MAIL WWW Skype   Вверх
Vas
Дата 13.1.2015, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



Цитата(AndreyZ53 @  13.1.2015,  20:34 Найти цитируемый пост)
В OraQuery выставил 1000 записей чтобы выводило, но может можно как-то ускорить быстроту выполнения запроса в многомиллионной БД?

Это вопрос в профильный раздел форума "Базы данных" там быстрее помогут.


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
superVad
Дата 14.1.2015, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

Репутация: 3
Всего: 15



AndreyZ53, выход из этого - расположить над гридом фильтр и по какой то кнопке отображать записи. Если условия не выбраны, то предупреждать, что это будет долго.
Было подобное у меня, пока вышли из положения таким образом, что при входе в программу показываются записи за последний месяц (фильтр так установлен).
Никому не надо 100 тыс. записей в гриде.
PM MAIL   Вверх
AndreyZ53
Дата 14.1.2015, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 22.8.2008

Репутация: нет
Всего: 2



superVad, что-то я не могу сообразить, подскажите еще пожалуйста.

При открытии формы у меня стоит выполнение запроса.
Код

  OraQuery1.SQL.Clear;
  OraQuery1.SQL.Add('SELECT MAIL.*,KOMFORT.* FROM MAIL LEFT JOIN KOMFORT ON MAIL.ID_MAIL=KOMFORT.JARLIK');
  OraQuery1.Active:=True;
  OraQuery1.Filtered:=True;
  OraQuery1.Filter:='TYP=29';


Отображается 25 записей у меня сразу же, так как в свойстве FetchRows компонента TOraQuery стоит 25. Почему-то фильтр не срабатывает сразу, выводит все записи, то есть, ТИП 29 он игнорирует. Начинаю пролистывать грид, и чтобы он отобразил следующие 25 записей, приложение просто зависает, как этого избежать?

Точнее оно зависает, если я резко бегунок прокрутки грида опускаю вниз, если понемного опускаю, то появляются новые записи без зависания, но если резко, то приложение зависает и думают, через некоторое время отвисает и показывает следующие записи

Это сообщение отредактировал(а) AndreyZ53 - 14.1.2015, 10:59
--------------------
https://itbases.ru/
PM MAIL WWW Skype   Вверх
superVad
Дата 14.1.2015, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

Репутация: 3
Всего: 15



AndreyZ53, на таких количествах записей, возможно стоит отказаться от родной фильтрации компонента.
У меня на основе установленных фильтров формируется соответствующий SQL-запрос.

Т.е.
Код

  OraQuery1.SQL.Clear;
  OraQuery1.SQL.Add('SELECT MAIL.*,KOMFORT.* FROM MAIL LEFT JOIN KOMFORT ON MAIL.ID_MAIL=KOMFORT.JARLIK');
  if true then //тут какое то свое условие
    OraQuery1.SQL.Add('WHERE TYP=29');
  OraQuery1.Active:=True;


Добавлено через 2 минуты и 12 секунд
Ну и каждый раз при изменении фильтрации набор данных закрывается, переформируется запрос и набор данных открывается. Это все можно оформить как одну функцию, что бы она срабатывала и при открытии программы и при изменении условий фильтрации.

Добавлено через 4 минуты
Ну и насчет того почему игнорирует TYP=29. Может попробовать так:
Код

  OraQuery1.Filter:='TYP=29';
  OraQuery1.Filtered:=True;
  OraQuery1.Active:=True;

PM MAIL   Вверх
Vas
Дата 14.1.2015, 20:11 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



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

P.S.
Но из десятков миллионов записей запрос 12 минут для оракуля это не просто дофига, а ужас как дофига для простого запроса с условием и связыванием 1-2 таблиц. Так что сначала оптимизация БД, а потом уже реализация в программе, а то глядишь оно и так сразу залетает  у него  smile

Добавлено через 2 минуты и 33 секунды
Цитата(AndreyZ53 @  14.1.2015,  10:54 Найти цитируемый пост)
При открытии формы у меня стоит выполнение запроса.
Код

  OraQuery1.SQL.Clear;
  OraQuery1.SQL.Add('SELECT MAIL.*,KOMFORT.* FROM MAIL LEFT JOIN KOMFORT ON MAIL.ID_MAIL=KOMFORT.JARLIK');
  OraQuery1.Active:=True;
  OraQuery1.Filtered:=True;
  OraQuery1.Filter:='TYP=29';


В таком режиме у вас не TOraQuery, а TOraTable. Как я и думал у вас все миллионы тянутся по сети на ваш комп или пользователя, а потом в памяти фильтруется (ужас блин  smile ).
RTFM SQL для чайников причем срочно.


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
AndreyZ53
Дата 28.1.2015, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 22.8.2008

Репутация: нет
Всего: 2



Vas, Так а пример небольшой можно, как правильно TOraquery пользоваться, либо ссылочку на литературку.
--------------------
https://itbases.ru/
PM MAIL WWW Skype   Вверх
Vas
Дата 28.1.2015, 21:13 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



Вот же пример, который superVad привел в своем сообщении, осмелюсь продублировать
Код

 OraQuery1.SQL.Clear;
  OraQuery1.SQL.Add('SELECT MAIL.*,KOMFORT.* FROM MAIL LEFT JOIN KOMFORT ON MAIL.ID_MAIL=KOMFORT.JARLIK');
  if true then //тут какое то свое условие
    OraQuery1.SQL.Add('WHERE TYP=29');
  OraQuery1.Active:=True;

Если его выполнить, то выберутся только записи с TYP=29, причем их выберет сервер и передаст ТОЛЬКО ИХ клиенту, тем самым не будет по сети лететь вся таблица, что существенно сократит расходы времени на передачу данных по сети. 

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

P.S. Для начала надо изучить диалект SQL и тогда понимание запросов и работы с ними само придет.


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
AndreyZ53
Дата 29.1.2015, 08:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 22.8.2008

Репутация: нет
Всего: 2



Vas, Спасибо за разъяснения, у меня сейчас запрос выполняется именно с условием. Но допустим, пользователю прилетела табличка из 200 записей с условием WHERE TYP=29. А ему необходимо из 200, найти быстро запись, допустим по фамилии, тогда же уже необходимо будет применять локальный фильтр, правильно? без него же никак? Но вот с локальным фильтром не могу разобраться, что-то он у меня не работает.

Код

    if Trim(TextEditNP.Text)<>'' then
     begin
      OraQueryMAIL.Filter:='ID_MAIL='+TextEditNP.Text;
      OraQueryMAIL.Filtered:=True;
     end;


Поле ID_MAIL в базе имеет тип VARCHAR, может я фильтр не правильно указываю?

И еще такой вопросик в тему: вот запрос выполняется, пусть минуты 3, а можно ли мне его корректно завершить, чтобы не было никаких ошибок. Грубо говоря остановить его и например запустить опять, чтобы все было корректно?

Или как мне использовать этот запрос для нового SQL-оператора. Я сделал SELECT, мне сервер вернул записи, а потом я делаю SQL.Clear для этого запроса, пишу новый, но мне уже выкидывает ошибку:


Это сообщение отредактировал(а) AndreyZ53 - 29.1.2015, 14:42

Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  1.JPG 17,22 Kb
--------------------
https://itbases.ru/
PM MAIL WWW Skype   Вверх
ТоляМБА
Дата 29.1.2015, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Котэ
***


Профиль
Группа: Завсегдатай
Сообщений: 1607
Регистрация: 15.12.2004

Репутация: 3
Всего: 252



Цитата(AndreyZ53 @  29.1.2015,  10:41 Найти цитируемый пост)
 можно ли мне его корректно завершить, чтобы не было никаких ошибок. Грубо говоря остановить его и например запустить опять, чтобы все было корректно?

Если запрос на Select, то сомневаюсь что его можно как-то завершить.
Если же запрос на Insert / Update / Delete почитайте о транзакциях.
PM   Вверх
AndreyZ53
Дата 29.1.2015, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 22.8.2008

Репутация: нет
Всего: 2



ТоляМБА, Жаль конечно, может можно как-то на уровне OCI это сделать? Просто дело в том, что у меня есть OraQuery, я выполняю SELECT, мне сервер вернул записи, по сути запрос выполнился. Затем я хочу написать другой запрос, но в том же OraQuery, а мне выдает ошибку, которую я прикрепил выше!
--------------------
https://itbases.ru/
PM MAIL WWW Skype   Вверх
ТоляМБА
Дата 29.1.2015, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Котэ
***


Профиль
Группа: Завсегдатай
Сообщений: 1607
Регистрация: 15.12.2004

Репутация: 3
Всего: 252



Перед 
OraQuery1.SQL.Clear;
  OraQuery1.SQL.Add(...
неплохо бы сделать OraQuery1.Active:=false; то есть закрыть действующий запрос.
PM   Вверх
AndreyZ53
Дата 29.1.2015, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 22.8.2008

Репутация: нет
Всего: 2



я делал:

Код

    OraQuery1.Active:=False;
    OraQuery1.SQL.Clear;
    OraQuery1.SQL.Add('SELECT MAIL.*,KOMFORT.* FROM MAIL LEFT JOIN KOMFORT ON MAIL.ID_MAIL=KOMFORT.JARLIK WHERE MAIL.dt_form between'+''''+DateToStr(myDateDec)+''' and '+''''+DateToStr(myDate)+''' and MAIL.TYP>=29 and MAIL.TYP<=34');
    OraQuery1.Active:=True;


И делал OraQuery.BreakExec, не помогает, не могу использовать тот же самый OraQuery для другого SELECT, не могу понять почему

Это сообщение отредактировал(а) AndreyZ53 - 29.1.2015, 16:42
--------------------
https://itbases.ru/
PM MAIL WWW Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0873 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.