powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Первый select после открытия отрабатывается быстро, потом - очень медленно
25 сообщений из 28, страница 1 из 2
Первый select после открытия отрабатывается быстро, потом - очень медленно
    #38598594
PaPo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!
Я пишу прогу для работы с базой данных в пятом Билдере с использованием компонентов 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
Первый select после открытия отрабатывается быстро, потом - очень медленно
    #38598606
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaPoПараметры TIBTransaction - Read Committed, no_rec_version, wait.
тихий ужас.
читайте
http://www.ibase.ru/devinfo/ibx.htm

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

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

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

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

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

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

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

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

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

зы. насколько стандартный не знаю
...
Рейтинг: 0 / 0
Первый select после открытия отрабатывается быстро, потом - очень медленно
    #38598623
PaPo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
m7m First 1 и order by ABS(T_Field-:I_Field)
зы. насколько стандартный не знаю
Спасибо большое за подсказку! Теперь хоть знаю, что искать.
Если не затруднит, можно примерчик запроса?
...
Рейтинг: 0 / 0
Первый select после открытия отрабатывается быстро, потом - очень медленно
    #38598630
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Первый select после открытия отрабатывается быстро, потом - очень медленно
    #38598631
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaPo,

еще и float...

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

kdvнеправильно. для нормального чтения надо
read_committed
rec_version
nowait
Выбирается по правой кнопке на IBTransaction, транзакция ReadCommitted. зачем тебе нужен no_rec_version + wait ты не объяснил.
Перед объяснением советую прочитать http://www.ibase.ru/devinfo/ibtrans.htm
Спасибо за совет.
Все объясняется тем, что я не программист.
Теперь, естественно, первым делом досконально изучу манаул!
...
Рейтинг: 0 / 0
Первый select после открытия отрабатывается быстро, потом - очень медленно
    #38599411
PaPo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Первый select после открытия отрабатывается быстро, потом - очень медленно
    #38599429
PaPo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PaPoТак вот вопрос, может ли Open(); вызывать исключение? Может стоит на чтение данных тоже стоит повесить try {commit} - catch {rollback}?

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

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

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

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

Ну, если она ещё не активна, то последует попытка её старта.
Но полагаться на автоматическое управление транзакциями не
советую - на эту тему говорилось и писалось много, читайте.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Первый select после открытия отрабатывается быстро, потом - очень медленно
    #38599461
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaPoПочитал! Очень хорошо написано, спасибо! Стало понятно гораздо больше, чем
было.
А теперь перечитай ещё два раза, внимательно. Поскольку твой следующий вопрос
свидетельствует о том, что "гораздо больше" это скорее "чуть-чуть".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Первый select после открытия отрабатывается быстро, потом - очень медленно
    #38599496
PaPo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Первый select после открытия отрабатывается быстро, потом - очень медленно
    #38599499
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Первый select после открытия отрабатывается быстро, потом - очень медленно
    #38599500
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaPoно времени досканально разбираться совсем не осталось!
это не наши проблемы. Статьи пишут когда нужно разжевать какую-то тему, или достает отвечать на одни и те же вопросы. Если ты статьи читать не хочешь (нет времени), то думаешь, нам интересно тут напевать тебе содержание этих статей?
...
Рейтинг: 0 / 0
Первый select после открытия отрабатывается быстро, потом - очень медленно
    #38599506
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaPo> Как правильнее сделать переоткрытие?
PaPo> OpenQuery->Close();
PaPo> OpenQuery->Open();

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

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

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

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

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

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

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

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

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

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

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

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

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


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