Почему 1С 80 использует GUID а не LONG INT для ссылок. #226776


#0 by Гений 1С
Ведь LONG INT работал бы гораздо быстрее в запросах и т.п. Если тут начнут темы про репликацию, вот рецепт: 1С могла бы для ссылок внутри базы использовать LONG INT, в то же время для каждого объекта хранить GUID, который бы использовался бы при выгрузках и при репликациях. Так что вот сижу и думаю - почему GUID?
#0 by Гений 1С
Ведь LONG INT работал бы гораздо быстрее в запросах и т.п. Если тут начнут темы про репликацию, вот рецепт: 1С могла бы для ссылок внутри базы использовать LONG INT, в то же время для каждого объекта хранить GUID, который бы использовался бы при выгрузках и при репликациях. Так что вот сижу и думаю - почему GUID?
#0 by Гений 1С
Ведь LONG INT работал бы гораздо быстрее в запросах и т.п. Если тут начнут темы про репликацию, вот рецепт: 1С могла бы для ссылок внутри базы использовать LONG INT, в то же время для каждого объекта хранить GUID, который бы использовался бы при выгрузках и при репликациях. Так что вот сижу и думаю - почему GUID?
#1 by ТелепатБот
#2 by Херрес
ну держать и гуид и лонг инт - значит базы будут пухнуть ещё сильнее. И так уже неприлично...
#3 by Добрый Лемур
Ты имеешь ввиду, что обработка чисел (Long INT) идет гораздо быстрее обработки символов (GUID).
#4 by Херрес
Вообще я у себя на ответственных регистрах с особо крупными измерениями делаю как раз тип - число. Ну не удобно конечно в запросах, зато совесть по поводу скорости - чиста.
#5 by Гений 1С
я имею ввиду, что база данных быстрее работает с LONG INT, чем с GUID...
#6 by Гений 1С
Базы пухнуть не будут, индексы будут занимать меньше места, секете? А в индексах многократно дублируются ключевые поля.
#7 by Гений 1С
Может быть в этом секрет "тормозов" 8-ки?
#8 by Херрес
да, в этом. И ещё в тормозном интерпретаторе ты прав только цена решения слишком высока.... Тотальное введение собственных идентификаторов превратит удобнейшую платформу в обычный аксесс
#9 by Херрес
+1 и ещё в промежуточных итогах. Это ж фактически процессинг куба при каждом движении... Чистые OLTP системы конечно быстрее... в записи, но не в выборке
#10 by France
ну, можно было бы привести пример "пухнущих баз" на сравнении 16 битной гуид с 8 битной бигинт (лонгинт нету у мсскл)... ps.. как хранится в файловой версии - одному б.н известно..
#11 by Гений 1С
Ты про что, какое введение собственных идентификаторов???
#12 by orefkov
Это просто. Для создания нового идентификатора типа long int надо обратится к базе, залочить таблицу, считать последний текущий, обновить последний текущий, разлочить таблицу. При использовании guid'а новый идшник легко создает клиент без всяких обращений к БД. А для современного железа 8 или 16 байт длина ключа - не велика разница.
#13 by Гений 1С
Франс. тебе уже говорили, что база будет меньше весить, т.к. индексы будут весить меньше, чем ГУИДЫ каждой ссылки, дополнительно хранимые в ней для репликации..
#14 by Херрес
т.е. что, получается guid уменьшает блокировки базы ?? т.е. это благо, что ли ?
#15 by orefkov
Все что уменьшает блокировки базы, благо :) К тому же Гений лукавит, говоря, что индексы станут меньше, если использовать для репликации guid дополнительным полем, тк по нему все-равно придется строить индекс.
#16 by Херрес
ну это наверно будут уже другие индексы, которые не будут пролистываться при соединениях или отборах по ключу с лонгинт ? И ускорение в запросах мы всё же получим. В чём я убедился на практике
#17 by orefkov
Можно узнать, как проводилась практика?
#18 by Херрес
к сожалению точных замеров не проводил, но дело было так. 300000 позиций номенклатуры, 300 документов по 15 строк в день. Списание по средней. В лоб на типовой проводит секунд 10 Делал свой регистр, измерения Товар, Склад  (ссылочные) было уже гораздо быстрее. К сожалению не замерил, сколько потом ссылочное измерение Товар заменил на ID_товар тип Число, 10 ну и вместо справочника товаров стал использовать регистр сведений. Потом правда снова вернулся к справочнику, но связь делал по своему полю ID_товар. Визуально стало быстрее. На сколько - затрудняюсь сказать, сейчас док около секунды проводится
#19 by Гений 1С
гм... неужели СУБД МС СКЛ не умеет без блокировок раздавать уникальные ключи?
#20 by Гений 1С
Кстати, а что ГУИД реально всего 8 байт? Я думал больше.
#21 by Гений 1С
Ну в общем то сами понимаете добавление Поля ГУИД не изменит существенно объем базы. Обычно объем занимают реквизиты, строки, регистры сведений и т.п. Их гораздо больше (на порядки) чем объектов.
#22 by Гений 1С
можно выдавать ключи не блокируя таблицу... сервер хранит последний выданный ключ и всегда возвращает ключ+1 Ну иногда шерстит диапазон, находит дырки, ставит их в очередь. и по такой же схеме выдает...
#23 by Херрес
France в говорит что гуид=16 бит
#24 by _r2003
GUID 128 бит 16 байт.
#25 by _r2003
где то читал что запросы на выборку с условием по GUID по определению работают быстрее чем с целыми так как происходит по байтовое сравнение. Не говоря уже о запросах на вставку так как нагрузка не собирается в конце кластерного индекса. Возможно выйгрышь в 18 достигнут из за низкой производительности дисковой подситемы. А если её поднять то на целых возможно запрос ляжет на процессоре и эфекта не будет. ИМХО.
#26 by _r2003
to 22 and to 15 блокировки базы при заведении новых товаров, контрагентов и прочей справочной информации (записью новых документов) ничто по сравнению с временем формирования отчетов и проведением документов. тоже ИМХО.
#27 by MMF
теоретик доморощенный
#28 by Херрес
точняк ну не знаю как может получиться быстрее. Индекс занимает больше места, больше страниц надо пролистать при поиске...
#29 by Terv
+ 27 фонтан сырых идей.
#30 by Дык ё
Это SQL Server. А есть ещё файловый вариант, будет PostgreSQL... В 1С в очередной раз пожертвовали эффективностью в пользу унификации.
#31 by Гений 1С
суть в том что ключи выдаются без блокировок!
#32 by Гений 1С
бред
#33 by Гений 1С
Поясню наоборот LONG INT есть во всех базах, а с GUID не все справляются. О какой унификации идет речь. Удобство только для репликации, но репликация делается другим способом, о нем я уже писал в ... И где здесь выгода? 1с очередной раз лажанулась.
#34 by Гений 1С
Кстати, раз уж вы так зациклились на увеличении объема базы, то каждый объект и так может получить уникальный ГУИД, который образуется из ГУИД базы+ код таблицы + код ключа внутри нее.
#35 by Гений 1С
Завидуй!
#36 by Neco
Возможно соображения 1С такие, что ГУИД более стандартный механизм обеспечения уникальности объектов, даже если и LONG INT дает некий выигрыш, то им можно пренебречь в пользу унификации.
#37 by Херрес
А почему Лотус тоже использует ГУИды ? Уж наверно они не дурнее 1С ?
#38 by ottto
опередел)) А почему винда использует ГУИДы, а не лонгит. Вопрос риторический :)
#39 by Гений 1С
Винда и Лотус - я фигею... А почему ты молчишь про Акцапту и Навижн. Ты бы еще Ворд приплел, гыгыгы. Сравнил записную книжку и СУБД, где данных на порядки больше.
#40 by Гений 1С
1С расшаркалась и пропустила вперед Акцапту в очередной раз...
#41 by ottto
А в акцапте нет ГУИДов?
#42 by Гений 1С
в акцапте для ключей не гуиды используются... ;-)
#43 by Гений 1С
Хотя фиг их знает, по-моему они для связки используют "естественные ключи", а это та еще задница. ;-) Даже длиннее GUID, так что может я еще и погорячилси.
#44 by Херрес
Производительность GUID Шон МакКоун (Sean McCown) Все чаще и чаще я сталкиваюсь с тем, что разработчики по каким­то причинам хотят использовать идентификаторы GUID в качестве первичных ключей, и, что еще хуже, в кластеризованных индексах. Никак не возьму в толк, зачем надо применять GUID. Во­первых, они огромного размера — раза в четыре больше, чем целое, используемое в качестве первичного ключа. Приведем основные причины, по которым НЕ следует пользоваться GUID. · Они слишком большие, чтобы стать эффективным индексом. Чем меньше индекс, тем лучше, — это позволяет быстро найти значение ключа. Ни при каких условиях 16­байтный индекс не сравнится с 4­байтным. · Их слишком трудно запоминать администраторам баз данных, и потому сложно вникать в вопросы с данными. · Они не гарантируют уникальность. Вероятность того, что значение GUID будет уникальным, весьма велика, но это не 100%. · Они слишком быстро приводят к фрагментации таблицы. Поскольку они совершенно случайны, нельзя знать заранее, где произойдет следующая вставка, поэтому кластеризация по этому ключу НЕПРЕМЕННО вызовет фрагментацию. Поэтому не позволяйте своим разработчикам использовать GUID, особенно в системах, которые вам самим придется сопровождать. Проблема состоит в том, что ничего нельзя менять без твердых цифр и никто не проводил тестирования такого рода вещей. А вот я протестировал! Разница в производительности потрясает. Конечно, найдутся разработчики, которые все же будут настаивать на применении этих идентификаторов, но пусть стараются. Однако одно несомненно — ничего нельзя менять без обоснования в виде реальных цифр. Но теперь вы можете пойти к ним и показать, почему в базах данных лучше обойтись без GUID. Заключение У идентификаторов GUID есть своя ниша, но она, разумеется, не расположена рядом с кластеризованными индексами. Если вам все же приходится хранить GUID, создайте для него столбец где­нибудь в конце таблицы, а кластеризованный индекс стройте по ID, а не по нему. Тогда вы сможете обращаться с запросом к нужному GUID, а затем взять соответствующий ему ID и выполнять все, кроме первоначального поиска, по этому маленькому полю ID. По­моему, очень забавно, что разработчики получают требование уникальности, — их мозг попадает в заложники к GUID. Им в голову не приходит ничего иного. Один раз меня даже назвал идиотом один программист, который считал, что логические требования — это самый важный аспект приложения и что учитывать в приложении соображения производительности — кратчайший путь к провалу. Попробуйте­ка воспользоваться этой логикой и запустите 500 или 1000 одновременно работающих пользователей. А когда ваше приложение встанет, позвоните своему заказчику и скажите ему, что производительность приложения не такая уж важная штука.
#45 by Terv
чему завидовать? что ты занимаешь плагиатом? данный вопрос уже подымался летом на конференции разработчиков.
#46 by Гений 1С
извини, мне не доложили, на мисте он не подымался, просвещаю...
#47 by Гений 1С
вот видишь, вопрос подымался, а местныя во всю защищают ГУИДЫ, даже Орефков замечен был, гыгыгы
#48 by Гений 1С
так что не завидуй!
#49 by spock
Все же они GUID запихали в кластерный индекс?
#50 by k23
инт в качестве идентификаторов - не очень хорошая идея. разный он на разных платформах. а разве лонг инт на x32 не те же 64 бита?
#51 by Гений 1С
4 байта они и в африке 4 байта, что за гон? Гуид не 64 бита, а 16 байт.
#52 by Херрес
да ! хотя если подумать - что они могли ещё использовать, например для справочников.. Код - не уникален...  Они юзают код+гуид, ну так он ещё длиннее чем просто гуид
#53 by Херрес
в общем вывод такой: если в 8.1 вдруг откажутся от гуидов - мы порвём всякие аксапты с сапами - как тузик грелку !
#54 by Гений 1С
Херрес вы с бодуна? А что они в 77 использовали? Внутренний идентификатор! Короткая сжатая строка, в которой был зашит Лонг Инт...
#55 by Гений 1С
да, в аксапте индексы могут быть длинее - там естественный ключ по-моему используется для связки, т.е. именно поле КОД в понимании 1с-негов.
#56 by Херрес
ну и по этой причине семёрочные базы поменьше и шевелятся побыстрее... С чем не согласен-то ?
#57 by Гений 1С
Вот эта фраза непрофессиональна: "что они могли ещё использовать, например для справочников.. Код - не уникален.."
#58 by Ланкастер
to 53 Это мы еще посмотрим кто кого порвет - сказала грелка, надутая до 10 атмосфер, Тузику.
#59 by Херрес
слушай, ну хорош наезжать, да ? В 8ке код у справочников - не уникален. Записать его можно запроста с включенным флагом ЭтоЗагрузка. С чем ещё не согласен ???
#60 by Гений 1С
Херес, у каждого элемента справочника есть уникальный код в пределах справочника этого вида. 1С использует ГУИД, хотя могла бы юзать Лонг Инт, уникальный идентификатор есть независимо от уникальности/не уникальности кода... Так что к чему тут твои фразы про уникальность кода, не догоняю... 1С могла бы юзать естественный ключ, как АХАПТА, но тогда бы пришлось делать одно поле или комбинацию полей уникальной, проще ввести уникальный системный ключ каждого элемента, что 1С и сделала.
#61 by Херрес
ну смотри, мы же вроде говорили про кластерные индексы ? А они должны быть уникальными.... А код справочника, так же как и номер документа - по определению не уникален (на уровне БД), т.к. через план обмена всегда может приехать тот же код. Поэтому кластерный индекс по коду делать нельзя. Да и если посмотреть в ентерпрайз менеджере, вместо индекса по коду 1С использует составной =код+гуид Ты же сам говорил что гуидам есть альтернатива - лонгинт+код объекта+код базы
#62 by Steban
:)
#63 by k23
блин, длина инт зависит от процессора! нельзя его использовать в качестве идентификаторов.
#64 by Neco
Просмотрел еще раз ветку, не увидел ответа на вопрос: Почему LONG INT  в запросах быстрее GUID? Также не убедительны решения в вопроса присвоения нового идентификатора LONG INT без выборки данных из таблицы.
#65 by Мутабор
Читать лень. ПАТАМУШТА ЕСТЬ УРБД дапустим...
#66 by Херрес
зависит не от процессора а от СУБД в данном контексте ну потому что индексы получатся очень длинными. индексы хранятся так же как и данные, на страницах данных. Серверу надо пролистать в 4 раза больше страниц при поиске. ну если бы почитал сначала, увидел бы 2 альтернативных решения для УРБД
#67 by Мутабор
SQL Server, MS Access и т.д. GUID патаму что он GUID и шансов получить одиноковый номер меньше...
#68 by spock
а ни кто не пробовал вставить в такую табличку, например, миллион записей? Или расчет на то, что у всех стоят суперсервера под v8 и можно спокойно гуид запихать в кластерный индекс? Кластерные индексы не обязаны быть уникальными. А вот праймари кейз - да.
#69 by Херрес
если цена ГУИДа - проигрывание войны ERP систем - то насрать на этот шанс !
#70 by Мутабор
А патаму что у меня тоже хомяки спорят в клетке, а мне накакать чо им там не нравится.
#71 by Sadovnikov
Г1С - инженер знаний?? Нда... И после этого сюда еще грамотные люди заходят??
#72 by Мутабор
Не, грамотные не заходят. Только ты и другие. Вот и меня подтянули....
#73 by Мутабор
А вообще ветка классная. Только я ее не читал, названия хватило :)
#74 by wPa
шансов получить одинаковый GUID нет - в ближайший миллион лет. Не нужно искать свободный, выбирать пустые. Не нужно вообще ничего проверять. Как примари кей - идеал. А насчет индексации и выборок - очень сомневаюсь что настолько значительна разница - в десятки раз как грит Хоррес (не ставлю под сомнение слова - просто возможно причина в другом все-тки)
#75 by Гений 1С
тебе не читать, тебе думать лень. Если GUID хранится в ссылке, то УРБД работает нормально... Думал плохо. Длина INT не при чем, для идентификатора используется строго 4 байта, просто индекс получается более короткий и поиск более быстрый, в конечном итоге почитай статью, в ветке была ссылка, почему не рекомендуется юзать ГУИД для ключа. Сравни 4 байта и 16 байт...
#76 by Гений 1С
Ты просто не просек....
#77 by Херрес
нет-нет. Не десятки раз, я этого не утвержал. У меня основной прирост по другой причине произошёл. Ну визуально процентов на 20-30 может побыстрее стало. ну кстати это соотносится с мнением здесь
#78 by PVasili
+ огласите номера постов...
#79 by wPa
очень похоже...текст версус инт понятно проигрывает... Значит 1С на мега промышленный масштаб с индексами по ГУИД-ссылкам не выйдет. А Лотус понятно - он и так весь нереаляционный ...
#80 by Херрес
ок, резюмирую варианты альтернатив. В прозвучала идея держать два ключа - гуид для УРБД и инт для всей прочей логики. в было предложено использовать суррогатный, но не глобально уникальный, а уникальный в пределах данного набора распределённых баз ключ - код базы+код вида объекта+код объекта
#81 by Гений 1С
читай , примари кей тоже можно получать без обращения к базе. Сервак просто хранит последний выданный ключ. и все!
#82 by Гений 1С
Аксапта тоже текстовые коды юзает и ничего... Просто обидно, что 1с в очередной раз лажанулась... как обычно... А хомяки в клетке 1с гадят и галдят... как метко подметил товарищ!
#83 by wPa
да но его туда надо записывать...а при массовом создании это узкое место, т.е. выдача все-равно производится серваком, а не клиентом как для GUID. Тип Code несколько не Unicode ) Может они просто не завершили прогрессивную идею .. оставь им шанс )
#84 by wPa
к примеру вытаскивать из GUID время в миллисекундах и из него делать индексы для таблиц
#85 by Херрес
это есть шанс сделать в PostgreSQL, т.к. там есть механизм для встраивания в СУБД кастомных пользовательских алгоритмов индексации
#86 by Гений 1С
не надо его вытаскивать. При подключении к БД вытаскиваем максимальный ключ. При запросе нового номера выдаем ключ плюс 1 и в памяти (не в базе) сохраняем новое значение. Где блокировки?? будут дырки в ключах, если по выбранному ключу не запишут объект (откажутся от записи). Но механизм повторного использования дырок я уже описал, какие проблемы?
#87 by Гений 1С
про одновременную работу пользователей забыл??? гыгыгы... Лучше уж перенумеровывать гуид по глобальной таблице кэшей
#88 by MMF
читай , примари кей тоже можно получать без обращения к базе. Сервак просто хранит последний выданный ключ. и все! -- когда же ты перестанешь тупить? возьми буквари и почитай. И вообще, иди лучше  на мобилу девок заманивай. "шансов получить одинаковый GUID нет - в ближайший миллион лет." Фигня. Во-первых, если на компе стоит нормальная сетевая карта - только до 3400 года :-). А во-вторых, если стоит карточка с кривым МАС - уникальность только в пределах данного компа. Вполне реально получение нарушение уникальности Pk
#89 by Гений 1С
И в чем я туплю, объясни, вумник...
#90 by wPa
в памяти клиента? а другие? получат тот же ключ? одноверменно - не значит одномоментно! =)  время по любому не совпадет.
#91 by wPa
не допонял... при чем тут мак-адрес..
#92 by Гений 1С
Дятлы! Когда я пишу SELECT PRIMARY KEY FROM Bashmaky, сервер подсовывает мне примари кей для справочника башмаки именно по этой схеме. Если СКЛ Сервер это не умеет, это может делать сервер 1С предприятия.... НУ и ДЯТЛЫ!
#93 by Гений 1С
ГУИД формируется в зависимости от мак-адреса в том числе
#94 by MMF
"Сервак просто хранит последний выданный ключ. и все!" -  и тут у сервака выключается питание, виснет сервак или еще что-нить происходит, после перезапуска начинаем выдавать ключ с какого значения? При каждой выдаче нового ключа (например, gen_id в генераторе IB/Fb) осуществляется увеличение значения на диске с блокировкой таблицы. "При запросе нового номера выдаем ключ плюс 1 и в памяти (не в базе) сохраняем новое значение. Где блокировки??" переименуйся в Идиет1С
#95 by MMF
ну где ж ты, дружище? поясни как будет отрабатывать сбои твой мега-механизм генерации первичных ключей, не сохраняя на диске данные?
#96 by spock
может он пытается сказать про идентити-поле, но как собака не может :)
#97 by Гений 1С
Специально для дятлов повторяю - ПРИ ЗАПУСКЕ СЕРВАКА СЧИТЫВАЕТСЯ МАКСИМАЛЬНОЕ ЗНАЧЕНИЕ КЛЮЧА. То бишь если сервак перезагрузился, при старте мы знаем максимальное значение ключа. Я блин на блокировках собаку съел, а этот молодой и зеленый меня поучать собрался!
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С