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

25.06.18

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
SQL скрипты
.zip 3,27Kb
163
163 Скачать (1 SM) Купить за 1 850 руб.

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

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

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

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

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

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

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

На помощь приходят системные представления 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С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

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

14400 руб.

29.04.2020    32763    106    152    

73

SALE! 20%

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

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

3600 2880 руб.

10.02.2017    110571    662    174    

702

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

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

4800 руб.

06.10.2023    4051    35    18    

44

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

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

4800 руб.

27.10.2021    23960    241    35    

78

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

Обработка предназначена для корректировки входящего НДС при смене системы налогообложения индивидуального предпринимателя с УСН на ОСНО в 1С:Бухгалтерия предприятия 3.0

4000 руб.

18.07.2024    702    1    0    

1
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. aspirator23 339 26.09.15 15:29 Сейчас в теме
Да, реальная проблема. Столкнулся с этим в одной "безумной" базе.
adhocprog; +1 Ответить
2. CSiER 36 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 Тогда
					Сообщить("> " + ТекСтрока.ИмяТаблицы);
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
	КонецЦикла;
Показать

теперь остается проверить в конфигураторе "подозрительные" регистры.
n_mezentsev; kaaasteeen; volokitinac; Cmapnep; Agrozentr; NatalyaVP; mirrr; Skopoxod; vic777tor; Светлый ум; andr_andrey; Region102; klinval; +13 Ответить
3. wetsock 20.06.19 15:44 Сейчас в теме
Запросы актуальны для MS SQL, но не для PostgreSQL
4. vic777tor 22.12.19 16:20 Сейчас в теме
Спасибо за статью, реально помогла починить базу.
Как выяснилось, какой-то умелец в одном из справочников установил для реквизита с типом Строка(1024) свойство "Индексировать" в значение "Индексировать с доп. упорядочиванием".
В результате не загружалась в файловом варианте даже пустая конфигурация.
5. unichkin 1579 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
Показать
shlz; tenaxxx; MaxxiMiliSan; sskripatch; AlexxSys; e][tend; Wdivine; Cujoko; +8 Ответить
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 Таблица, Индекс
Показать
ghost; sskripatch; +2 Ответить
8. user761842 13.07.21 09:53 Сейчас в теме
Тоже такое проявилось.
Оказалось: у измерения регистра сведений был тип Строка (1000).
Wrols; catmintking; +2 Ответить
9. catmintking 23.08.21 15:31 Сейчас в теме
(8) Да, дрогнула рука и вместо 100 сделал 1000, вернул назад - все заработало.
10. qwinter 683 18.04.23 10:36 Сейчас в теме
Известно, что имена таблиц в файловой СУБД при создании отличаются от клиент-серверной, и поиск индекса, который указан в ошибке, нам ничего не даст.
Имена таблиц конечно отличаются, а вот имена полей нет)) Вывод структуры в тест и поиск по нему быстро решает проблему.
Оставьте свое сообщение