|
Еще раз про сборку мусора
|
|||
---|---|---|---|
#18+
Здравствуйте, уважаемые! Никак не могу понять одну вещь про сборку мусора в базе. Дано: FB 2.5. SS или FB 3.0 SS, один коннект, две таблицы Tbl1 и Tbl2, три транзакции Tr1 (пишущая), Tr2 и Tr3 (только чтение) Действия: 1. в Tr3 делаем select * from Tbl2, транзакция остается висеть. 2. В Tr1 пишем много записей в таблицу Tbl1, коммитим Tr1 3. Делаем много разных чтений из Tbl1 в Tr2 4. Удаляем из нее все записи опять в Tr1, коммитим Tr1 5. Коммитим Tr2. Для очистки мусора делаем select * from Tbl1 в Tr2, снова коммитим Tr2 Теперь если повторять шаги 2-5, то с каждым циклом они выполняются все медленнее и медленнее, из-за чего делаю вывод, что мусор не собирается. Но почему? Единственная незакомиченная транзакция в базе - Tr3 и ее таблица Tbl1 никак не интересует И дело явно в Tr3, так как если ее закоммитить в первом шаге или вообще первый шаг не делать, то сколько бы не было циклов 2-5 они выполняются примерно за одно и то же время. Не знаю, важно или нет: 1. Tbl1 - таблица временная на коннект, Tbl2 - постоянная. 2. Наличие/отсутствие запросов select * from Tbl2 в незакомиченных транзакциях из другого коннекта никак не влияют на скорость выполнения цикла. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2019, 08:07 |
|
Еще раз про сборку мусора
|
|||
---|---|---|---|
#18+
VerLeon,Но почему? Единственная незакомиченная транзакция в базе - Tr3 и ее таблица Tbl1 никак не интересует Судя по всему, Вы думаете будто транзакции "привязаны" к конкретным таблицам (, которые были в них прочитаны ил изменены). Это не верно. Транзакции оказывают влияние на все без исключения таблицы базы. Даже если бы вы в просто стартовали Tr3 и ничего в ней не читали, то мусор бы точно так же накапливался. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2019, 08:23 |
|
Еще раз про сборку мусора
|
|||
---|---|---|---|
#18+
bsv9VerLeon,Но почему? Единственная незакомиченная транзакция в базе - Tr3 и ее таблица Tbl1 никак не интересует Судя по всему, Вы думаете будто транзакции "привязаны" к конкретным таблицам (, которые были в них прочитаны ил изменены). Это не верно. Транзакции оказывают влияние на все без исключения таблицы базы. Даже если бы вы в просто стартовали Tr3 и ничего в ней не читали, то мусор бы точно так же накапливался. Очевидно, что я что-то недопонимаю в сборке мусора, но если бы Tr3 была пишущей или snapshot, но она read и read_committed - с чего ее должны интересовать старые версии записей всех таблиц в базе? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2019, 08:41 |
|
Еще раз про сборку мусора
|
|||
---|---|---|---|
#18+
авторТеперь если повторять шаги 2-5, то с каждым циклом они выполняются все медленнее и медленнее, из-за чего делаю вывод, что мусор не собирается. А точно накапливается? Посмотрите точно количество версий до и после эксперимента: Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2019, 08:54 |
|
Еще раз про сборку мусора
|
|||
---|---|---|---|
#18+
VerLeon5. Коммитим Tr2. Для очистки мусора делаем select * from Tbl1 в Tr2, снова коммитим Tr2 как минимум надо было Код: sql 1.
в противном случае нет никаких гарантий, что ты прочёл таблицу целиком ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2019, 09:19 |
|
Еще раз про сборку мусора
|
|||
---|---|---|---|
#18+
выдал по этой таблице Average version length: 0.00, total versions: 0, max versions: 0 еще до попытки сборки мусора но не думаю, что он может выдать что-то вразумительное про временную таблицу ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2019, 09:21 |
|
Еще раз про сборку мусора
|
|||
---|---|---|---|
#18+
Симонов ДенисVerLeon5. Коммитим Tr2. Для очистки мусора делаем select * from Tbl1 в Tr2, снова коммитим Tr2 как минимум надо было Код: sql 1.
в противном случае нет никаких гарантий, что ты прочёл таблицу целиком Да дело не в этом точно (кстати, вроде как раз count(*) теперь мусор не собирает, так как собственно в записи не лезет) Сборка мусора прекрасно происходит запросом и select *, если при этом не висит Tr3 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2019, 09:24 |
|
Еще раз про сборку мусора
|
|||
---|---|---|---|
#18+
VerLeonДа дело не в этом точно (кстати, вроде как раз count(*) теперь мусор не собирает, так как собственно в записи не лезет) собирает. count просто в некоторых случаях не распаковывает запись, но видимость версий проверяется в любом случае. Если версия не видна и её можно удалить, то она удаляется VerLeonСборка мусора прекрасно происходит запросом и select * в данном случае да, ибо перед этим делается delete всех записей ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2019, 09:33 |
|
Еще раз про сборку мусора
|
|||
---|---|---|---|
#18+
Симонов ДенисVerLeonДа дело не в этом точно (кстати, вроде как раз count(*) теперь мусор не собирает, так как собственно в записи не лезет) собирает. count просто в некоторых случаях не распаковывает запись, но видимость версий проверяется в любом случае. Если версия не видна и её можно удалить, то она удаляется VerLeonСборка мусора прекрасно происходит запросом и select * в данном случае да, ибо перед этим делается delete всех записей Да, согласен, не учел, что мне надо собрать мусор по полностью пустой таблице. Но в данном случае без разницы. Что-то мне кажется, что проблема именно в том, что Tbl1 - временная на коннект, вот только почему от этого такой эффект... ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2019, 09:47 |
|
Еще раз про сборку мусора
|
|||
---|---|---|---|
#18+
VerLeon, включи трассировку и посмотри что происходит. Заодно будет видно с какими действительно параметрами стартуют транзакции. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2019, 09:53 |
|
Еще раз про сборку мусора
|
|||
---|---|---|---|
#18+
VerLeonОчевидно, что я что-то недопонимаю в сборке мусора, но если бы Tr3 была пишущей или snapshot, но она read и read_committed - с чего ее должны интересовать старые версии записей всех таблиц в базе?Для GTT это не имеет значения, ибо в них можно писать и в RO тр-циях. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2019, 10:47 |
|
Еще раз про сборку мусора
|
|||
---|---|---|---|
#18+
hvladVerLeonОчевидно, что я что-то недопонимаю в сборке мусора, но если бы Tr3 была пишущей или snapshot, но она read и read_committed - с чего ее должны интересовать старые версии записей всех таблиц в базе?Для GTT это не имеет значения, ибо в них можно писать и в RO тр-циях. О как.. Т.е. чтобы собрать мусор в GTT нужно сначала завершить вообще все транзакции в коннекте? Печально... Придется видимо операции с ними выносить в отдельный коннект ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2019, 11:05 |
|
Еще раз про сборку мусора
|
|||
---|---|---|---|
#18+
В данном сценарии не вижу - зачем GTT создана как ON COMMIT PRESERVE ROWS ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2019, 11:11 |
|
Еще раз про сборку мусора
|
|||
---|---|---|---|
#18+
VerLeonПридется видимо операции с ними выносить в отдельный коннектЕще есть ON COMMIT DELETE ROWS ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2019, 11:25 |
|
Еще раз про сборку мусора
|
|||
---|---|---|---|
#18+
hvladДля GTT это не имеет значения, ибо в них можно писать и в RO тр-циях. Поясните, пож, для чего это не имеет значения? Я не удержался и попробовал: при наличии висящей читающей транзакции, массово пишу и изменяю данные в GTT. Не важно, в пишущей или в читающей транзакции я модифицирую GTT, версии записи не накапливаются. Мусор не копится на любых GTT - и на "ON COMMIT PRESERVE ROWS" и на "ON COMMIT DELETE ROWS". То есть, мне, вообще, не удается повторить сценарий VerLeon. Не копится мусор, ни при каких условиях. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2019, 11:32 |
|
Еще раз про сборку мусора
|
|||
---|---|---|---|
#18+
Да, я тестировал на версии 3.0.5. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2019, 11:36 |
|
Еще раз про сборку мусора
|
|||
---|---|---|---|
#18+
hvladВ данном сценарии не вижу - зачем GTT создана как ON COMMIT PRESERVE ROWS Ну это упрощенное описание, на самом деле на шагах 2-4 делается много всего и долго и не хотелось иметь длинную пишущую транзакцию, поэтому делалось по классике: писалось все короткими транзакциями, а читалось другой, RO Но не учитывался вот этот факт: hvlad ибо в них можно писать и в RO тр-циях Сейчас попробую выделить всю работу с GTT (и запись и чтение) в одну RO-транзакцию и сделать их DELETE ROWS. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2019, 11:46 |
|
Еще раз про сборку мусора
|
|||
---|---|---|---|
#18+
bsv9Да, я тестировал на версии 3.0.5. У меня 3.0.2 и 2.5.7 - поведение одинаковое. Да и вряд ли что-то в 3.0.5 поменялось, раз Влад говорит, что это нормально. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2019, 13:37 |
|
Еще раз про сборку мусора
|
|||
---|---|---|---|
#18+
VerLeon, Влад не сказал, что это нормально. Он намекнул, что если ты в Tr1 только пишешь во временную таблицу и не пишешь в постоянные, то смысла делать транзакцию write нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2019, 13:56 |
|
Еще раз про сборку мусора
|
|||
---|---|---|---|
#18+
Переделал все на DELETE ROWS с чтением/записью в них в RO транзакции - проблемы больше нет. Ну и не удивительно, с такими GTT проблемы с мусором быть и не может, главное что RO транзакция отработала. Влад, спасибо за наставление на путь истинный! :) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2019, 13:56 |
|
Еще раз про сборку мусора
|
|||
---|---|---|---|
#18+
Симонов ДенисVerLeon, Влад не сказал, что это нормально. Он намекнул, что если ты в Tr1 только пишешь во временную таблицу и не пишешь в постоянные, то смысла делать транзакцию write нет. Ну логично, что если RO может писать в GTT, то и мусор из нее не соберется, даже если висит только эта RO в Tr1 я конечно не только во временную писал, это упрощенный пример, на самом деле там куча всего. Пришлось разделять, но в итоге проблема ушла и стало еще быстрее. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2019, 13:59 |
|
Еще раз про сборку мусора
|
|||
---|---|---|---|
#18+
Хм, а всё же - нормально это или нет? Не окажется ли, что это в ближайших релизах FB посчитают ненормальным и моя схема с писанием в GTT c помощью RO транзакции накроется? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2019, 15:40 |
|
Еще раз про сборку мусора
|
|||
---|---|---|---|
#18+
В первых релизах 2.5 в RO транзакции нельзя было писать в GTT, потом разрешили. У меня вся логика длительных вычислений построена на GTT+RO ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2019, 15:49 |
|
Еще раз про сборку мусора
|
|||
---|---|---|---|
#18+
VerLeonНе окажется ли, что это в ближайших релизах FB посчитают ненормальнымВсе идет у тому, что пишущая ридкоммитед транзакция перестанет копить мусор и RO перестанет быть столь актуальной. Так что, если перестанет писать в RO (что мне не кажется правильным, вполне нормально в RO режиме сделать некие "пометки на полях" база же не меняется) сменишь на RW. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2019, 15:50 |
|
Еще раз про сборку мусора
|
|||
---|---|---|---|
#18+
Ivan_Pisarevsky, всё зависит от того как построено приложение. В 4.0 если в Read Committed будет недофетченный курсор, то будет удерживать версии, но теперь только те что видны ей, а не всю цепочку. А RO или RW уже по фигу ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2019, 17:09 |
|
|
start [/forum/topic.php?fid=40&fpage=20&tid=1560574]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
46ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
62ms |
get tp. blocked users: |
2ms |
others: | 11ms |
total: | 163ms |
0 / 0 |