Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Firebird, InterBase Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Еще раз про сборку мусора  [new]
VerLeon
Member

Откуда: Новосибирск
Сообщений: 25
Здравствуйте, уважаемые!

Никак не могу понять одну вещь про сборку мусора в базе.

Дано: 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 сен 19, 08:07    [21973811]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз про сборку мусора  [new]
bsv9
Member

Откуда:
Сообщений: 44
VerLeon,
Но почему? Единственная незакомиченная транзакция в базе - Tr3 и ее таблица Tbl1 никак не интересует

Судя по всему, Вы думаете будто транзакции "привязаны" к конкретным таблицам (, которые были в них прочитаны ил изменены). Это не верно. Транзакции оказывают влияние на все без исключения таблицы базы. Даже если бы вы в просто стартовали Tr3 и ничего в ней не читали, то мусор бы точно так же накапливался.
19 сен 19, 08:23    [21973819]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз про сборку мусора  [new]
VerLeon
Member

Откуда: Новосибирск
Сообщений: 25
bsv9
VerLeon,
Но почему? Единственная незакомиченная транзакция в базе - Tr3 и ее таблица Tbl1 никак не интересует

Судя по всему, Вы думаете будто транзакции "привязаны" к конкретным таблицам (, которые были в них прочитаны ил изменены). Это не верно. Транзакции оказывают влияние на все без исключения таблицы базы. Даже если бы вы в просто стартовали Tr3 и ничего в ней не читали, то мусор бы точно так же накапливался.


Очевидно, что я что-то недопонимаю в сборке мусора, но если бы Tr3 была пишущей или snapshot, но она read и read_committed - с чего ее должны интересовать старые версии записей всех таблиц в базе?
19 сен 19, 08:41    [21973831]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз про сборку мусора  [new]
bsv9
Member

Откуда:
Сообщений: 44
автор
Теперь если повторять шаги 2-5, то с каждым циклом они выполняются все медленнее и медленнее, из-за чего делаю вывод, что мусор не собирается.

А точно накапливается? Посмотрите точно количество версий до и после эксперимента:
gstat  -d -r server:database | grep version
19 сен 19, 08:54    [21973843]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз про сборку мусора  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10154
VerLeon
5. Коммитим Tr2. Для очистки мусора делаем select * from Tbl1 в Tr2, снова коммитим Tr2


как минимум надо было
select count(*) from Tbl1
в противном случае нет никаких гарантий, что ты прочёл таблицу целиком
19 сен 19, 09:19    [21973868]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз про сборку мусора  [new]
VerLeon
Member

Откуда: Новосибирск
Сообщений: 25
выдал по этой таблице

Average version length: 0.00, total versions: 0, max versions: 0

еще до попытки сборки мусора
но не думаю, что он может выдать что-то вразумительное про временную таблицу
19 сен 19, 09:21    [21973870]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз про сборку мусора  [new]
VerLeon
Member

Откуда: Новосибирск
Сообщений: 25
Симонов Денис
VerLeon
5. Коммитим Tr2. Для очистки мусора делаем select * from Tbl1 в Tr2, снова коммитим Tr2


как минимум надо было
select count(*) from Tbl1
в противном случае нет никаких гарантий, что ты прочёл таблицу целиком


Да дело не в этом точно (кстати, вроде как раз count(*) теперь мусор не собирает, так как собственно в записи не лезет)
Сборка мусора прекрасно происходит запросом и select *, если при этом не висит Tr3
19 сен 19, 09:24    [21973873]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз про сборку мусора  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10154
VerLeon
Да дело не в этом точно (кстати, вроде как раз count(*) теперь мусор не собирает, так как собственно в записи не лезет)


собирает. count просто в некоторых случаях не распаковывает запись, но видимость версий проверяется в любом случае. Если версия не видна и её можно удалить, то она удаляется


VerLeon
Сборка мусора прекрасно происходит запросом и select *


в данном случае да, ибо перед этим делается delete всех записей
19 сен 19, 09:33    [21973881]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз про сборку мусора  [new]
VerLeon
Member

Откуда: Новосибирск
Сообщений: 25
Симонов Денис
VerLeon
Да дело не в этом точно (кстати, вроде как раз count(*) теперь мусор не собирает, так как собственно в записи не лезет)


собирает. count просто в некоторых случаях не распаковывает запись, но видимость версий проверяется в любом случае. Если версия не видна и её можно удалить, то она удаляется


VerLeon
Сборка мусора прекрасно происходит запросом и select *


в данном случае да, ибо перед этим делается delete всех записей


Да, согласен, не учел, что мне надо собрать мусор по полностью пустой таблице.
Но в данном случае без разницы.

Что-то мне кажется, что проблема именно в том, что Tbl1 - временная на коннект, вот только почему от этого такой эффект...
19 сен 19, 09:47    [21973899]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз про сборку мусора  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10154
VerLeon,

включи трассировку и посмотри что происходит. Заодно будет видно с какими действительно параметрами стартуют транзакции.
19 сен 19, 09:53    [21973909]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз про сборку мусора  [new]
hvlad
Member

Откуда:
Сообщений: 10666
VerLeon
Очевидно, что я что-то недопонимаю в сборке мусора, но если бы Tr3 была пишущей или snapshot, но она read и read_committed - с чего ее должны интересовать старые версии записей всех таблиц в базе?
Для GTT это не имеет значения, ибо в них можно писать и в RO тр-циях.
19 сен 19, 10:47    [21973959]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз про сборку мусора  [new]
VerLeon
Member

Откуда: Новосибирск
Сообщений: 25
hvlad
VerLeon
Очевидно, что я что-то недопонимаю в сборке мусора, но если бы Tr3 была пишущей или snapshot, но она read и read_committed - с чего ее должны интересовать старые версии записей всех таблиц в базе?
Для GTT это не имеет значения, ибо в них можно писать и в RO тр-циях.


О как.. Т.е. чтобы собрать мусор в GTT нужно сначала завершить вообще все транзакции в коннекте?
Печально...
Придется видимо операции с ними выносить в отдельный коннект
19 сен 19, 11:05    [21973978]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз про сборку мусора  [new]
hvlad
Member

Откуда:
Сообщений: 10666
В данном сценарии не вижу - зачем GTT создана как ON COMMIT PRESERVE ROWS
19 сен 19, 11:11    [21973989]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз про сборку мусора  [new]
Ivan_Pisarevsky
Member

Откуда: НН
Сообщений: 8413
VerLeon
Придется видимо операции с ними выносить в отдельный коннект
Еще есть
ON COMMIT DELETE ROWS
19 сен 19, 11:25    [21974010]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз про сборку мусора  [new]
bsv9
Member

Откуда:
Сообщений: 44
hvlad
Для GTT это не имеет значения, ибо в них можно писать и в RO тр-циях.

Поясните, пож, для чего это не имеет значения?

Я не удержался и попробовал: при наличии висящей читающей транзакции, массово пишу и изменяю данные в GTT. Не важно, в пишущей или в читающей транзакции я модифицирую GTT, версии записи не накапливаются. Мусор не копится на любых GTT - и на "ON COMMIT PRESERVE ROWS" и на "ON COMMIT DELETE ROWS".

То есть, мне, вообще, не удается повторить сценарий VerLeon. Не копится мусор, ни при каких условиях.
19 сен 19, 11:32    [21974015]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз про сборку мусора  [new]
bsv9
Member

Откуда:
Сообщений: 44
Да, я тестировал на версии 3.0.5.
19 сен 19, 11:36    [21974023]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз про сборку мусора  [new]
VerLeon
Member

Откуда: Новосибирск
Сообщений: 25
hvlad
В данном сценарии не вижу - зачем GTT создана как ON COMMIT PRESERVE ROWS


Ну это упрощенное описание, на самом деле на шагах 2-4 делается много всего и долго и не хотелось иметь длинную пишущую транзакцию, поэтому делалось по классике: писалось все короткими транзакциями, а читалось другой, RO
Но не учитывался вот этот факт:

hvlad
ибо в них можно писать и в RO тр-циях


Сейчас попробую выделить всю работу с GTT (и запись и чтение) в одну RO-транзакцию и сделать их DELETE ROWS.
19 сен 19, 11:46    [21974041]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз про сборку мусора  [new]
VerLeon
Member

Откуда: Новосибирск
Сообщений: 25
bsv9
Да, я тестировал на версии 3.0.5.


У меня 3.0.2 и 2.5.7 - поведение одинаковое. Да и вряд ли что-то в 3.0.5 поменялось, раз Влад говорит, что это нормально.
19 сен 19, 13:37    [21974214]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз про сборку мусора  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10154
VerLeon,

Влад не сказал, что это нормально. Он намекнул, что если ты в Tr1 только пишешь во временную таблицу и не пишешь в постоянные, то смысла делать транзакцию write нет.
19 сен 19, 13:56    [21974259]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз про сборку мусора  [new]
VerLeon
Member

Откуда: Новосибирск
Сообщений: 25
Переделал все на DELETE ROWS с чтением/записью в них в RO транзакции - проблемы больше нет.
Ну и не удивительно, с такими GTT проблемы с мусором быть и не может, главное что RO транзакция отработала.

Влад, спасибо за наставление на путь истинный! :)
19 сен 19, 13:56    [21974260]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз про сборку мусора  [new]
VerLeon
Member

Откуда: Новосибирск
Сообщений: 25
Симонов Денис
VerLeon,

Влад не сказал, что это нормально. Он намекнул, что если ты в Tr1 только пишешь во временную таблицу и не пишешь в постоянные, то смысла делать транзакцию write нет.


Ну логично, что если RO может писать в GTT, то и мусор из нее не соберется, даже если висит только эта RO

в Tr1 я конечно не только во временную писал, это упрощенный пример, на самом деле там куча всего. Пришлось разделять, но в итоге проблема ушла и стало еще быстрее.
19 сен 19, 13:59    [21974266]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз про сборку мусора  [new]
VerLeon
Member

Откуда: Новосибирск
Сообщений: 25
Хм, а всё же - нормально это или нет?
Не окажется ли, что это в ближайших релизах FB посчитают ненормальным и моя схема с писанием в GTT c помощью RO транзакции накроется?
19 сен 19, 15:40    [21974387]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз про сборку мусора  [new]
Шавлюк Евгений
Member

Откуда: Одесса
Сообщений: 486
В первых релизах 2.5 в RO транзакции нельзя было писать в GTT, потом разрешили.
У меня вся логика длительных вычислений построена на GTT+RO
19 сен 19, 15:49    [21974399]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз про сборку мусора  [new]
Ivan_Pisarevsky
Member

Откуда: НН
Сообщений: 8413
VerLeon
Не окажется ли, что это в ближайших релизах FB посчитают ненормальным
Все идет у тому, что пишущая ридкоммитед транзакция перестанет копить мусор и RO перестанет быть столь актуальной. Так что, если перестанет писать в RO (что мне не кажется правильным, вполне нормально в RO режиме сделать некие "пометки на полях" база же не меняется) сменишь на RW.
19 сен 19, 15:50    [21974402]     Ответить | Цитировать Сообщить модератору
 Re: Еще раз про сборку мусора  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10154
Ivan_Pisarevsky,

всё зависит от того как построено приложение. В 4.0 если в Read Committed будет недофетченный курсор, то будет удерживать версии, но теперь только те что видны ей, а не всю цепочку. А RO или RW уже по фигу
19 сен 19, 17:09    [21974504]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Firebird, InterBase Ответить