|
|
|
Первый select после открытия отрабатывается быстро, потом - очень медленно
|
|||
|---|---|---|---|
|
#18+
Всем привет! Я пишу прогу для работы с базой данных в пятом Билдере с использованием компонентов 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. Также на форме присутствует кнопка (типа "Обновить таблицу"), в обработчике нажатия которой висит такой же точно запрос. Проблема в том, что при старте проги такой запрос выполняется очень быстро, а при нажатии на кнопку в разы дольше. И еще кое-что. В базе существует два индекса по первому полю (поле ID, NOT_NULL, больше ограничений не накладывалось, так как id контролируется из-вне). Один индекс Ascending, другой - Descending. Также к базе коннектится еще одна программа, таким же точно методом, как первая. Она где-то каждые 10 сек вставляет около 2 тыс записей и столько же обновляет. Перестройка индексов ничего не дает (не через DROP/CREATE INDEX, не через ALTER INDEX). Да в первой проге (в той, в которой проблема) сортировка не обязательно по ID проводится. Не помогает в ручную запускать и коммиттить все транзакции. То есть Код: plaintext 1. 2. 3. 4. 5. 6. 7. В общем, голову всю сломал. Программист я почти никакой, а про базы данных впервые прочитал пару месяцев назад. Поэтому даже вопрос толком гуглу не могу составить! Заранее, спасибо за ответы! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2014, 23:00:31 |
|
||
|
Первый select после открытия отрабатывается быстро, потом - очень медленно
|
|||
|---|---|---|---|
|
#18+
PaPoПараметры TIBTransaction - Read Committed, no_rec_version, wait. тихий ужас. читайте http://www.ibase.ru/devinfo/ibx.htm PaPoпри старте проги такой запрос выполняется очень быстро, а при нажатии на кнопку в разы дольше. так не бывает. включите IBSQLMonitor, посмотрите что выполняется при старте, а что при нажатии на кнопку. Вполне вероятно, что во второй раз происходит FetchAll, или выполняется другой запрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2014, 23:14:14 |
|
||
|
Первый select после открытия отрабатывается быстро, потом - очень медленно
|
|||
|---|---|---|---|
|
#18+
kdvтихий ужас. Это точно! Я и сам так постоянно думаю. kdvчитайте http://www.ibase.ru/devinfo/ibx.htm kdvтак не бывает. включите IBSQLMonitor, посмотрите что выполняется при старте, а что при нажатии на кнопку. Вполне вероятно, что во второй раз происходит FetchAll, или выполняется другой запрос. Спасибо большое! Буду разбираться! По идее, FetchAl выполняется оба раза, но может просто я не понимаю, что на самом делает моя прога :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2014, 23:23:49 |
|
||
|
Первый select после открытия отрабатывается быстро, потом - очень медленно
|
|||
|---|---|---|---|
|
#18+
PaPo, кстати, "отрабатывается очень медленно" - скорее всего твоя транзакция с параметрами Read Committed, no_rec_version, wait повисает при чтении новых и не committed данных, пока конкурирующее приложение до конца их не вставит. Зачем нужно было ставить такие параметры, да еще и которые прописываются в IBTransaction только вручную, непонятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2014, 23:23:52 |
|
||
|
Первый select после открытия отрабатывается быстро, потом - очень медленно
|
|||
|---|---|---|---|
|
#18+
Да вот и мне непонятно! Ладно, буду читать мануал к IBX, надеюсь разберусь kdvкстати, "отрабатывается очень медленно" - скорее всего твоя транзакция с параметрами Read Committed, no_rec_version, wait повисает при чтении новых и не committed данных, пока конкурирующее приложение до конца их не вставит. Не уверен. Запускал запрос в разные моменты, и когда вторая прога записывала данные, и когда нет. Результат одинаковый. Впрочем, если я неправильно пользуюсь транзакциями, то вторая прога тоже работает не совсем адекватно, потому что ее тоже писал я :D ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2014, 23:29:55 |
|
||
|
Первый select после открытия отрабатывается быстро, потом - очень медленно
|
|||
|---|---|---|---|
|
#18+
Кстати! Еще один вопрос есть. Напишу здесь, чтобы не плодить тем. Я ввожу число в TEdit, откуда оно вставляется в запрос. Так вот надо найти запись с самым близким значением выбранного поля к тому, которое было введено. То есть запрос ищет запись, в которой поле равно не конкретному точному значению, а наиболее близко к числу, введенному пользователем. Искомый параметр типа int и float. Есть какой-то стандартный метод составления подобного запроса? Поиск наиболее похожего значения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2014, 23:37:02 |
|
||
|
Первый select после открытия отрабатывается быстро, потом - очень медленно
|
|||
|---|---|---|---|
|
#18+
PaPo То есть запрос ищет запись, в которой поле равно не конкретному точному значению, а наиболее близко к числу, введенному пользователем. Искомый параметр типа int и float. Есть какой-то стандартный метод составления подобного запроса? Поиск наиболее похожего значения. First 1 и order by ABS(T_Field-:I_Field) зы. насколько стандартный не знаю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2014, 23:47:19 |
|
||
|
Первый select после открытия отрабатывается быстро, потом - очень медленно
|
|||
|---|---|---|---|
|
#18+
m7m First 1 и order by ABS(T_Field-:I_Field) зы. насколько стандартный не знаю Спасибо большое за подсказку! Теперь хоть знаю, что искать. Если не затруднит, можно примерчик запроса? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2014, 23:53:32 |
|
||
|
Первый select после открытия отрабатывается быстро, потом - очень медленно
|
|||
|---|---|---|---|
|
#18+
PaPom7m First 1 и order by ABS(T_Field-:I_Field) зы. насколько стандартный не знаю Спасибо большое за подсказку! Теперь хоть знаю, что искать. Если не затруднит, можно примерчик запроса? Код: sql 1. 2. 3. 4. Ну как-то так ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2014, 00:17:55 |
|
||
|
Первый select после открытия отрабатывается быстро, потом - очень медленно
|
|||
|---|---|---|---|
|
#18+
PaPo, еще и float... PaPoВпрочем, если я неправильно пользуюсь транзакциями неправильно. для нормального чтения надо read_committed rec_version nowait Выбирается по правой кнопке на IBTransaction, транзакция ReadCommitted. зачем тебе нужен no_rec_version + wait ты не объяснил. Перед объяснением советую прочитать http://www.ibase.ru/devinfo/ibtrans.htm ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2014, 00:20:31 |
|
||
|
Первый select после открытия отрабатывается быстро, потом - очень медленно
|
|||
|---|---|---|---|
|
#18+
m7m , спасибо огромное! Вы очень помогли. Дальше я разберусь. kdvнеправильно. для нормального чтения надо read_committed rec_version nowait Выбирается по правой кнопке на IBTransaction, транзакция ReadCommitted. зачем тебе нужен no_rec_version + wait ты не объяснил. Перед объяснением советую прочитать http://www.ibase.ru/devinfo/ibtrans.htm Спасибо за совет. Все объясняется тем, что я не программист. Теперь, естественно, первым делом досконально изучу манаул! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2014, 00:43:13 |
|
||
|
Первый select после открытия отрабатывается быстро, потом - очень медленно
|
|||
|---|---|---|---|
|
#18+
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. А транзакции, работающие с открытием набора, отрабатываются так: Код: plaintext 1. 2. 3. 4. 5. Свойсто OpenTransaction->AutoStopAction установленно в saCommit. Так вот вопрос, может ли Open(); вызывать исключение? Может стоит на чтение данных тоже стоит повесить try {commit} - catch {rollback}? Ну и вообще, комментарии было бы интересно послушать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2014, 16:56:28 |
|
||
|
Первый select после открытия отрабатывается быстро, потом - очень медленно
|
|||
|---|---|---|---|
|
#18+
PaPoТак вот вопрос, может ли Open(); вызывать исключение? Может стоит на чтение данных тоже стоит повесить try {commit} - catch {rollback}? Что-то я не уверен в адекватности этого вопроса. Лучше скажите, нужно ли перед OpenQuery->Open(); запускать транзакцию? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2014, 17:05:07 |
|
||
|
Первый select после открытия отрабатывается быстро, потом - очень медленно
|
|||
|---|---|---|---|
|
#18+
PaPo > Так вот вопрос, может ли Open(); вызывать исключение? Может, в принципе. PaPo > Лучше скажите, нужно ли перед OpenQuery->Open(); запускать транзакцию? Ну, если она ещё не активна, то последует попытка её старта. Но полагаться на автоматическое управление транзакциями не советую - на эту тему говорилось и писалось много, читайте. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2014, 17:18:18 |
|
||
|
Первый select после открытия отрабатывается быстро, потом - очень медленно
|
|||
|---|---|---|---|
|
#18+
PaPoПочитал! Очень хорошо написано, спасибо! Стало понятно гораздо больше, чем было. А теперь перечитай ещё два раза, внимательно. Поскольку твой следующий вопрос свидетельствует о том, что "гораздо больше" это скорее "чуть-чуть". Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2014, 17:21:30 |
|
||
|
Первый select после открытия отрабатывается быстро, потом - очень медленно
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovА теперь перечитай ещё два раза, внимательно. Поскольку твой следующий вопрос свидетельствует о том, что "гораздо больше" это скорее "чуть-чуть". "Гораздо больше" в моем случае не исключает "чуть-чуть" Гаджимурадов РустамНо полагаться на автоматическое управление транзакциями не советую - на эту тему говорилось и писалось много, читайте. Вот с этим моментом я как раз и не разобрался! Я конечно же почитаю, если останется время Я неправильно спросил. У меня все время открыта читающая транзакция и в ДБГриде постоянно отображаются данные. Как правильнее сделать переоткрытие? Код: plaintext 1. 2. 3. 4. ? или установить OpenTransaction->AutoStopAction в saNone и Код: plaintext 1. 2. 3. 4. 5. 6. Это не критично, потому что и так все более-менее работает. Извиняюсь, что задаю много тупых вопрос, но времени досканально разбираться совсем не осталось! И помимо взаимодействия с БД проблем выше крыши! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2014, 17:57:20 |
|
||
|
Первый select после открытия отрабатывается быстро, потом - очень медленно
|
|||
|---|---|---|---|
|
#18+
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, если бы ты понимал, к чему этот параметр приводит. А так я посоветую читать вышеозначенные документы до просветления, несколько раз, пока не станет понятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2014, 17:59:22 |
|
||
|
Первый select после открытия отрабатывается быстро, потом - очень медленно
|
|||
|---|---|---|---|
|
#18+
PaPoно времени досканально разбираться совсем не осталось! это не наши проблемы. Статьи пишут когда нужно разжевать какую-то тему, или достает отвечать на одни и те же вопросы. Если ты статьи читать не хочешь (нет времени), то думаешь, нам интересно тут напевать тебе содержание этих статей? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2014, 18:01:10 |
|
||
|
Первый select после открытия отрабатывается быстро, потом - очень медленно
|
|||
|---|---|---|---|
|
#18+
PaPo> Как правильнее сделать переоткрытие? PaPo> OpenQuery->Close(); PaPo> OpenQuery->Open(); Переоткрытие чего, запроса? Close+Open достаточно, транакцию трогать никак не нужно. Ещё и сам текст запроса, желательно, не менять без необходимости. > Извиняюсь, что задаю много тупых вопрос, но > времени досканально разбираться совсем не осталось! > И помимо взаимодействия с БД проблем выше крыши! Статьи и разделы книги на эту тему небольшие и несложные, прочитать их уйдёт времени меньше, чем писать тут на форуме. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2014, 18:11:15 |
|
||
|
Первый select после открытия отрабатывается быстро, потом - очень медленно
|
|||
|---|---|---|---|
|
#18+
Гаджимурадов РустамПереоткрытие чего, запроса? Close+Open достаточно, Для одно- двухпользовательского режима - сойдёт, да. А потом опять родится миф, что "Firebird десять пользователей не тянет". Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2014, 18:19:44 |
|
||
|
Первый select после открытия отрабатывается быстро, потом - очень медленно
|
|||
|---|---|---|---|
|
#18+
Не понято. Я не умею переоткрывать запросы без Close+Open. Научи. P.S. Про RC рассказывать не надо, сразу в сад. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2014, 18:29:05 |
|
||
|
Первый select после открытия отрабатывается быстро, потом - очень медленно
|
|||
|---|---|---|---|
|
#18+
Гаджимурадов РустамПереоткрытие чего, запроса? Close+Open достаточно, транакцию трогать никак не нужно. Ещё и сам текст запроса, желательно, не менять без необходимости. Спасибо большое за инфу! Гаджимурадов РустамСтатьи и разделы книги на эту тему небольшие и несложные, прочитать их уйдёт времени меньше, чем писать тут на форуме. Еще раз извиняюсь! Если останется время перед сдачей, еще раз пройдусь по статьям и почитаю то, до чего пока не добрался. Dimitry Sibiryakov[Для одно- двухпользовательского режима - сойдёт, да. А потом опять родится миф, что "Firebird десять пользователей не тянет". О, у меня как раз только 2 пользователя и может быть! Отлично! Спасибо огромное за советы! Вы мне очень помогли! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2014, 18:32:30 |
|
||
|
Первый select после открытия отрабатывается быстро, потом - очень медленно
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov > Для одно- двухпользовательского режима - сойдёт, да. Ну что, Дим, получил? О, у меня как раз только 2 пользователя и может быть! Отлично! Так что в след. раз думай, прежде чем буркнуть не к месту. :) Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2014, 18:37:05 |
|
||
|
Первый select после открытия отрабатывается быстро, потом - очень медленно
|
|||
|---|---|---|---|
|
#18+
Гаджимурадов РустамЯ не умею переоткрывать запросы без Close+Open. А найти вменяемый ответ на вопрос "зачем переоткрывать запрос" ты умеешь? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2014, 18:50:04 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=38599461&tid=1563762]: |
0ms |
get settings: |
11ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
203ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
79ms |
get tp. blocked users: |
1ms |
| others: | 237ms |
| total: | 568ms |

| 0 / 0 |
