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

8. Ninelle 15.12.11 17:53 Сейчас в теме
Столкнулась с такой же проблемой, но измерений в регистре аж 24 :) почти все строковые с переменной длиной 100.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
9. 1985Alex1985 07.06.13 12:01 Сейчас в теме
Подскажите, или дайте ссыль на литературу. Инересует такой вопрос: почему не стоит в регистрах использовать измерения базовых типов? Т.е. можно но не нужно. Ответ я примерно понимаю, но мне нужен вразумительный, однозначный и главное единственно верный. Такой, что бы у преподавателя на спеце по платформе не возникло желания задавать доп. вопросы по этой теме (ну и самому бы окончательно в этом разобраться хотелось бы).
10. RocKeR_13 1348 07.06.13 13:04 Сейчас в теме
(9) 1985Alex1985, если отсебятина, то я бы объяснил следующим образом:
1) во-первых, все упирается в длину Строки/Числа: при больших значениях замедляется работа с регистром.
2) во-вторых, возрастает вероятность ошибки, если приходится задавать значения такого измерения вручную (и чем длинее Строка/Число, тем вероятность, логично предположить, возрастает). Т.е., например, записывали на предприятии в некий регистр некоторое текстовое измерение, а потом руководство подумало и решило, что надо бы по-другому значение этого измерения записывать: было, например, "Вася", а стало "Василий Петрович"... И тут уже возникает проблемка со сбором, например, оборотов по этому Васе/Василию Петровичу. Другое дело, если это элемент справочника: наименование поменял и у всех записей поменялось представление, ибо ссылка осталась прежней.
Я считаю эти доводы довольно весомыми, чтобы поменьше использовать примитивные типы в качестве измерений. И мне интересно: действительно где-то аж 12мерный регистр используется или народ забывает, что у регистров есть еще и реквизиты для детализации?)
11. 1985Alex1985 10.06.13 13:16 Сейчас в теме
(10) RocKeR_13, спасибо. звучит убедительно. Так наверное и буду объяснять. А для задач (где например надо использовать дату в качестве разреза регистра) буду ставить состав в "Дата", и с отборами будет все ок :)
12. dj_serega 393 06.02.17 22:25 Сейчас в теме
Подниму немного тему :-))

Есть файловая БД. Есть РС. 2 измерения на строку 1024 и 1 ресурс на 1024. Ругалось на индексы.
Сделал для теста по 150 и конфа обновилась.

Вспомнилось что когда-то пытался вычислить максимальное значение. Это было на строковом регистре у которых сумма всех длин строк была меньше 1024.
13. O-Planet 6439 20.03.09 05:57 Сейчас в теме
У клиента стоит 8.0. Переходить на 8.1 не хочет. Внес изменения в конфу. Пытаюсь обновить базу данных. Пишет, что не станет обновлять :( (см. скрин)

Кто такое видел, и что делать?

Появилось после того, как добавил регистр сведений с 12-ю измерениями, типа Строка, длина 100 (переменная).
Прикрепленные файлы:
14. larisab 160 20.03.09 07:57 Сейчас в теме
Файл пустой, не удалось посмотреть, но и так ясно, что 12 измерений много, дели на 3 - 4 регистра, имхо.
15. PRoman 73 20.03.09 11:57 Сейчас в теме
Диск ИТС

Ограничения на индексы
Поскольку для хранения данных 1С:Предприятие использует СУБД (либо встроенную, либо Microsoft SQL Server), то и поддержка индексов таблиц базы данных целиком возложена на используемую СУБД. Поэтому достижение ограничений, накладываемых различными СУБД на создание и использование индексов, может привести к ошибкам при работе с 1С:Предприятием. Поэтому при разработке конфигураций эти ограничения важно иметь в виду.

Файловый вариант информационной базы
Единственным ограничением на использование индекса при использовании СУБД, встроенной в 1С:Предприятие, является максимально допустимая суммарная длина ключа в индексе, равная 1920 байт. При попытке создания индекса с длиной ключа, превышающей 1920 байт, будет выдано сообщение об ошибке.

Клиент-серверный вариант информационной базы
Клиент-серверный вариант информационной базы подразумевает использование Microsoft SQL Server в качестве СУБД. В Microsoft SQL Server определены следующие ограничения на использование индексов:

максимальное количество полей, участвующих в индексе, равно 16.
максимально допустимая суммарная длина ключа в индексе равна 900 байт.
Важно иметь в виду, что в процессе определения объектов метаданных 1С:Предприятие при попытке создания индекса, включающего более 16 полей, в клиент-серверном варианте ИБ индекс усекается справа до 16. Это повышает надежность работы системы, но может привести к некоторому снижению производительности операций над соответствующими таблицами из-за ухудшения качества усеченных индексов.

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

Во-первых, способ построения индекса существенно зависит от используемой СУБД.
Во-вторых, длина ключа каждой записи индекса может зависеть от содержащихся в ней данных. В частности, при использовании в индексе полей типа VARBINARY Microsoft SQL Server помещает в запись индекса данные фактической длины, которая может быть меньше, чем заданная максимальная длина поля. С другой стороны, при использовании в индексе данных типа NCHAR или NVARCHAR длина представления этих данных в записи индекса для некоторых СУБД может существенно превышать максимальное количество символов, отведенное на поле строкового типа, из-за использования ключей сравнения (Collation Key), построение которых зависит от национальных настроек базы данных.
По этим причинам 1С:Преприятие 8.0 не выполняет автоматической проверки длин ключей создаваемых индексов. Таким образом, если при создании или использовании индекса будет превышена максимальная для данной СУБД длина ключа, то 1С:Предприятие выдаст сообщение об ошибке, порожденное используемой СУБД.

Рекомендации по конфигурированию
Поскольку введение ограничений на длины ключей в создаваемых индексах в платформе 1С:Предприятия не может быть универсальным и в тоже время может создать дополнительные сложности, при разработке конфигураций необходимо эти ограничения учитывать. Следование ниже приведенным правилам не позволит длинам ключей в индексах подходить к "критической отметке".

Не используйте индексирование по строковым полям, суммарная длина которых превышает 300 символов. Такой индекс может быть создан при выборе в значения "Индексирование" или "Индексировать с дополнительным упорядочиванием" свойства "Индексировать" реквизита или измерения. Кроме того, индекс по полю будет создан при вхождении этого поля в какой-нибудь критерий отбора.
Не используйте в регистрах слишком много измерений, особенно, если среди них есть поля строковых типов. Для ориентировки можно считать, что поле типа число занимает 16 байт ключа индекса, строка - 3*n байт (где n - максимальная длина строки), дата - 8 байт, булево - 1 байт, ссылка на один объект - 16 байт, ссылка на несколько объектов - 20 байт.
Избегайте использование измерений составных типов. Исключение может составлять комбинирование ссылок различных типов.
Не задавайте в планах счетов слишком большое максимальное количество субконто (превышение числа 5 может быть оправдано только в случае более тщательного анализа опасности превышения максимальной длины ключа индекса, и эффективности работы самого регистра).
Не рекомендуется в одном регистре бухгалтерии использовать субконто со значениями различных примитивных типов. См. также Назначение прикладного объекта "План видов характеристик".
Не используйте в регистрах бухгалтерии слишком большое количество измерений в сочетании с большим максимальным количеством субконто.
Показать
kaaasteeen; user813055; dreamerr7; adhocprog; dj_serega; rgrisha; taiba; zzz14; Ninelle; +9 Ответить
16. PRoman 73 20.03.09 11:59 Сейчас в теме
Мое мнение, нужно убрать индексировку по текстовым измерениям или уменьшить их длину.
17. O-Planet 6439 20.03.09 22:02 Сейчас в теме
Угу. Убил вообще регистр, сделал справочником.
18. CheBurator 2696 21.03.09 13:53 Сейчас в теме
Олег, вот если не в лом - просто заради интереса - расскажи какие именно 12 измерений заданы?
19. sarycheff 143 21.03.09 21:42 Сейчас в теме
Ептать... 12 измерений... Прям-таки уже на OLAP тянет. Осталось только одинэсину оптимизировать чуток :)
20. acesdjazzz 03.03.18 09:41 Сейчас в теме
Я так понял, что индекс формируется в совокупности по длине всех измерений. Попробуйте уменьшить длину строки в каком-нибудь измерении.
У меня была на файловой базе такая беда.
Было несколько измерений с длинами строки по 150. Добавил еще одно измерение с длиной 3. После этого ошибка стала вылетать.
Уменьшил у одного из измерений длину с 150 до 100. Все нормально обновилось.
В клиент-серверном варианте проблема не наблюдалась
21. ser6702 171 08.02.19 10:26 Сейчас в теме
Ключ индекса таблицы msSQL до версии 2016 использует 16 полей (или 900 байт). Для физической таблицы итогов регистра бухгалтерии с тремя субконто, (так как они составные), только по субконто используется по 3 поля, и это в сумме уже 9 полей для ключа индекса + 1 поле на служебный разделитель = 10. А еще период и остальные измерения, признаки учета.... вот и все 15 ... 16 полей.

В SQL Server 2016 и в Azure SQL Database увеличен максимальный размер ключа в некластерном индексе с 900 до 1700 байт. Максимальный размер ключа для кластерного индекса по-прежнему остается 900 байт. Знающие люди по 1С - уточните, какие индексы он создает как кластерные, а какие как обычные

PS: Если субконто будет примитивного типа, а не ссылочного, то на каждое субконто будет по 4 поля на индексирование. В результате на три субконто ключ уже будет использовать 12 полей а не 9. Поэтому для субконто НЕ НАДО ИСПОЛЬЗОВАТЬ ПРИМИТИВНЫЕ ТИПЫ.
Для регистров сведений или накопления - можно экстраполировать эти рассуждения, касательно их физических таблиц движений и итогов. Но там конечно все менее жестко.
22. ser6702 171 08.02.19 10:28 Сейчас в теме
А вот если база для 1С ORACLE то по моему там нет ограничений на количество идексируемых полей
А вот если Postgree... то не знаю вообще)))
23. Fuego 463 24.11.22 09:37 Сейчас в теме
Тема старая, но кому-то будет интересно и сегодня. В случае с индексами для регистра сведений, связанного со значениями для плана характеристик, всегда создаются дополнительные поля для всех возможных типов, даже если в типе плана характеристик указан только один тип "строка". На всё, кроме строки выделяется всегда 64 байта. Остаётся 836 байт для строки. Поскольку строки 1С - это UTF-8 строки, то резервируется двойной объем, поэтому для вычисления максимальной длины строки 836 делим на 2, получаем 418 символов максимальная длина строки. Я столкнулся с проблемой, когда в нескольких свойствах нужна длина строки в символах свыше 590 символов, и пришлось отключить этот индекс, чтобы обновить базу данных. В последних версиях 1С плюётся на отключенный индекс в регистре, даже если непосредственно сам регистр не подлежит реструктуризации. Например, в поле "объект" в составном типе присутствует справочник, в который я решил добавить ещё одно поле, и обновление не производится. Более того, из-за отключенного индекса программа аварийно завершает обновление и больше зайти в конфигуратор не получится - попытка обновления всегда будет неудачной, а без удачного обновления не сможете изменить тип в плане видов характеристик. Об этом ограничении в материалах 1С никогда не видел, и потому вляпался...
24. Fuego 463 24.11.22 09:39 Сейчас в теме
(23) +
Я в принципе не понимаю, почему управление составом полей в индексах не выведено в конфигураторе. Иногда лучше уйти в сторону от производительности, чем делать неудобное решение для программиста и пользователя.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот