Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Первый select после открытия отрабатывается быстро, потом - очень медленно / 25 сообщений из 28, страница 1 из 2
27.03.2014, 23:00:31
    #38598594
PaPo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первый select после открытия отрабатывается быстро, потом - очень медленно
Всем привет!
Я пишу прогу для работы с базой данных в пятом Билдере с использованием компонентов IBX (обновил до IBX 5.04, качал с ibase.ru). Сервак - Firebird 2.5, диалект 3. Прога работает (одинаково хреново) под WinXP SP3 и Win7.

Прога представляет из себя следующее. Для формирования запросов и выводов используются TIBDatabase, TIBQuery, TIBTransaction и DBGrid, подключенный через TDataSource. Параметры TIBTransaction - Read Committed, no_rec_version, wait.

При старте программы (в конструкторе формы) вызывается метод, создающий коннект IBDatabase к бд. Потом делается запрос, и результаты отражаются на DBGrid'e. Как-то так:

Код: plaintext
1.
2.
3.
4.
  Query->Close();
  Query->SQL->Clear();
  Query->SQL->Add("SELECT * FROM myTable ORDER BY field_No2");
  Query->Open();



Также на форме присутствует кнопка (типа "Обновить таблицу"), в обработчике нажатия которой висит такой же точно запрос.
Проблема в том, что при старте проги такой запрос выполняется очень быстро, а при нажатии на кнопку в разы дольше.

И еще кое-что. В базе существует два индекса по первому полю (поле ID, NOT_NULL, больше ограничений не накладывалось, так как id контролируется из-вне). Один индекс Ascending, другой - Descending. Также к базе коннектится еще одна программа, таким же точно методом, как первая. Она где-то каждые 10 сек вставляет около 2 тыс записей и столько же обновляет.
Перестройка индексов ничего не дает (не через DROP/CREATE INDEX, не через ALTER INDEX). Да в первой проге (в той, в которой проблема) сортировка не обязательно по ID проводится.

Не помогает в ручную запускать и коммиттить все транзакции. То есть
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
  //при старте
  IBTransaction->AutoStopAction = saNone;

  //а потом все запросы в болке:
  Query->Transaction->StartTransaction();
  //Запрос
  Query->Transaction->Commit(); //или RollBack по ситуации.



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

Заранее, спасибо за ответы!
...
Рейтинг: 0 / 0
27.03.2014, 23:14:14
    #38598606
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первый select после открытия отрабатывается быстро, потом - очень медленно
PaPoПараметры TIBTransaction - Read Committed, no_rec_version, wait.
тихий ужас.
читайте
http://www.ibase.ru/devinfo/ibx.htm

PaPoпри старте проги такой запрос выполняется очень быстро, а при нажатии на кнопку в разы дольше.
так не бывает. включите IBSQLMonitor, посмотрите что выполняется при старте, а что при нажатии на кнопку. Вполне вероятно, что во второй раз происходит FetchAll, или выполняется другой запрос.
...
Рейтинг: 0 / 0
27.03.2014, 23:23:49
    #38598612
PaPo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первый select после открытия отрабатывается быстро, потом - очень медленно
kdvтихий ужас.

Это точно! Я и сам так постоянно думаю.

kdvчитайте
http://www.ibase.ru/devinfo/ibx.htm

kdvтак не бывает. включите IBSQLMonitor, посмотрите что выполняется при старте, а что при нажатии на кнопку. Вполне вероятно, что во второй раз происходит FetchAll, или выполняется другой запрос.

Спасибо большое! Буду разбираться!
По идее, FetchAl выполняется оба раза, но может просто я не понимаю, что на самом делает моя прога :)
...
Рейтинг: 0 / 0
27.03.2014, 23:23:52
    #38598613
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первый select после открытия отрабатывается быстро, потом - очень медленно
PaPo,

кстати, "отрабатывается очень медленно" - скорее всего твоя транзакция с параметрами Read Committed, no_rec_version, wait повисает при чтении новых и не committed данных, пока конкурирующее приложение до конца их не вставит.
Зачем нужно было ставить такие параметры, да еще и которые прописываются в IBTransaction только вручную, непонятно.
...
Рейтинг: 0 / 0
27.03.2014, 23:29:55
    #38598616
PaPo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первый select после открытия отрабатывается быстро, потом - очень медленно
Да вот и мне непонятно! Ладно, буду читать мануал к IBX, надеюсь разберусь

kdvкстати, "отрабатывается очень медленно" - скорее всего твоя транзакция с параметрами Read Committed, no_rec_version, wait повисает при чтении новых и не committed данных, пока конкурирующее приложение до конца их не вставит.

Не уверен. Запускал запрос в разные моменты, и когда вторая прога записывала данные, и когда нет. Результат одинаковый. Впрочем, если я неправильно пользуюсь транзакциями, то вторая прога тоже работает не совсем адекватно, потому что ее тоже писал я :D
...
Рейтинг: 0 / 0
27.03.2014, 23:37:02
    #38598619
PaPo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первый select после открытия отрабатывается быстро, потом - очень медленно
Кстати! Еще один вопрос есть. Напишу здесь, чтобы не плодить тем.
Я ввожу число в TEdit, откуда оно вставляется в запрос. Так вот надо найти запись с самым близким значением выбранного поля к тому, которое было введено. То есть запрос ищет запись, в которой поле равно не конкретному точному значению, а наиболее близко к числу, введенному пользователем. Искомый параметр типа int и float.
Есть какой-то стандартный метод составления подобного запроса? Поиск наиболее похожего значения.
...
Рейтинг: 0 / 0
27.03.2014, 23:47:19
    #38598621
m7m
m7m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первый select после открытия отрабатывается быстро, потом - очень медленно
PaPo То есть запрос ищет запись, в которой поле равно не конкретному точному значению, а наиболее близко к числу, введенному пользователем. Искомый параметр типа int и float.
Есть какой-то стандартный метод составления подобного запроса? Поиск наиболее похожего значения.

First 1 и order by ABS(T_Field-:I_Field)

зы. насколько стандартный не знаю
...
Рейтинг: 0 / 0
27.03.2014, 23:53:32
    #38598623
PaPo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первый select после открытия отрабатывается быстро, потом - очень медленно
m7m First 1 и order by ABS(T_Field-:I_Field)
зы. насколько стандартный не знаю
Спасибо большое за подсказку! Теперь хоть знаю, что искать.
Если не затруднит, можно примерчик запроса?
...
Рейтинг: 0 / 0
28.03.2014, 00:17:55
    #38598630
m7m
m7m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первый select после открытия отрабатывается быстро, потом - очень медленно
PaPom7m First 1 и order by ABS(T_Field-:I_Field)
зы. насколько стандартный не знаю
Спасибо большое за подсказку! Теперь хоть знаю, что искать.
Если не затруднит, можно примерчик запроса?

Код: sql
1.
2.
3.
4.
select first 1 .... 
  from table 
  where ....
  order by ABS(T_Field-:I_Field) 



Ну как-то так
...
Рейтинг: 0 / 0
28.03.2014, 00:20:31
    #38598631
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первый select после открытия отрабатывается быстро, потом - очень медленно
PaPo,

еще и float...

PaPoВпрочем, если я неправильно пользуюсь транзакциями
неправильно. для нормального чтения надо
read_committed
rec_version
nowait
Выбирается по правой кнопке на IBTransaction, транзакция ReadCommitted. зачем тебе нужен no_rec_version + wait ты не объяснил.
Перед объяснением советую прочитать http://www.ibase.ru/devinfo/ibtrans.htm
...
Рейтинг: 0 / 0
28.03.2014, 00:43:13
    #38598634
PaPo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первый select после открытия отрабатывается быстро, потом - очень медленно
m7m , спасибо огромное! Вы очень помогли. Дальше я разберусь.

kdvнеправильно. для нормального чтения надо
read_committed
rec_version
nowait
Выбирается по правой кнопке на IBTransaction, транзакция ReadCommitted. зачем тебе нужен no_rec_version + wait ты не объяснил.
Перед объяснением советую прочитать http://www.ibase.ru/devinfo/ibtrans.htm
Спасибо за совет.
Все объясняется тем, что я не программист.
Теперь, естественно, первым делом досконально изучу манаул!
...
Рейтинг: 0 / 0
28.03.2014, 16:56:28
    #38599411
PaPo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первый select после открытия отрабатывается быстро, потом - очень медленно
kdvPaPo,
Выбирается по правой кнопке на IBTransaction, транзакция ReadCommitted. зачем тебе нужен no_rec_version + wait ты не объяснил.
Перед объяснением советую прочитать http://www.ibase.ru/devinfo/ibtrans.htm
Почитал! Очень хорошо написано, спасибо! Стало понятно гораздо больше, чем было.
На счет моего выбора касательно параметров транзакий я аккуратно промолчу.

В общем, теперь все работает. Сложно сказать, правильно или нет, но производительность удовлетворительная, и никаких исключений или зависаний.

Я хотел уточнить насчет еще пары моментов.
У меня в проге два объекта TTransaction и два соответствующих им TQuery. Одна цепочка для изменения данных (Exec...), другая для отображение подцепленного через датасорс дбгрида (Open...).
Транзакция, выполняющая изменения данных, настроена так: read_committed, rec_version, nowait.
Транзакция, отвечающая за просмотр, - так: read , read_committed, rec_version, nowait. То есть эта транзакция по логике должна только читать данные, вот я и поставил этот read . Из прочитанного не очень понял, этот параметр нужен? Разницы в работоспособности с ним и без него не заметил.

А второй момент вот какой.
Функционал запросов в моей проге оформлен следующим образом. Для транзакция, изменяющих данные:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  ExecQuery->SQL->Clear();
  ExecQuery->Transaction->StartTransaction();
  ExecQuery->SQL->Add("DELETE FROM myTable");
  try{
    ExecQuery->ExecSQL();
    ExecQuery->Transaction->Commit();
  } catch(EIBInterBaseError& e) {
    ExecQuery->Transaction->Rollback();
    ShowMessage("Бла-бла-бла ошибка");
  }



А транзакции, работающие с открытием набора, отрабатываются так:
Код: plaintext
1.
2.
3.
4.
5.
  OpenQuery->Close();
  OpenQuery->SQL->Clear();
  //OpenQuery->Transaction->StartTransaction();
  OpenQuery->SQL->Add("SELECT * FROM myTable ORDER BY someField");
  OpenQuery->Open();


Свойсто OpenTransaction->AutoStopAction установленно в saCommit.
Так вот вопрос, может ли Open(); вызывать исключение? Может стоит на чтение данных тоже стоит повесить try {commit} - catch {rollback}?
Ну и вообще, комментарии было бы интересно послушать.
...
Рейтинг: 0 / 0
28.03.2014, 17:05:07
    #38599429
PaPo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первый select после открытия отрабатывается быстро, потом - очень медленно
PaPoТак вот вопрос, может ли Open(); вызывать исключение? Может стоит на чтение данных тоже стоит повесить try {commit} - catch {rollback}?

Что-то я не уверен в адекватности этого вопроса.

Лучше скажите, нужно ли перед OpenQuery->Open(); запускать транзакцию?
...
Рейтинг: 0 / 0
28.03.2014, 17:18:18
    #38599456
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первый select после открытия отрабатывается быстро, потом - очень медленно
PaPo > Так вот вопрос, может ли Open(); вызывать исключение?

Может, в принципе.

PaPo > Лучше скажите, нужно ли перед OpenQuery->Open(); запускать транзакцию?

Ну, если она ещё не активна, то последует попытка её старта.
Но полагаться на автоматическое управление транзакциями не
советую - на эту тему говорилось и писалось много, читайте.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
28.03.2014, 17:21:30
    #38599461
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первый select после открытия отрабатывается быстро, потом - очень медленно
PaPoПочитал! Очень хорошо написано, спасибо! Стало понятно гораздо больше, чем
было.
А теперь перечитай ещё два раза, внимательно. Поскольку твой следующий вопрос
свидетельствует о том, что "гораздо больше" это скорее "чуть-чуть".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
28.03.2014, 17:57:20
    #38599496
PaPo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первый select после открытия отрабатывается быстро, потом - очень медленно
Dimitry SibiryakovА теперь перечитай ещё два раза, внимательно. Поскольку твой следующий вопрос
свидетельствует о том, что "гораздо больше" это скорее "чуть-чуть".

"Гораздо больше" в моем случае не исключает "чуть-чуть"

Гаджимурадов РустамНо полагаться на автоматическое управление транзакциями не
советую - на эту тему говорилось и писалось много, читайте.

Вот с этим моментом я как раз и не разобрался! Я конечно же почитаю, если останется время
Я неправильно спросил.
У меня все время открыта читающая транзакция и в ДБГриде постоянно отображаются данные.
Как правильнее сделать переоткрытие?
Код: plaintext
1.
2.
3.
4.
  OpenQuery->Close();
  OpenQuery->SQL->Clear();
  OpenQuery->SQL->Add("SELECT * FROM myTable ORDER BY someField");
  OpenQuery->Open();


? или установить OpenTransaction->AutoStopAction в saNone и
Код: plaintext
1.
2.
3.
4.
5.
6.
  OpenQuery->Close();
  OpenQuery->SQL->Clear();
  OpenQuery->Transaction->StartTransaction();
  OpenQuery->SQL->Add("SELECT * FROM myTable ORDER BY someField");
  OpenQuery->Open();
  OpenQuery->Transaction->CommitRetaining();


Это не критично, потому что и так все более-менее работает.

Извиняюсь, что задаю много тупых вопрос, но времени досканально разбираться совсем не осталось! И помимо взаимодействия с БД проблем выше крыши!
...
Рейтинг: 0 / 0
28.03.2014, 17:59:22
    #38599499
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первый select после открытия отрабатывается быстро, потом - очень медленно
PaPoИз прочитанного не очень понял, этот параметр нужен?
перефразирую - "я прочитал, но не понял". Или "я просмотрел по диагонали", и не понял. Цитировать ibx.htm или ibtrans.htm тут не буду.
Если бы у тебя возник вопрос по тексту статей, я бы прокомментировал. но по крайней мере ibx.htm я специально сделал максимально разжеванным.

PaPoРазницы в работоспособности с ним и без него не заметил.
а что, ты ожидал, что от параметров транзакций зависит скорость запроса???

PaPoСвойсто OpenTransaction->AutoStopAction установленно в saCommit.
ты буквы читаешь?
" AutoStopAction - свойство, аналогичное DefaultAction по значениям (плюс saNone, по умолчанию), указывает на метод завершения транзакции, когда все DataSet-ы, подключенные к ней, закрываются. "

То есть, ты надеешься, что если где то в коде ты забыл закрыть транзакцию, то транзакция сама закроется, когда закроются все прицепленные к ней датасеты? А если забыть закрыть датасет?
Зачем ты крутишь параметры, которые тебе на данном этапе не нужны? Нафига вообще автоматически закрывать транзакцию read read_committed rec_version, если она .... дальше см. ibx.htm.

PaPo Может стоит на чтение данных тоже стоит повесить try {commit} - catch {rollback}?
try на чтение данных можно было вешать при no_rec_version, если бы ты понимал, к чему этот параметр приводит.
А так я посоветую читать вышеозначенные документы до просветления, несколько раз, пока не станет понятно.
...
Рейтинг: 0 / 0
28.03.2014, 18:01:10
    #38599500
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первый select после открытия отрабатывается быстро, потом - очень медленно
PaPoно времени досканально разбираться совсем не осталось!
это не наши проблемы. Статьи пишут когда нужно разжевать какую-то тему, или достает отвечать на одни и те же вопросы. Если ты статьи читать не хочешь (нет времени), то думаешь, нам интересно тут напевать тебе содержание этих статей?
...
Рейтинг: 0 / 0
28.03.2014, 18:11:15
    #38599506
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первый select после открытия отрабатывается быстро, потом - очень медленно
PaPo> Как правильнее сделать переоткрытие?
PaPo> OpenQuery->Close();
PaPo> OpenQuery->Open();

Переоткрытие чего, запроса? Close+Open достаточно,
транакцию трогать никак не нужно. Ещё и сам текст
запроса, желательно, не менять без необходимости.

> Извиняюсь, что задаю много тупых вопрос, но
> времени досканально разбираться совсем не осталось!
> И помимо взаимодействия с БД проблем выше крыши!

Статьи и разделы книги на эту тему небольшие и
несложные, прочитать их уйдёт времени меньше,
чем писать тут на форуме.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
28.03.2014, 18:19:44
    #38599514
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первый select после открытия отрабатывается быстро, потом - очень медленно
Гаджимурадов РустамПереоткрытие чего, запроса? Close+Open достаточно,
Для одно- двухпользовательского режима - сойдёт, да. А потом опять родится миф, что
"Firebird десять пользователей не тянет".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
28.03.2014, 18:29:05
    #38599527
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первый select после открытия отрабатывается быстро, потом - очень медленно
Не понято. Я не умею переоткрывать запросы без Close+Open. Научи.

P.S. Про RC рассказывать не надо, сразу в сад.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
28.03.2014, 18:32:30
    #38599531
PaPo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первый select после открытия отрабатывается быстро, потом - очень медленно
Гаджимурадов РустамПереоткрытие чего, запроса? Close+Open достаточно,
транакцию трогать никак не нужно. Ещё и сам текст
запроса, желательно, не менять без необходимости.

Спасибо большое за инфу!

Гаджимурадов РустамСтатьи и разделы книги на эту тему небольшие и
несложные, прочитать их уйдёт времени меньше,
чем писать тут на форуме.

Еще раз извиняюсь! Если останется время перед сдачей, еще раз пройдусь по статьям и почитаю то, до чего пока не добрался.

Dimitry Sibiryakov[Для одно- двухпользовательского режима - сойдёт, да. А потом опять родится миф, что
"Firebird десять пользователей не тянет".

О, у меня как раз только 2 пользователя и может быть! Отлично!

Спасибо огромное за советы! Вы мне очень помогли!
...
Рейтинг: 0 / 0
28.03.2014, 18:37:05
    #38599534
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первый select после открытия отрабатывается быстро, потом - очень медленно
Dimitry Sibiryakov > Для одно- двухпользовательского режима - сойдёт, да.

Ну что, Дим, получил?

О, у меня как раз только 2 пользователя и может быть! Отлично!

Так что в след. раз думай, прежде чем буркнуть не к месту. :)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
28.03.2014, 18:50:04
    #38599540
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первый select после открытия отрабатывается быстро, потом - очень медленно
Гаджимурадов РустамЯ не умею переоткрывать запросы без Close+Open.
А найти вменяемый ответ на вопрос "зачем переоткрывать запрос" ты умеешь?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
28.03.2014, 18:53:21
    #38599543
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первый select после открытия отрабатывается быстро, потом - очень медленно
Такой ответ искать не нужно, необходимость
переоткрытия должна быть очевидна ДО реализации.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Первый select после открытия отрабатывается быстро, потом - очень медленно / 25 сообщений из 28, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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