УникальныйИдентификатор vs. Строка

1. frkbvfnjh 787 22.09.18 09:17 Сейчас в теме
Доброго времени суток! В регистре сведений имеется измерение типа УникальныйИдентификатор (не важно почему так, т.к. вопрос не в этом), но проблема в том, что выполнять частичный поиск по такому измерению крайне проблематично, к примеру я хочу найти все записи которые содержат последовательность каких-то 5 символов. Думаю изменить тип на строковый 32 символа. Вопрос: есть ли разница в объеме хранения и способе индексации измерения типа УникальныйИдентификатор и Строка 32. Я так понимаю что внутренне устройство типа Уникальный идентификатор в 1С - это обычная строка длинной 32 символа и занимает столько же места как и обычная строка 32 символа и индексация и размер индекса в регистре по данному измерению будет аналогичным, или я не прав и тип УникальныйИдентификатор какой то особый тип который хранится к примеру как число, или же индекс по нему строится как то особенно? Заранее спасибо.
Kazaams; BoryaMbi; ivangrant; KulSer; +4 Ответить
Ответы
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. mkalimulin 1164 22.09.18 09:34 Сейчас в теме
(1) Вообще все хранится, как строка, в некотором смыле. Делай, как задумал.
3. triviumfan 93 22.09.18 10:11 Сейчас в теме
(1) binary(16) - размер 16.
nvarchar(32) - размер 32.
Но разве есть другой выход? раз поиск нужен...
4. triviumfan 93 22.09.18 10:11 Сейчас в теме
(3) nvarchar(32) - размер 72, пардон.
5. frkbvfnjh 787 22.09.18 10:16 Сейчас в теме
(4) Нифига себе разница, получается в хранить данные в виде уникального идентификатора более оптимально, но (в данном случае) менее функционально. Спасибо большое! А можно узнать источник, откуда Вы узнали такие тонкости?
6. triviumfan 93 22.09.18 10:30 Сейчас в теме
7. frkbvfnjh 787 22.09.18 10:33 Сейчас в теме
(6) Хмм, думаю вполне достоверно, надеюсь, что в файловом варианте примерно такой же расклад...
24. herfis 498 24.09.18 16:28 Сейчас в теме
25. spacecraft 24.09.18 16:42 Сейчас в теме
27. triviumfan 93 24.09.18 16:50 Сейчас в теме
(24) Спроси у скуля, зачем ему столько места. Наверное, из-за кодировок, 2 байта за символ.
Прикрепленные файлы:
28. triviumfan 93 24.09.18 16:55 Сейчас в теме
(27) гугл - ms sql nvarchar size, первая ссылка гласит:
But NVARCHAR strings are stored in the database as UTF-16 -- 16 bits or two bytes per character
10. KulSer 22.09.18 11:49 Сейчас в теме
(1) Когда попробуете, отпишитесь о результатах, пожалуйста. Сколько записей в вашем регистре, насколько выросла производительность и увеличился размер БД.
Интересно же.
13. frkbvfnjh 787 22.09.18 12:30 Сейчас в теме
(10) Попробую. С размером то понятно, а вот как правильней в это случае проверить скорость работы, не совсем понятно...
55. azhilichev 213 27.09.18 11:41 Сейчас в теме
Отталкивайтесь от задачи и от планируемого объема данных в таблице. Если данных будет не много, то строка сойдет. В противном случае создавайте дополнительный строковый реквизит, включайте у него признак использования полнотекстового поиска, пишите в него значения, по которым будете искать, и используйте системную глобальную функцию ПолучитьДанныеВыбора().
8. DarkUser 22.09.18 10:43 Сейчас в теме
Если сделать размер строки фиксированным то храниться в БД такой реквизит будет в формате NCHAR(n) а не NVARCHAR(n) и разницы в размерах не будет. Да и поиск будет происходить существенно быстрее по такой строке.
9. frkbvfnjh 787 22.09.18 11:48 Сейчас в теме
(8) Спасибо большое за замечание, у меня ведь как раз всегда одинаковая длинна строки будет, тогда имеет смысл сделать ее фиксированной.
(8)
разницы в размерах не будет
- тогда получается NCHAR(32) - размер 32?
11. DarkUser 22.09.18 12:16 Сейчас в теме
(9) Не совсем так, сейчас перечитал MSDN https://docs.microsoft.com/ru-ru/sql/t-sql/data-types/nchar-and-nvarchar-transact-sql?view=sql-server-2017


nchar [ ( n ) ]
Строковые данные постоянной длины в Юникоде. n определяет длину строки и должно иметь значение от 1 до 4000. Размер хранилища — дважды n байт. Если кодовая страница параметров сортировки использует двухбайтовые символы, размер хранения остается равным n байт. В зависимости от строки для хранения n символов может понадобиться менее n байт. Синонимами типа nchar по стандарту ISO являются типы national char и national character.
nvarchar [ ( n | max ) ]
Строковые данные переменной длины в Юникоде. n определяет длину строки и может иметь значение от 1 до 4000. Значение max указывает, что максимальный размер при хранении составляет 2^30-1 символов. Максимальный размер при хранении в байтах равен 2 ГБ. Фактический размер хранилища в байтах вдвое больше числа введенных символов + 2 байта. Синонимами типа nvarchar по стандарту ISO являются типы national char varying и national character varying.


То есть, как я понимаю, объем хранимых данных у nchar всё же меньше чем у nvarchar но не в два раза.
12. frkbvfnjh 787 22.09.18 12:27 Сейчас в теме
16. spacecraft 22.09.18 17:22 Сейчас в теме
(11)
объем хранимых данных у nchar всё же меньше чем у nvarchar но не в два раза

да, отличается. В данном случае - ровно на 2 байта.
29. triviumfan 93 24.09.18 16:59 Сейчас в теме
(8) nchar "весит" столько же.
14. ImHunter 315 22.09.18 17:01 Сейчас в теме
СтрДлина(Строка(Новый УникальныйИдентификатор)) = 36
harek78; hiduk; +2 Ответить
15. spacecraft 22.09.18 17:09 Сейчас в теме
(14) это всего навсего длина строкового представления УИ
17. ImHunter 315 24.09.18 06:24 Сейчас в теме
(15) А если реквиз объявить длиной 32 вместо 36 - это как, "всего навсего";)
Я как-то раз тоже решил, что строковая длина УИДа = 32. В продуктиве через 2-3 дня начались странные вещи. Благо быстро нашли недочет.

А что касается (1), то на свежих версиях платформы можно смело УИДы использовать.
Раньше с этим были определенные проблемы. УИДы не имели отражения в управляемых формах. Нельзя было список УИДов в запрос закинуть.
Примерно с полгода назад наконец-то это в платформах доработали.
hiduk; kild; +2 Ответить
18. spacecraft 24.09.18 07:04 Сейчас в теме
(17)
А если реквиз объявить длиной 32 вместо 36 - это как, "всего навсего";)

Вот именно что строковое представление, для удобства восприятия разделены на группы отделенные дефисами. Вот этих дефисов как раз 4. Итого 32+4=36.
ec9b1edd-9c20-4285-94b9-8c69c4a34f6e
19. ImHunter 315 24.09.18 07:08 Сейчас в теме
(18) Иии чего? Постоянно это держать в уме и чистить дефисы?
20. spacecraft 24.09.18 07:09 Сейчас в теме
(19) если реквизит строковый, то это уже не УИ. Это строка чего-то. Со своими особенностями.
21. lostlamer 24.09.18 11:16 Сейчас в теме
(18)
Вот именно что строковое представление, для удобства восприятия разделены на группы отделенные дефисами. Вот этих дефисов как раз 4. Итого 32+4=36.
ec9b1edd-9c20-4285-94b9-8c69c4a34f6e


И все же УИ это 36 символов тип данных в SQL uniqueidentifier (Transact-SQL) https://docs.microsoft.com/ru-ru/sql/t-sql/data-types/uniqueidentifier-transact-sql?view=sql-server-2017
23. spacecraft 24.09.18 16:22 Сейчас в теме
(21) УИД в базе 1С хранится как binary(16). Об этом уже говорили. Причем тут тип uniqueidentifier ?
kild; t.v.s.; herfis; +3 Ответить
22. Ditron 184 24.09.18 13:47 Сейчас в теме
Насколько мне известно, GUID - это массив (на низком уровне) чисел array [0..5] of WORD, индексируйте уникальный идентификатор и все, полнотекстовый поиск работает и по представлениям объектов (как агрегатным так и простым)
26. herfis 498 24.09.18 16:48 Сейчас в теме
А, дошло. Он дефисы посчитал, а два байта не посчитал.
Дефисы, конечно же, нет смысла писать. Это элемент представления данных.
30. triviumfan 93 24.09.18 17:23 Сейчас в теме
Вы не сможете создать через конфигуратор строку, которая будет хранится в char/varchar, только с nchar и nvarchar.
Тут указаны все типы, с которыми 1с работает. https://its.1c.ru/db/metod8dev#content:1828:hdoc
Строка фиксированной длины: длина n. NCHAR(n)

Соответственно каждый символ будет занимать 2 байта/16 бит из-за кодировки UTF-16
31. caponid 24.09.18 17:52 Сейчас в теме
Стесняюсь спросить... а в какой именно части УИДа планируется делать поиск и зачем?
33. VmvLer 24.09.18 17:59 Сейчас в теме
(31) УИД "хранит" в себе некие тайны: тип таблицы, дату создания кое-чего еще...

а тайна всегда манит тех кто хочет ей овладеть
34. caponid 24.09.18 18:06 Сейчас в теме
(33) некоторые тайны не стоят того)))) а тайна уида тем более)))
и типа таблицы там нет...
Ditron; herfis; +2 Ответить
36. t.v.s. 111 25.09.18 06:53 Сейчас в теме
(33)Ничего подобного в настоящее время УИД не хранит. Тот факт, что некоторые люди находят в УИДе какие-то закономерности вроде даты создания или типа таблицы - это сродни астрологии или гаданию на хрустальном шаре.
37. VmvLer 25.09.18 08:41 Сейчас в теме
(36) пока не доказано обратное можно верить во что угодно
38. herfis 498 25.09.18 09:42 Сейчас в теме
(36) Время генерации GUID таки содержит. Если он генерился. И 1С пакует его в binary(16) таким образом, чтобы время генерации было впереди. Чтобы в общем случае кластерный индекс по ссылке был таки в порядке создания, что зело облегчает работу СУБД по добавлению записей.
32. VmvLer 24.09.18 17:56 Сейчас в теме
просто к сведению

УидЗнч1 = Док.Ссылка.УникальныйИдентификатор();
XMLСтр = XMLСтрока(УидЗнч1) ;
УидЗнч2 = XMLЗначение(Тип("УникальныйИдентификатор"), XMLСтр);

Если УидЗнч1 = УидЗнч2 Тогда
КонецЕсли;
BoryaMbi; +1 Ответить
35. insurgut 207 25.09.18 06:24 Сейчас в теме
А ничего нигде не сломается, если тип смените? Ведь при загрузке проверка УИД = ЗаписьРегистра.УИД в случае смены типа на строку будет выдавать Ложь, не смотря на то, что внешне выглядят одинаково?

Или регистр ваш и проверки ваши? Тогда даже при огромном количестве записей разница в объеме будет не такой уж критичной даже при миллионах записей в регистре.

Если регистр не ваш, то корректнее будет добавить реквизит и заполнять его в менеджере регистра просто при записи.
39. Ditron 184 25.09.18 16:40 Сейчас в теме
УИД вручную платформа не генерит, УИД это массив сгенерированный системой (windows API CoCreateGUID()), и уникален он в пределах компьютера (там где происходит генерация), время возможно внутри есть, но проверка на уникальность (в винде) происходит по реестру...
40. herfis 498 25.09.18 18:05 Сейчас в теме
(39) GUID уникален не только в пределах компьютера, в этом его смысл :)
https://en.wikipedia.org/wiki/Universally_unique_identifier#Format
В двух словах: любой GUID состоит из трех основных частей, комбинация которых и обеспечивает его уникальность. Части стандартизированы. Есть несколько версий и несколько алгоритмов генерации, но в целом они про одно и то же
1) 6 байт определяют место генерации
2) около 8 байт определяют время генерации с точностью до долей миллисекунд (точность несколько отличается в разных версиях)
3) около 2 байт - условно случайная последовательность
Просто там еще несколько бит на версии формата и алгоритмов, поэтому и "около".
Получается, для совпадения GUID'ов с разных компов должны совпасть "идентификаторы" компов, время генерации и сгенерированная условно случайная последовательность. Справедливо предполагается, что этой вероятностью можно пренебречь.
kild; Ditron; +2 Ответить
41. Ditron 184 25.09.18 18:31 Сейчас в теме
(40)никогда не вникал в такие подробности, хотя предполагал что приблизительно так и есть, достаточно было уникальности в пределах одного компьютера (сервера)
42. spacecraft 25.09.18 20:06 Сейчас в теме
(40) учитывая, что в 1С для разных объектов метаданных уникальность не отслеживается, то можно предположить, что УИД не формируется ОС, а генерируется самой платформой. Тем более, что расположение частей не стандартное. Да и формат хранения в базе совсем другой.
43. herfis 498 26.09.18 09:24 Сейчас в теме
(42) Да все там стандартное (во всяком случае мне неизвестно ни одного факта, говорящего в пользу обратного). В чем особенность хранения в базе я здесь уже говорил. В любом случае, у меня нет задачи кого-то в чем-то убеждать. Что знал - тем поделился.
А что касается уникальности в пределах компа - для того, чтобы сгенерить два одинаковых гуида на одном компе необходимо их сгенерировать подряд в течение сотни/сотен наносекунд, чтобы при этом совпали их условно случайные последовательности. Учитывая, что условно случайные последовательности тоже генерятся на основании тиков таймера, подозреваю что алгоритм их генерации подобран таким образом чтобы исключить и эту вероятность.
45. kild 89 26.09.18 13:58 Сейчас в теме
(39) Что-за чушь вы нафантазировали. GUID не зависит от операционной системы или отчего либо. Это тупо случайно генерированная последовательность. Никакой гарантии уникальности нет.
Общее количество уникальных ключей настолько велико (2^128 или 3,4028×10^38), что вероятность того, что в мире будут независимо сгенерированы два совпадающих ключа, крайне мала.
46. Ditron 184 26.09.18 14:03 Сейчас в теме
(45)Каждый фантазирует как может )) Вы только в 1С кодите? Или есть опыт в разработке на системных языках?
47. kild 89 26.09.18 14:08 Сейчас в теме
(46) а еще есть опыт кулинарии и вязания) Но GUID он и в африке гуид.
EMelihoff; +1 Ответить
49. Ditron 184 26.09.18 14:38 Сейчас в теме
(47)Поздравляю! (с наличием кулинарных способностей, я тоже умею готовить, а еще у меня 3 дан по карате), но я не об этом, я о том, что конкретно винда (когда например создаешь GUID в Delphi или С) проверяет уникальность по реестру, если вам об этом не известно, то ....
Да и глупо было бы например создавать COM объекты системой с уникальным GUID-ом, надеясь на тот факт условной уникальности!
50. herfis 498 26.09.18 14:43 Сейчас в теме
(49)
конкретно винда (когда например создаешь GUID в Delphi или С) проверяет уникальность по реестру, если вам об этом не известно

Вы же не хотите сказать, что винда пишет в реестр все генерируемые для любых целей гуиды? Или что в виндовом реестре можно найти айдишники всех объектов 1С? :)
51. Ditron 184 26.09.18 14:57 Сейчас в теме
(50)нет конечно, тем более 1С, но то что CoCreateGUID() лезет в реестр, однозначно... а вот как генерит платформа 1С мне неизвестно, возможно у них свои методы (без использования винапи, линухапи)
52. herfis 498 26.09.18 15:13 Сейчас в теме
(51)
но то что CoCreateGUID() лезет в реестр, однозначно

Хм... Возможно просто проверяет на всякий случай, чтобы полученный GUID не совпал с идентификатором COM-объекта, уже зарегистрированного в реестре.
Насколько я понял, винда генерит гуиды COM-объектов в реестре не с помощью time-based алгоритма, а на основании имени COM-объекта (есть такой специальный вариант генерации GUID-а, когда это по сути просто хэш от указанного имени).

Хотя нет. Разные категории алгоритмов генерации UUID кодируются специальными битами. Т.е. UUID сгенеренные по разным принципам совпадать не могут. Непонятно...
53. spacecraft 26.09.18 15:15 Сейчас в теме
(51) она может просто проверять зарегистрированные программы/библиотеки, не более того. Но даже это сомнительно.
Но может быть даже проще: считывать параметры, такие как МАК. Он примеряется для генерации GUID.
Или еще вариант: Система генерирует пул guid. Просто тупо считывает очередной.
54. kild 89 26.09.18 18:16 Сейчас в теме
48. herfis 498 26.09.18 14:32 Сейчас в теме
(45) Не "тупо". А очень даже "умно". Читайте внимательнее выше.
GUID не зависит от операционной системы или отчего либо

Самое смешное, что если подходить к формулировкам строго, то GUID - это Майкрософт :)
Это название имплементации UUID от мелкомягких.
44. caponid 26.09.18 09:30 Сейчас в теме
1C для УИД гарантирует только уникальность, и все.
Не стоит использовать его как-то иначе.
Если нужен какой то ключ с поиском - то лучше обратить внимание (и реализовать самому) на естественные ключи.

Были уже статьи и исследования по этому поводу.
Там даже время нельзя определить однозначно - уиды формируются платформой пакетно.

Как формируется GUID?
t.v.s.; Ditron; +2 Ответить
Оставьте свое сообщение

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