За последние годы я работал с несколькими Jira-инстансами, где количество кастомных полей перевалило за сотню. Типичная картина: система начинает тормозить, поиск работает медленно, а пользователи жалуются. В этой статье разберу, почему это происходит и как решить проблему без удаления функциональности.
Почему кастомные поля замедляют Jira
Начну с того, как Jira работает с кастомными полями внутри. Каждое кастомное поле создаёт дополнительные колонки в базе данных или записи в связанных таблицах. Когда Jira выполняет поиск или фильтрацию, она должна проверять все эти поля.
Проблема усугубляется, если поля не проиндексированы должным образом. Jira автоматически создаёт индексы только для стандартных полей и некоторых типов кастомных (например, Select List с ограниченным набором значений). Для текстовых полей, числовых полей и полей типа "User Picker" индексация может отсутствовать.
Реальный пример из практики
Недавно я столкнулся с инстансом, где было 147 кастомных полей, из них около 60 использовались в JQL-запросах. Время выполнения поиска доходило до 15 секунд. После аудита выяснилось, что только 12 полей имели индексы, и это были в основном Select List поля.
Как проверить, какие поля замедляют поиск
Первое, что нужно сделать — понять, какие именно поля создают проблему. В Jira есть встроенные инструменты для этого.
Метод 1: Анализ медленных запросов через лог
Включите логирование SQL-запросов в log4j.properties:
log4j.logger.com.atlassian.jira.action.admin.customfields=DEBUG
log4j.logger.com.atlassian.jira.issue.search=DEBUG
log4j.logger.hibernate.SQL=DEBUG
После этого выполните несколько медленных поисков и проанализируйте логи. Ищите запросы, которые выполняются дольше 500ms и содержат JOIN с таблицами кастомных полей.
Метод 2: Использование Jira Query Language для тестирования
Создайте несколько тестовых JQL-запросов с разными комбинациями полей и замерьте время выполнения. Например:
project = PROJ AND customfield_10001 ~ "value" AND customfield_10002 ~ "value2"
Если добавление каждого поля увеличивает время поиска больше чем на 100-200ms, это тревожный знак.
Оптимизация через индексацию полей
Самый эффективный способ ускорить поиск — создать индексы для полей, которые используются в JQL. Однако здесь есть нюансы.
Какие поля можно индексировать
- Text Field — только для точного совпадения (точный поиск), не для частичного совпадения
- Number Field — отлично индексируется, поддерживает диапазоны
- Select List / Radio Buttons — автоматически индексируется
- User Picker / Group Picker — можно индексировать, но нужно аккуратно
- Date Picker / Date Time Picker — индексируется хорошо
Как создать индекс для кастомного поля
В Jira это делается через админ-панель, но процесс не всегда очевиден:
- Перейдите в Administration → Issues → Custom Fields
- Найдите нужное поле и выберите Edit
- В разделе Search Template проверьте, какой шаблон используется
- Если шаблон не поддерживает индексацию (например, "Text Search"), измените его на поддерживающий
Важно: изменение Search Template может повлиять на существующие JQL-запросы. Обязательно протестируйте критичные фильтры и дашборды после изменения.
Альтернативные подходы к оптимизации
Не всегда индексация решает проблему. Иногда нужно пересмотреть архитектуру использования полей.
Объединение связанных полей
Если у вас есть несколько полей, которые всегда используются вместе (например, "Регион", "Город", "Офис"), рассмотрите возможность их объединения в одно поле с иерархической структурой или использования поля типа "Cascading Select".
На одном проекте мы сократили количество полей с 23 до 8, объединив связанные справочники. Это не только ускорило поиск, но и упростило работу пользователей.
Использование лейблов вместо текстовых полей
Если поле используется только для категоризации и фильтрации, а не для хранения уникальных значений, используйте Labels вместо Text Field. Labels в Jira индексируются автоматически и работают значительно быстрее.
Перенос редко используемых полей
Если поле используется в поиске реже чем в 5% случаев, рассмотрите возможность хранения этих данных в Confluence или внешней системе с интеграцией через API. Это радикальный подход, но иногда оправданный.
Работа с индексами на уровне базы данных
Для серьёзной оптимизации может потребоваться работа напрямую с базой данных. Это продвинутый уровень, и делать это нужно очень осторожно.
Анализ планов выполнения запросов
Если у вас есть доступ к базе данных (что обычно есть в Data Center), можно анализировать планы выполнения запросов. Например, в PostgreSQL:
EXPLAIN ANALYZE
SELECT * FROM jiraissue
WHERE id IN (
SELECT issue FROM customfieldvalue
WHERE customfield = 10001 AND stringvalue = 'target_value'
);
Это покажет, используются ли индексы и где происходят узкие места.
Создание составных индексов
В некоторых случаях стандартных индексов недостаточно. Если в поиске часто используются комбинации полей (например, project + status + customfield), может потребоваться составной индекс.
Внимание: создание индексов на уровне БД без понимания архитектуры Jira может привести к проблемам при обновлениях. Делайте это только если полностью понимаете последствия.
Типичные ошибки и подводные камни
За годы работы я накопил коллекцию ошибок, которые часто допускаются при оптимизации кастомных полей.
Ошибка 1: Индексация всех полей подряд
Больше индексов — не значит лучше. Каждый индекс замедляет операции INSERT и UPDATE. Индексируйте только те поля, которые реально используются в поиске.
Ошибка 2: Использование Text Field для категорий
Если поле имеет ограниченный набор значений (например, "Высокий", "Средний", "Низкий"), используйте Select List, а не Text Field. Select List индексируется автоматически и работает быстрее.
Ошибка 3: Игнорирование размера таблицы customfieldvalue
Таблица customfieldvalue может разрастаться до миллионов записей. Регулярно проверяйте её размер и очищайте данные удалённых полей или проектов.
Мониторинг производительности после оптимизации
После внесения изменений важно отслеживать результаты. Вот что я рекомендую мониторить:
- Время выполнения типичных JQL-запросов — должно уменьшиться минимум на 30-50%
- Размер таблицы customfieldvalue — не должен расти быстрее количества новых issues
- Нагрузка на базу данных — количество медленных запросов должно снизиться
- Отзывы пользователей — субъективная оценка скорости работы
Выводы и рекомендации
Оптимизация кастомных полей в Jira — это не одноразовое действие, а процесс. Начните с аудита: определите, какие поля используются в поиске и какие из них создают проблемы.
Создавайте индексы осознанно, только для полей, которые реально нужны в поиске. Рассматривайте альтернативные подходы: объединение полей, использование Labels, перенос данных во внешние системы.
И самое главное — не бойтесь экспериментировать на тестовой среде. Каждый инстанс Jira уникален, и то, что работает на одном, может не работать на другом. Тестируйте изменения и отслеживайте результаты.
Если у вас возникли вопросы или нужна помощь с оптимизацией вашего инстанса — свяжитесь со мной.