|
FB 3.0.4 + Jaybird 3.0.5 - Рост размера базы при SELECT
|
|||
---|---|---|---|
#18+
Добрый день! Есть база под Firebird 3.0.4, в которой хранятся таблицы-справочники. К базе постоянно делается множество запросов из других баз, хранящих идентификаторы записей нужных таблиц, на чтение доп.информации о соответствующей записи справочника. Запросы выполняются посредством JDBC-драйвера Jaybird 3.0.5 отдельными Java-потоками, самостоятельно устанавливающими соединение с БД (conn) и закрывающими его перед завершением своей работы. При организации подключения задаётся Код: java 1. 2. 3.
, т.к., несмотря на то, что, в основном, это SELECT-запросы, логикой приложения допускается делать изменения в справочники. Каждый запрос выполняется в блоке Код: java 1. 2. 3. 4. 5. 6.
, гарантирующем закрытие PreparedStatement и связанных с ним ресурсов (ResultSet). Одна из таблиц этой базы - ORD. После backup/restore базы (при переносе её из FB 2.5) и краткого периода работы в ней её размер был 64 Мб, gstat -a -i выдал следующую информацию: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41.
Затем с базой шла работа примерно месяц. В результате её размер раздулся до 214 Мб, при том, что кол-во записей ни в одной из таблиц не изменилось. gstat выдал для неё: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39.
Известно, что к ней было примерно 40 запросов на создание записей в таблице ORD, и все они окончились неудачей из-за violation of PRIMARY or UNIQUE KEY constraint. Остальные запросы были SELECT, commit() после которых не делался. Заметно ухудшение производительности. Мои предположения: 1. В базе почему-то не ведётся сборка мусора, из-за чего её размер растёт. 2. Сборка мусора не ведётся, т.к. SELECT-транзакции оформлены как read/write и являются "длинными". 3. "Длинными" транзакции являются, т.к. нет явного commit() после SELECT. Хотя в FB работаю с версии 2.0, изучал её поверхностно. Перед тем, как обратиться за помощью, читал http://www.ibase.ru/transactions/ и https://firebirdsql.org/file/documentation/drivers_documentation/Jaybird_2_1_JDBC_driver_manual.pdf (для jaybird 3 такого не нашёл). Хотел бы, чтобы база не росла в размерах, если её таблицы только читаются, и не было снижения быстродействия при работе с ней. Прошу помочь, желательно максимально доступным языком. Сокращения, которые я периодически встречал на форуме, пока пытался найти что-то похожее на мою проблему, мне большей частью не понятны. 4. Если не менять тип соединения на read-only, поможет ли в моей ситуации явный commit() для SELECT-запросов? 5. Если не менять тип соединения на read-only, поможет ли в моей ситуации setAutoCommit(true) для SELECT-запросов? 6. Если поменять тип соединения на read-only для SELECT-запросов, поможет ли это в моей ситуации? 7. Если поменять тип соединения на read-only, можно ли не делать явный commit() для SELECT-запросов? 8. Как делать правильно, на Ваш взгляд (Ваш рецепт)? Спасибо за корректные, доброжелательные ответы. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2019, 14:18 |
|
FB 3.0.4 + Jaybird 3.0.5 - Рост размера базы при SELECT
|
|||
---|---|---|---|
#18+
БЛОБ'ы ? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2019, 14:26 |
|
FB 3.0.4 + Jaybird 3.0.5 - Рост размера базы при SELECT
|
|||
---|---|---|---|
#18+
eltim, gstat -a не дает информацию по версиям. Поэтому надо делать gstat -r только так будет видно, есть там версии, или нет. По идее, судя по маркерам транзакций (oit, oat, ost, next) никакого мусора или версий в базе нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2019, 14:31 |
|
FB 3.0.4 + Jaybird 3.0.5 - Рост размера базы при SELECT
|
|||
---|---|---|---|
#18+
eltim, либо управляйте транзакциями явно, либо не ставьте conn.setAutoCommit(false); eltimPrimary pages: 14, secondary pages: 14770 охренеть. Ваша таблица сильно фрагментирована. Походу вы там одной записи 100500 версий создали. Статистику надо было показать с выводом средней длины цепочки версий (переключатель -r) Есть ли блобы? Небось конкатенацией блобов занимаетесь ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2019, 14:41 |
|
FB 3.0.4 + Jaybird 3.0.5 - Рост размера базы при SELECT
|
|||
---|---|---|---|
#18+
kdv, у него таблица через чур сильно фрагментирована. Вторичных страниц в 1000 раз больше первичных. Как известно на вторичных страницах помещаются либо фрагменты, либо версии. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2019, 14:44 |
|
FB 3.0.4 + Jaybird 3.0.5 - Рост размера базы при SELECT
|
|||
---|---|---|---|
#18+
Мимопроходящий, в базе BLOB-ы есть, но в других таблицах. В этой (ORD) BLOB-ов нет, только поля CHAR, VARCHAR, SMALLINT, INT, BIGINT. gstat -r сначала: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
потом: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Существенное дополнение : Проанализировав код, выяснил (вспомнил), что приложение в отдельном потоке через каждый заданный интервал времени (~ 60 мин.) делает UPDATE всех записей ORD (обновляет поле-флаг актуальной информацией с сервера): Код: java 1.
commit() делается, только если rowsUpdated != 0. Потом соединение закрывается, поток завершается. Насколько я помню, если поле до обновления содержало то же самое значение, что и указываемое при обновлении, FB UPDATE не делает, стало быть, rowsUpdated = 0.. Получается множество неподтверждённых транзакций? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2019, 16:32 |
|
FB 3.0.4 + Jaybird 3.0.5 - Рост размера базы при SELECT
|
|||
---|---|---|---|
#18+
09.08.2019 16:32, eltim пишет: > через каждый заданный интервал времени (~ 60 мин.) делает UPDATE всех записей ORD (обновляет поле-флаг актуальной информацией с сервера) зачем? какую задачу вы таким способом решаете? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2019, 16:39 |
|
FB 3.0.4 + Jaybird 3.0.5 - Рост размера базы при SELECT
|
|||
---|---|---|---|
#18+
Мимопроходящий, ..с LDAP-сервера. Чтобы хранить её [информацию] у себя локально, т.к. он м.б. периодически недоступен. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2019, 16:42 |
|
FB 3.0.4 + Jaybird 3.0.5 - Рост размера базы при SELECT
|
|||
---|---|---|---|
#18+
09.08.2019 16:42, eltim пишет: > ..с LDAP-сервера. Чтобы хранить её [информацию] у себя локально, т.к. он м.б. периодически недоступен. зачем апдейтить то, что не менялось? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2019, 16:43 |
|
FB 3.0.4 + Jaybird 3.0.5 - Рост размера базы при SELECT
|
|||
---|---|---|---|
#18+
eltimприложение в отдельном потоке через каждый заданный интервал времени (~ 60 мин.) делает UPDATE всех записей ORDНу так сервер и выполняет то, что просили. Это занимает место. Мусор собирается не сразу. Но в данный момент он собран. А место осталось зарезервировано. eltimНасколько я помню, если поле до обновления содержало то же самое значение, что и указываемое при обновлении, FB UPDATE не делаетКонечно делает ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2019, 16:45 |
|
FB 3.0.4 + Jaybird 3.0.5 - Рост размера базы при SELECT
|
|||
---|---|---|---|
#18+
Симонов Денислибо управляйте транзакциями явно, либо не ставьте conn.setAutoCommit(false); Идеология в том, чтобы управлять явно, т.к. используется универсальный класс работы с БД, поддерживающий, в т.ч., запись сразу в несколько таблиц как единую операцию. Что не так здесь в явном управлении? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2019, 16:51 |
|
FB 3.0.4 + Jaybird 3.0.5 - Рост размера базы при SELECT
|
|||
---|---|---|---|
#18+
hvladКонечно делает В то же самое время статистика по другой таблице: сначала Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
потом Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Отличие только в swept pages. Стало быть, мусор собирался, но таблицы ORD это не коснулось? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2019, 17:00 |
|
FB 3.0.4 + Jaybird 3.0.5 - Рост размера базы при SELECT
|
|||
---|---|---|---|
#18+
09.08.2019 17:00, eltim пишет: > Отличие только в swept pages. Стало быть, мусор собирался, но таблицы ORD это не коснулось? коснулось. мусор собран. но каждый твой апдейт создаёт новую версию записи. под неё выделяется место на страницах данных. после сборки мусора это место помечается как свободное. но оно то уже выделено и размер базы вырос. посмотри на average fill таблицы ORD. у тебя было 71%, а стало 6%. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2019, 17:05 |
|
FB 3.0.4 + Jaybird 3.0.5 - Рост размера базы при SELECT
|
|||
---|---|---|---|
#18+
Мимопроходящийзачем апдейтить то, что не менялось? Это лучший вариант с т.зрения БД. Но он связан накладными расходами - сверкой значений каждого обновляемого поля. Предположим, каждый раз будут новые данные. Мимопроходящийкоснулось. мусор собран. но каждый твой апдейт создаёт новую версию записи. под неё выделяется место на страницах данных. после сборки мусора это место помечается как свободное. но оно то уже выделено и размер базы вырос. UPDATE всегда создаёт новую версию записи? Можно ли избежать роста БД при UPDATE? Ведь свободного места-то уже много, зачем выделять новое? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2019, 17:17 |
|
FB 3.0.4 + Jaybird 3.0.5 - Рост размера базы при SELECT
|
|||
---|---|---|---|
#18+
09.08.2019 17:17, eltim пишет: > Это лучший вариант с т.зрения БД. > Но он связан накладными расходами - сверкой значений каждого обновляемого поля. сервер железный, он справится. > UPDATE всегда создаёт новую версию записи? да. > Можно ли избежать роста БД при UPDATE? нет. > Ведь свободного места-то уже много, зачем выделять новое? всё зависит от того, как у тебя организовано управление транзакциями. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2019, 17:20 |
|
FB 3.0.4 + Jaybird 3.0.5 - Рост размера базы при SELECT
|
|||
---|---|---|---|
#18+
eltimЭто лучший вариант с т.зрения БД. Это полный бред с любой точки зрения. Если у вас сервер временами недоступен - подымайте его локальное зеркало, которое будет доступно всегда. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2019, 17:23 |
|
FB 3.0.4 + Jaybird 3.0.5 - Рост размера базы при SELECT
|
|||
---|---|---|---|
#18+
eltimМожно ли избежать роста БД при UPDATE? вы считаете, что 214 мб база это какой-то адский размер? По сравнению с 214 гиг, например, это ноль, ничто. Которое полностью помещается в кэше файловой системы. Тем не менее, в таблице ORD 625 записей. А вот фрагментирована она на 14784 страницы, куда (при 8к странице) помещается почти МИЛЛИОН записей. Вопрос - сколько времени надо было держать какую-то транзакцию открытой, чтобы нагенерить миллион версий, если каждый час их количество увеличивается на 625? Если вы сделаете приложение с одной транзакцией, которая будет делать update/commit, то убедитесь, что никакого миллиона версий там не будет, соответственно, не распухнет база, и не будет такой фрагментации. Либо, как вариант, такое количество версий - это просто случайность, типа IBExpert с активной транзакцией, оставленного на несколько дней. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2019, 17:43 |
|
FB 3.0.4 + Jaybird 3.0.5 - Рост размера базы при SELECT
|
|||
---|---|---|---|
#18+
Не нравится мне эта статистика... Я бы сделал валидацию (gfix -v -full) для начала ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2019, 17:56 |
|
FB 3.0.4 + Jaybird 3.0.5 - Рост размера базы при SELECT
|
|||
---|---|---|---|
#18+
eltimНасколько я помню, если поле до обновления содержало то же самое значение, что и указываемое при обновлении, FB UPDATE не делает у UPDATE могут быть косвенные эффекты, даже update T set F = F может, навскидку 1) изменить формат записи, после ALTER TABLE 2) просто попытаться прочитать данные, если БД частично разрушена 3) запустить триггеры Если не хочется "холостого пробега", то и делай явно UPDATE T SET F = V WHERE F IS DISTINCT FROM V (ну или ...WHERE F <> V - но это на NULLах не сработает) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2019, 18:07 |
|
FB 3.0.4 + Jaybird 3.0.5 - Рост размера базы при SELECT
|
|||
---|---|---|---|
#18+
Мимопроходящийкоснулось. мусор собран. Мусор собран, но swept pages для ORD были и остались = 0. Что тогда это значит? kdvсколько времени надо было держать какую-то транзакцию открытой, чтобы нагенерить миллион версий, если каждый час их количество увеличивается на 625? Т.е., причина, скорее всего, в незакрытой транзакции? Мимопроходящийвсё зависит от того, как у тебя организовано управление транзакциями. Я вроде написал, как. Что нужно/можно добавить? Dimitry SibiryakovЭто полный бред с любой точки зрения. Dimitry, здесь я согласился с Мимопроходящим: Мимопроходящийзачем апдейтить то, что не менялось? Dimitry SibiryakovЕсли у вас сервер временами недоступен - подымайте его локальное зеркало, которое будет доступно всегда. Мысль понятна (в данной задаче это неприменимо), но не хотелось бы отвлекаться от темы вопроса. И всё-таки, нужно ли делать commit после SELECT-а и commit после UPDATE-а, не обновившего ни одной записи (при autoCommit = false)? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2019, 18:10 |
|
FB 3.0.4 + Jaybird 3.0.5 - Рост размера базы при SELECT
|
|||
---|---|---|---|
#18+
COMMIT нужно делать всегда, за исключением тех случаев, когда удержание транзакции делается ОСОЗНАННО. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2019, 18:14 |
|
FB 3.0.4 + Jaybird 3.0.5 - Рост размера базы при SELECT
|
|||
---|---|---|---|
#18+
eltimМусор собран, но swept pages для ORD были и остались = 0. Что тогда это значит?Мусор собран не свипом\сборщиком мусора eltimcommit после UPDATE-а, не обновившего ни одной записиОткуда известно, про "ни одной записи" ? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2019, 18:16 |
|
FB 3.0.4 + Jaybird 3.0.5 - Рост размера базы при SELECT
|
|||
---|---|---|---|
#18+
hvladНе нравится мне эта статистика... Я бы сделал валидацию (gfix -v -full) для начала gfix -v -full выдал: Код: sql 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2019, 18:20 |
|
FB 3.0.4 + Jaybird 3.0.5 - Рост размера базы при SELECT
|
|||
---|---|---|---|
#18+
eltim, firebird.log содержит детали ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2019, 18:28 |
|
FB 3.0.4 + Jaybird 3.0.5 - Рост размера базы при SELECT
|
|||
---|---|---|---|
#18+
hvladОткуда известно, про "ни одной записи" ? Код: java 1.
rowsUpdated в данном случае - это "the row count for SQL Data Manipulation Language (DML) statements" Если rowsUpdated = 0, значит, подходящие записи для обновления отсутствовали. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.08.2019, 18:38 |
|
|
start [/forum/topic.php?fid=40&fpage=21&tid=1560618]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
41ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 158ms |
0 / 0 |