Сборка мусора по индексам

Ремонт и восстановление баз данных InterBase, Firebird, Yaffil

Модераторы: kdv, Alexey Kovyazin

Ответить
StriderMan
Сообщения: 7
Зарегистрирован: 29 авг 2006, 12:12

Сборка мусора по индексам

Сообщение StriderMan » 23 авг 2007, 18:22

Добрый день!

По некоторым индексам в базе скапливается много дубликатов, на FB 1.5 лечили при помощи INACTIVE/ACTIVE, на 2.0 такое не прокатывает, ругается на уникальный CONSTRAINT. Как вариант рассматривали ... DROP CONSTRAINT/... CREATE CONSTRAINT, однако если есть активные транзакции, интересующеся этим индексом, то CREATE не проходит. А главная проблема в том, что потенциально БД может работать круглосуточно и 7 дней в неделю, гарантии отсутствия подключений нет.
Есть ли еще какой способ сборки дубликатов в индексах?

Может есть какие-нибудь статьи на тему обслуживания круглосуточных БД? Буду рад ссылкам.

Спасибо!

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 23 авг 2007, 18:27

Каких ещё дубликатов? О чём вообще речь идёт?
А самое интересное мне - как сказываются эти "дубликаты" на работе?

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 23 авг 2007, 18:27

Сборке мусора всё едино - что в индексах, что не в индексах. Главное - чтоб долгоиграющих транзакций не было.

StriderMan
Сообщения: 7
Зарегистрирован: 29 авг 2006, 12:12

Сообщение StriderMan » 23 авг 2007, 18:37

WildSery писал(а):Каких ещё дубликатов? О чём вообще речь идёт?
А самое интересное мне - как сказываются эти "дубликаты" на работе?
Речь идет о статистике, выдаваемой gstat'ом и анализируемой при помощи IBAnalyst.
например:
INDEX UNQ_.... keys: 3183, MaxDups: 1060, TotalDup: 3180

дубликаты замедляют поиск при помощи этого индекса
Сборке мусора всё едино - что в индексах, что не в индексах. Главное - чтоб долгоиграющих транзакций не было.
SELECT COUNT(*) для индексов не помогает к сожалению, а почему не собирает автоматически - непонятно.

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 23 авг 2007, 18:59

да вы там весельчаки - при круглосуточной нагрузке выключать индексы констрейнтам. Вы хоть контрольный рестор бекапов практикуете?
SELECT COUNT(*) для индексов не помогает к сожалению, а почему не собирает автоматически - непонятно
ищите причину, должен помогать

StriderMan
Сообщения: 7
Зарегистрирован: 29 авг 2006, 12:12

Сообщение StriderMan » 23 авг 2007, 19:17

dimitr писал(а):да вы там весельчаки - при круглосуточной нагрузке выключать индексы констрейнтам.

Пока это на рабочую базу не пошло, просто неудачные эксперименты :)
Вы хоть контрольный рестор бекапов практикуете?
Это оставляем на совести конечного юзера.
ищите причину, должен помогать
Т.е. SELECT COUNT(*) FROM TABLENAME теоретически должен собрать мусор по ВСЕМ индексам таблицы TABLENAME ? Правильно понимаю?

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 23 авг 2007, 19:19

StriderMan писал(а): Т.е. SELECT COUNT(*) FROM TABLENAME теоретически должен собрать мусор по ВСЕМ индексам таблицы TABLENAME ? Правильно понимаю?
Если его не держит какая-нибудь застрявшая транзакция. Особенно снапшот.

StriderMan
Сообщения: 7
Зарегистрирован: 29 авг 2006, 12:12

Сообщение StriderMan » 23 авг 2007, 19:31

Merlin писал(а):Если его не держит какая-нибудь застрявшая транзакция. Особенно снапшот
ну это понятно. Однако вот есть база, в которой версий записей в таблице нет, а ключей индекса по одному полю в несколько раз больше чем записей

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 23 авг 2007, 19:36

StriderMan писал(а):INDEX UNQ_.... keys: 3183, MaxDups: 1060, TotalDup: 3180
дубликаты замедляют поиск при помощи этого индекса
Ужас. И сильно замедляют?

Мы вона пока на 2-ку не перелезли (там сборка мусора шустрая), наоборот сборку выключаем на весь день, чтоб не мешалась. По полтора лимона версий кое-где получается. Сколько там дупов - а фиг его знает.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 23 авг 2007, 19:56

Люди!!! Читайте хелп к ibanalyst!!! Откройте содержание хелпа, там есть "дополнительные вопросы и ответы". И написано как перестраивать индексы по констрейнтам. В любом случае, "скапливается много дубликатов" - это ахинея полная. Дубликатов в ключе столько, сколько их в столбце. Если мусор не собирается, опять же читайте хелп к IBA, там статья есть о том что вы видите на экране IBAnalyst, почему индексы "плохие" и т.п.

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 24 авг 2007, 05:56

Судя по
INDEX UNQ_....
названию индекс уникальный?
если да, то как там вообще дубликаты получены?

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 24 авг 2007, 10:41

StriderMan писал(а):ну это понятно. Однако вот есть база, в которой версий записей в таблице нет, а ключей индекса по одному полю в несколько раз больше чем записей
Есть такая особенность. Но наступить на неё - это нужно постараться.
Постоянно вставляете и удаляете одни и те же ключи на один и теже места (db_key).
Лучше иметь лишние ключи в индексе, чем отсутствующие...

StriderMan
Сообщения: 7
Зарегистрирован: 29 авг 2006, 12:12

Сообщение StriderMan » 24 авг 2007, 12:03

stix-s писал(а):индекс уникальный?
если да, то как там вообще дубликаты получены?
Да, индекс уникальный, в том вся и засада. теоретически дубликатов быть не должно.
Есть такая особенность. Но наступить на неё - это нужно постараться.
Постоянно вставляете и удаляете одни и те же ключи на один и теже места (db_key).
Лучше иметь лишние ключи в индексе, чем отсутствующие...
специфика базы такова что в нее делается большое количество INSERT'ов и UPDATE'ов ЕЖЕДНЕВНО, вплоть до удаления и вставки почти всех записей всех таблиц, при этом размер базы относительно небольшой - как правило 10-100мб после backup/restore

БД используется во фронтофисном решении, соответственно идет очень активный обмен с бэком.

Ответить