Длина ключа индекса превышает максимально допустимую. Решение и рекомендации

25.06.18

Задачи пользователя - Корректировка данных

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

Скачать исходный код

Наименование Файл Версия Размер
SQL скрипты
.zip 3,27Kb
152
.zip 3,27Kb 152 Скачать

Проводя разработки в клиент-серверной версии СУБД, мы можем порой не задумываться, какое количество индексов у нас есть в таблице, какие поля входят в индекс и к чему это приводит.

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

Как найти быстро все проблемные индексы, которые приводят к ошибке?

Как выйти на те поля и таблицы, где мы что-то натворили?

Известно, что имена таблиц в файловой СУБД при создании отличаются от клиент-серверной, и поиск индекса, который указан в ошибке, нам ничего не даст.

Есть, конечно, вариант: искать по совпадению слов в данных, полученных методом ПолучитьСтруктуруХраненияБазыДанных()

Но это не всегда нам поможет быстро найти проблему.

На помощь приходят системные представления SQL сервера.

  • sys.index_columns - Содержит одну строку для каждого столбца, являющегося частью индекса.
  • sys.columns - Возвращает строку для каждого столбца объекта, имеющего столбцы, например представления или таблицы. В данной таблице есть столбец "max_length" максимальная длинна в байтах. На него мы и будем ориентироваться.
  • sys.indexes - Содержит строку для каждого индекса или кучи табличного объекта, такого как таблица, представление или функция с табличным значением.

         sys.dm_db_index_usage_stats - Возвращает количество различных операций с индексами и время,
         которое было затрачено в SQL Server на последнее выполнение операции каждого типа.

Отправной точкой для поиска проблемных мест будет ограничение на индекс для файловой базы 1920 байт.

Выполняя запросы SQL для своей базы, не забудьте указать в начале инструкции USE <Имя базы>;

1) Сделаем первый запрос с рейтингом по размеру и сравним его с контрольной цифрой.

 Первый запрос

 

На скрине мы видим три таблицы с именами столбцов и индексов, которые создают нам проблему.

Осталось дело техники, найти эти данные в 1С с помощью ПолучитьСтруктуруХраненияБазыДанных() и откорректировать настройки (уменьшить длину индекса, снять индексирование).

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

Как вариант решения: уменьшаем длину строки, или снимаем индексацию (если индексирование поставлено на всякий случай).

2) Что делать, если мы сделали все, как сказано, а ошибки при обновлении на файловую базу все равно есть, как на скрине?

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

Далее смотрим первые строки и анализируем:

 

Запрос второй

 

В данном списке мы видим количество индексов на таблицу. Начинаем анализировать сверху.

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

Т.е. нам необходимо расшифровать - какие основные поля и сколько раз поля входят в индекс.

На практике оказалось, что наш вариант под номером два.

Как решение: снятие индексации с тех полей, которые не участвуют в отборах, выборках, связях и которые проиндексированы на всякий случай.

Запрос с расшифровкой

 

 

 3) Для анализа полей, которые входят в индекс, необходимо выполнить следующий запрос:

 

Запрос третий

 

Аналогичный результат,  но в другом представлении мы получим, выполнив хранимую процедуру sp_helpindex, передав в качестве параметра имя таблицы.

Данная методика позволила быстро выявить проблемные индексы, столбцы которые приводили к ошибке.

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

Ответ на вопрос, какие поля индексировать, и условие создания индекса можно посмотреть в статье:

https://technet.microsoft.com/ru-ru/library/ms191195%28v=sql.105%29.aspx

 

Теперь нам необходимо определить неиспользуемые индексы.

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

Или мы нашли множество некластерных индексов в таблице, а не знаем, какие нам нужны, а какие нет.

В данном случае можно выполнить следующий запрос с выводом неиспользуемых индексов. Обратите внимание, что используются объекты DMO, а для них необходимо, чтобы сервер работал продолжительное время, и функционал по интересующей нас таблице использовался достаточно интенсивно.

Не рекомендуется использовать данных запрос после перезапуска сервера.

 

 

Неиспользуемые индексы

 

 

 

Индексы оптимизация Длина ключа индекса превышает максимально

См. также

Исправление в 1С:ЗУП/ЗКГУ ошибок по НДФЛ и взаиморасчетам с сотрудниками на начало расчетного года.

Корректировка данных Зарплата Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры бюджетного учреждения 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет НДФЛ Платные (руб)

Обработка исправляет технические ошибки по НДФЛ, взаиморасчетам с сотрудниками в 1С:ЗУП (1С:ЗКГУ) на начало года. Фактически все ошибки, которые проявляются в ведомостях на выплату, расчетных листках, при заполнении ведомостей на выплату и отчетах 6-НДФЛ и т.д. нужно начинать исправлять с начала расчетного года. Это позволит быть уверенными, что после завершения расчетов предыдущего года, начали работать с «чистого листа» без ошибочных остатков.

4800 руб.

06.10.2023    2713    30    15    

36

Тестирование и исправление ключей аналитики ERP, УТ11, КА

Корректировка данных Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Платные (руб)

Незаменимая обработка для сопровождения конфигураций: ERP, УТ, КА. Позволяет вычистить многие ошибки в ключах аналитики, в ключевых справочниках конфигурации.

3600 руб.

10.02.2017    107437    637    173    

680

Ускоренное проведение документов (x4), устранение ошибок 60/62 счетов и зачет авансов (Бухгалтерия 3.0)

Закрытие периода Инструменты администратора БД Корректировка данных Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Расширение «Оперативное проведение» в 4 раза уменьшает время проведения документов и закрытия месяца. Является комплексным решением проблем 62 и 60 счетов. Оптимизирует проведение при включенной функциональной опции «Раздельный учет НДС». Используется в более 10 организациях уже 2 года. Совместимо с конфигурацией Бухгалтерия 3.0 (+КОРП).

14400 руб.

29.04.2020    28133    83    146    

61

Исправление ошибки закрытия месяца "Обнаружены ненулевые остатки по суммам при нулевом остатке по количеству в регистре себестоимости по организации". УТ 11.4,УТ 11.5, КА 2.4,КА 2.5, ERP 2.4, ERP 2.5, КА 2 Казахстан, Управление торговлей 3 для Казахстана

Закрытие периода Корректировка данных Платформа 1С v8.3 Оперативный учет 1С:Управление торговлей 11 Управленческий учет Платные (руб)

Закрытие месяца - важный процесс в современных конфигурациях, таких как УТ 11.4, УТ 11.5, КА 2.4, КА 2.5 ERP 2.4,ERP 2.5, КА 2 Казахстан, УТ 3 Казахстан регламентные операции влияют на расчет себестоимости, и ошибки в данном расчете не дают картины деятельности организации.

2400 руб.

27.10.2021    22629    302    35    

74

Исправление ошибок по НДФЛ и взаиморасчетам с сотрудниками в 1С:Бухгалтерия 3.0

Корректировка данных Зарплата Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Внешняя обработка предназначена для исправления самых различных ошибок, возникших по самым разным причинам. Общее проявление этих ошибок видно в различии данных между: проводками и различными отчетами по НДФЛ, заполнении ведомостей на выдачу зарплаты, неверным расчетом НДФЛ при начислении ЗП и т.д.

3600 руб.

09.02.2024    786    4    4    

7

Заполнение документа "Корректировка регистров" произвольными данными

Закрытие периода Корректировка данных Платформа 1С v8.3 Система компоновки данных 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Управленческий учет Платные (руб)

Внешняя обработка, позволяющая произвольным образом заполнять документ "Корректировка регистров" Предназначена для использования в конфигурациях "Управление торговлей 11", "Управление небольшой фирмой", "ERP Управление предприятием", а также в других конфигурациях, в состав которых входит библиотека стандартных подсистем (БСП) версии 2.2+ и указанный выше документ.

2400 руб.

13.07.2015    50373    171    29    

122
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. aspirator23 339 26.09.15 15:29 Сейчас в теме
Да, реальная проблема. Столкнулся с этим в одной "безумной" базе.
adhocprog; +1 Ответить
2. CSiER 35 15.03.18 07:03 Сейчас в теме
Есть, конечно, вариант: искать по совпадению слов в данных, полученных методом ПолучитьСтруктуруХраненияБазыДанных().
Но это не всегда нам поможет быстро найти проблему.

К сожалению, не всегда есть доступ к СУБД (пример - работа ведется через хранилище, развертыванием ИБ для разработки занимается другая служба). Ускорить поиск проблемного объекта метаданных в этом случае поможет имя индекса, например:
"Длина ключа индекса превышает максимально допустимую '_InfoR24287_ByPeriod_TSSSSSSSSRSN (_Period, _Fld24288, _Fld24289, _Fld24290, _Fld24291, _Fld24292, _Fld24293, _Fld24294, _Fld24295, _Fld24296RRef, _Fld24297, _Fld24298)'" - индекс "ByPeriod" для регистра сведений, 12 полей, при этом 9 из них строковые =>
	ТаблицаСтруктурыИБ = ПолучитьСтруктуруХраненияБазыДанных();
	Для Каждого ТекСтрока ИЗ ТаблицаСтруктурыИБ Цикл
		Если Найти(ТекСтрока.ИмяТаблицы, "РегистрСведений") > 0 Тогда
			ТаблицаИндексов = ТекСтрока.Индексы;
			Для Каждого ТекИндекс ИЗ ТаблицаИндексов Цикл
				Если ТекИндекс.ИмяИндексаХранения = "ByPeriod" И ТекИндекс.Поля.Количество() = 12 Тогда
					Сообщить("> " + ТекСтрока.ИмяТаблицы);
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
	КонецЦикла;
Показать

теперь остается проверить в конфигураторе "подозрительные" регистры.
kaaasteeen; volokitinac; Cmapnep; Agrozentr; NatalyaVP; mirrr; Skopoxod; vic777tor; Светлый ум; andr_andrey; Region102; klinval; +12 Ответить
3. wetsock 20.06.19 15:44 Сейчас в теме
Запросы актуальны для MS SQL, но не для PostgreSQL
4. vic777tor 22.12.19 16:20 Сейчас в теме
Спасибо за статью, реально помогла починить базу.
Как выяснилось, какой-то умелец в одном из справочников установил для реквизита с типом Строка(1024) свойство "Индексировать" в значение "Индексировать с доп. упорядочиванием".
В результате не загружалась в файловом варианте даже пустая конфигурация.
5. unichkin 1565 01.04.20 14:11 Сейчас в теме
Помогло, спасибо большое. Неудобно, что готового скрипта нет, оставлю здесь:

SELECT OBJECT_NAME(ic.object_id) AS Таблица, SUM(sys.columns.max_length) AS [ДлинаИндекса], i.name AS Индекс

FROM sys.indexes AS i INNER JOIN
	sys.index_columns AS ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id INNER JOIN
	sys.columns ON ic.column_id = sys.columns.column_id AND ic.object_id = sys.columns.object_id

GROUP BY OBJECT_NAME(ic.object_id), i.name, sys.columns.name
ORDER BY [ДлинаИндекса] DESC
Показать
tenaxxx; MaxxiMiliSan; sskripatch; AlexxSys; e][tend; Wdivine; Cujoko; +7 Ответить
6. InShallaH 59 20.01.21 10:29 Сейчас в теме
Оставшиеся скрипты

SELECT OBJECT_NAME(ic.object_id) AS Таблица, COUNT(DISTINCT i.name) AS [Количество индексов]

FROM sys.indexes AS i INNER JOIN
    sys.index_columns AS ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id INNER JOIN
    sys.columns ON ic.column_id = sys.columns.column_id AND ic.object_id = sys.columns.object_id

GROUP BY OBJECT_NAME(ic.object_id)
ORDER BY [Количество индексов] DESC





SELECT OBJECT_NAME(si.object_id) AS [Имя таблицы], SI.name AS [Имя индеска]

FROM sys.indexes AS SI INNER JOIN
    sys.index_columns AS SO ON SO.object_id = SI.object_id 

	WHERE (SI.object_id > 100) AND (SI.type_desc = 'NONCLUSTERED') AND (SI.index_id NOT IN (SELECT index_id FROM sys.dm_db_index_usage_stats AS S WHERE (object_id = SI.object_id) AND (SI.index_id = index_id) AND (database_id = 5) ))


ORDER BY [Имя таблицы],[Имя индеска]
Показать
sskripatch; +1 Ответить
7. user953800 25.01.21 13:33 Сейчас в теме
(6) Между 2 и 4 из статьи не вставился 3. Добавлю свою лепту
SELECT sys.tables.name AS Таблица, SUM(sys.columns.max_length) AS [ДлинаИндекса], i.name AS Индекс, sys.columns.name AS Столбец

FROM sys.tables INNER JOIN
    sys.indexes AS i INNER JOIN
	sys.index_columns AS ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id INNER JOIN
	sys.columns ON ic.column_id = sys.columns.column_id AND ic.object_id = sys.columns.object_id ON sys.tables.object_id = i.object_id
	
	WHERE sys.tables.name = '_xxxx'
	
GROUP BY sys.tables.name, i.name, sys.columns.name, sys.tables.name
ORDER BY Таблица, Индекс
Показать
sskripatch; +1 Ответить
8. user761842 13.07.21 09:53 Сейчас в теме
Тоже такое проявилось.
Оказалось: у измерения регистра сведений был тип Строка (1000).
Wrols; catmintking; +2 Ответить
9. catmintking 23.08.21 15:31 Сейчас в теме
(8) Да, дрогнула рука и вместо 100 сделал 1000, вернул назад - все заработало.
10. qwinter 671 18.04.23 10:36 Сейчас в теме
Известно, что имена таблиц в файловой СУБД при создании отличаются от клиент-серверной, и поиск индекса, который указан в ошибке, нам ничего не даст.
Имена таблиц конечно отличаются, а вот имена полей нет)) Вывод структуры в тест и поиск по нему быстро решает проблему.
Оставьте свое сообщение