Firebird нужна ручная переиндексация?

Я бы порекомендовал вам взглянуть на пакет расстояний для струн. В частности, это функция stringdist (), которая выдает числовой вывод, связанный с тем, как далеко одна строка от другой. Вы должны быть в состоянии поиграть с порогами, чтобы удовлетворить ваши цели.

https://cran.r-project.org/web/packages/stringdist/stringdist.pdf

Бест, Мостафа

13
задан pablo 19 May 2009 в 11:38
поделиться

2 ответа

Во-первых, позвольте мне указать, что я не эксперт по Firebird, поэтому я отвечаю на основании того, как работает SQL Server.

В этом случае ответ будет положительным. , и нет.

Конечно, на SQL Server индексы обновляются в том смысле, что если вы вставляете новую строку, все индексы для этой таблицы будут содержать эту строку, поэтому она будет найдена. По сути, вам не нужно постоянно переиндексировать таблицы, чтобы эта часть работала. Это «нет».

Проблема, однако, не в индексе, а в статистике. Вы говорите, что вам нужно переиндексировать таблицы, но затем вы показываете код, который управляет статистикой, и поэтому я отвечаю.

Короткий ответ состоит в том, что статистика медленно выходит из строя с течением времени. Они могут не испортиться до такой степени, что их нельзя будет использовать, но они будут ухудшаться по сравнению с идеальным уровнем, на котором они находятся, когда вы их воссоздаете / пересчитываете. Это «да».

Основная проблема с устаревшей статистикой заключается в том, что если распределение ключей в индексах резко изменится, статистика может не сразу уловить это, и, таким образом, оптимизатор запросов выберет неправильные индексы. , основанный на старых устаревших статистических данных, которые у него есть.

Например, предположим, что один из ваших индексов имеет статистику, которая говорит, что ключи сгруппированы вместе на одном конце пространства значений (например, int- столбец с множеством нулей и единиц). Затем вы вставляете много-много строк со значениями, которые заставляют этот индекс содержать значения, разбросанные по всему спектру.

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

Однако, поскольку данные изменились, они будут прыгать по всему индексу, чтобы найти соответствующие части, и, таким образом, в конечном итоге будут не такими хорошими.

После пересчета статистики , оптимизатор запросов может обнаружить, что этот индекс не оптимален для этого запроса, и выбрать вместо него другой, который больше подходит.

По сути, вам нужно периодически пересчитывать статистику, если ваши данные изменяются. Если ваши данные меняются редко, вам, вероятно, не нужно делать это очень часто, но я бы все равно добавил работу по обслуживанию с некоторой регулярностью, которая делает это.

Что касается того, можно ли попросить Firebird сделать это самостоятельно, то опять же, я на тонком льду, но я подозреваю, что есть. В SQL Server вы можете настроить задания обслуживания, которые делают это по расписанию, и, по крайней мере, вы должны иметь возможность запускать пакетный файл из планировщика Windows, чтобы сделать что-то подобное.

20
ответ дан 1 December 2019 в 20:43
поделиться

Это не переиндексирует, а пересчитывает веса для индексов, которые используются оптимизатором для выбора наиболее оптимального индекса. Вам не нужно этого делать, если размер индекса сильно не изменится. Если вы создаете индекс до добавления данных, вам необходимо выполнить пересчет.

Embedded и Server должны иметь точно такие же функциональные возможности, кроме модели процесса.

7
ответ дан 1 December 2019 в 20:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: