Имя: Пароль:
1C
1С v8
Установка пометки удаления документов прямым обращением к MSSQL
0 Elisy
 
17.08.15
11:20
Многим может быть полезно. Написал статью c описанием прямого доступа к MSSQL. Метод позволяет значительно экономить время:
http://habrahabr.ru/post/264687/

Возникла задача пометить на удаление документы за 1 год. Пробное удаление штатными средствами одного месяца заняло 4 часа. Это означало, что 12 месяцев удалялись бы 48 часов (2 суток). Забегая вперед, скажу, что прямым доступом к 1С документы удаляются за 30-40 минут.
1 Кадош
 
17.08.15
11:22
. Не публикуйте алгоритмы взлома и ссылки на такие алгоритмы, а также всевозможные "патчи", "крэки", "эмуляторы", "серийные номера", "коды активации" и т.д.
2 Maniac
 
17.08.15
11:23
1 месяц 4 часа????

Ты не думал что проблема у тебя совершенно не в 1С? а например сервак дохлый.

4 часа не может месяц удалятся. Либо у тебя там 2 миллиона документов в месяц либо просто сервак тухлый.

И прямым 40 минут тоже фантастика.
3 Ненавижу 1С
 
гуру
17.08.15
11:23
регистры говоришь? а итоги потом пересчитывать

но как разовая операция вполне, мы примерно так и резали базу
4 Ненавижу 1С
 
гуру
17.08.15
11:24
(2) почему не может? может, если это очень старый период, то система будет пересчитывать итоги по остаточным регистрам по всем последующим периодам
5 Elisy
 
17.08.15
11:25
(2) Вполне реально - в комментариях парень пишет, что
"в компании где я работал, управление структурой изделия и ряд других функций производственного блока реализованы в виде хранимых процедур и функций. Т.к. «штатный» 1С код на два порядка медленнее, что делает операции, по сути, невозможными."
Его комментарий подтверждает замеры.
6 Смотрящий
 
17.08.15
11:26
Борцуны за лицензионную чистоту.
И эти люди запрещаю ковыряться мне в носу ...
7 Elisy
 
17.08.15
11:26
(1) Где здесь алгоритм взлома, можно узнать?
8 Смотрящий
 
17.08.15
11:27
(7) Лицуху нарушаете
9 Timon1405
 
17.08.15
11:30
(0) вопрос: а сколько потом пересчет итогов идет+какой порядок размеров задействованных таблиц?
10 Mirnin
 
17.08.15
11:31
Видел эту статью. При прочтении возникает уточняющий вопрос, "все документы за год" - это сколько? Тысяча, десять, миллион, квинтильон?
11 scanduta
 
17.08.15
11:32
(0) У тебя ссылки проверяются на каждый объект перед удалением? Индексы обновляются в базе? Права проверяются?
12 scanduta
 
17.08.15
11:32
Такой обработкой можно и базу убить
13 mehfk
 
17.08.15
11:35
(0) Итоги пересчитывать кто будет?
14 mehfk
 
17.08.15
11:36
Допиши обработку, чтобы она сама итоги пересчитывала
15 Elisy
 
17.08.15
11:42
(9) Пересчет итогов делался менее часа.
16 Lama12
 
17.08.15
11:42
(0) Нарушение лицензии.
17 Elisy
 
17.08.15
11:44
(9) (11) Все документы сложно посчитать. Посчитал быстро - около 90000 документов реализации в конфигурации УТ.
18 Elisy
 
17.08.15
11:45
(11) Можно узнать, зачем проверять ссылки, если документы физически не исчезают? Зачем проверять права, если операция с полными правами идет? Индексы пусть MSSQL обновляет.
19 Kvant1C
 
17.08.15
11:45
(0) А в чем магический смысл прямого удаления? Ну допустим, что штатными средствами удаляется медленно. В чем проблема-то?
Нужно непременно в рабочий день нужно уложиться? Можно ж вообще частями удалять, в ночь например запускать пометку на удаление, если это днем создает нежелательную нагрузку.
20 ГеннадийУО
 
17.08.15
11:56
(17) 90 000 это немного... я тут недавно 800 000 удалял, часов за 6 средствами 1С удалилось...
21 Elisy
 
17.08.15
11:56
(19) Очень некомфортно штатными средствами получается. Происходит обрезка живой базы. Все пользователи в базе. Если 2 дня выполнять обрезку, постоянно остатки будут скакать. Плюс начнется обмен по РИБ с блокировкой таблиц. Плюс такой же прием, удаление в центральной базе на 2 дня с блокировкой таблиц.
22 Дык ё
 
17.08.15
11:59
(19) (20) статья не про удаление, а про рекламу .Net Bridge
23 Широкий
 
17.08.15
11:59
(0) Я подобную обработку написал несколько лет назад.
На инфостарте лежит, но правда за денежку
24 Serginio1
 
17.08.15
12:02
(22)  .Net Bridge всегда можно заменить бесплатным решением. Но так или иначе нужно знать Net
25 rs_trade
 
17.08.15
12:02
Есть золотая середина. Написать собственную обработку не требующую монопольного доступа. И пусть она спокойно фоново помечает.
26 ДенисЧ
 
17.08.15
12:04
" Но так или иначе нужно знать Net"
Зачем?
27 Зеленый пень
 
17.08.15
12:04
(0) Если пишешь статью - пиши понятными терминами.
А то "Возникла задача пометить на удаление документы за 1 год. Пробное удаление штатными средствами одного месяца заняло 4 часа". Так пометка или удаление?
Пометка на удаление и удаление - совсем разные вещи. Путаешь читателей с первых же строк!
28 Serginio1
 
17.08.15
12:04
(25) Остатки будут прыгать.
29 Serginio1
 
17.08.15
12:06
(26) Ну если тебе весь код напишут, то конечно знать не нужно. Нужно только платить, за то, кто это напишет.
30 ДенисЧ
 
17.08.15
12:06
(29) Ещё раз. Зачем для прямого доступа к базе нужно знать NET?
31 Зеленый пень
 
17.08.15
12:07
Присоединюсь - зачем еще какой-то Elisy.NetBridge ? Нафиг такое счастье.
32 Бубка Гоп
 
17.08.15
12:09
(24) шта? нафейхоа энтот бридж? и тем более знание Net?
33 Serginio1
 
17.08.15
12:10
(30) Я про это не говорил. Мое сообщение касалось 22.
Все можно сделать без Net
34 Elisy
 
17.08.15
12:11
(22) Перепишите на любой метод обращения к СУБД. Код открыт, запросы схожие. Мне ближе .Net - на нем и пишу.
35 Ёпрст
 
17.08.15
12:11
Как зачем ? Чтоб все спрашивали!
36 Бубка Гоп
 
17.08.15
12:13
(34) ы. А чем обращения в Net будут отличаться от обращений из 1с? Или оно не на ADODB работает?
37 Elisy
 
17.08.15
12:13
(25) Фоновая обработка будет также изменять остатки товаров в реальной базе. Остатки будут скакать 2 дня. Плюс 2 дня в связанной по РИБ базе.
38 Elisy
 
17.08.15
12:15
(30) (31) (32) Обработка спокойно сработает на бесплатной демо-версии .Net Bridge. Алгоритм для других способов прямого обращения схож. Мне ближе .Net - на нем и написал.
39 Serginio1
 
17.08.15
12:20
(34) Тогда лучше в Command загрузить как пакет все запросы.
А внутри Использовать транзакции
http://habrahabr.ru/post/123507/

Хотя ...
40 qwerty2469
 
17.08.15
12:27
А не проще создать хранимую процедуру и ее вызывать?
41 Serginio1
 
17.08.15
12:32
(0) База 1С и имя SQL может быть разными
v8: Перевод Запроса 1С в SQL?
42 Elisy
 
17.08.15
12:36
(23) Видел, скорее всего, вашу обработку на Инфостарт. Она также позволяет ставить отборы, что не реализовано у меня. Но для задачи обрезки базы нам не требовались гибкие отборы.
43 Serginio1
 
17.08.15
12:44
(42) Кстати, а пересчет остатков делается автоматически? Отстал я от жизни.
44 grayshadow
 
17.08.15
13:11
а вот у меня такой вопрос... если скулем установить пометку удаления, движуха из регистров сама исчезнет?:)
45 ДенисЧ
 
17.08.15
13:16
(44) нет, разумеется. читай статью винмательней
46 grayshadow
 
17.08.15
13:21
(45) я догадывалась что не исчезнет, а удалять ее средствами скуля - адский изврат, который не факт что даст выигрыш в скорости:)
я бы для начала отключила итоги и замерила производительность в 1с...
47 qwerty2469
 
17.08.15
13:31
(46) И ни какого "адского изврата" в этом нет, просту на SQL получаешь УИД документа, по этим УИДам находишь записи в регистре и удаляешь. Проще простого, а по скорости в раз 20 быстрее
48 Serg_1960
 
17.08.15
13:48
PS: у автора РИБ, о чём он сказал в (21), и я не вижу для него смысла использовать прямые обращения к MSSQL. Обрезку базы я бы делал штатными средствами на специально созданном узле в монопольном режиме. Миграция итогов обрезки в рабочую базу - сообщением обмена (будете приятно удивлены скоростью :)
49 Elisy
 
17.08.15
14:38
(43) Пересчет в моем случае выполняется через Конфигуратор - Тестирование и Исправление
50 Гёдза
 
17.08.15
14:43
(49) а что в обработке сразу не добавил?
51 Гёдза
 
17.08.15
14:44
А производился ли замер удаления документов с ВЫКЛЮЧЕННЫМИ итогами?
52 Elisy
 
17.08.15
14:47
(48) Ваше предложение, несомненно, имеет право на жизнь. Но вся моя интуиция против такого способа, зная стиль работы 1С. Потому что не понимаю принципиальной разности между удалением документов групповой обработкой и удалением в плане обмена. Экспериментировать я не буду, так как моя проблема решена.
53 Ёпрст
 
17.08.15
14:59
(52) надо было хотя бы поделку на нет вложить в макет самой обработки, а прям неуважение какое-то к пользователям - ищи еще и саму ВК потом.
54 Serginio1
 
17.08.15
15:22
53+ её кстати можно и зарегистрировать из 1С
NetObjectToIDispatch - Ошибка при вызове конструктора (COMОбъект)
55 Serg_1960
 
17.08.15
21:23
(52) "Потому что не понимаю принципиальной разности..." - Вы действительно не понимаете разности :( Механизм распределенной информационной базы отключает контроль ссылочной целостности и имеет высший приоритет. Достаточно, например, напомнить о том, что изменение(или удаление) документа произойдет даже если пользователь открыл документ для редактирования (тем самым заблокировав его)...
56 Mikeware
 
17.08.15
21:51
Как говорится, КГ/АМ... Никакой особой особой разницы между клюшками и снеговиком нет. А механизм для клюшек известен  лет 14. Единственный нюанс - 90 000 удаляется в течение минут а не часов...
57 Asirius
 
17.08.15
22:23
(52) а скорость создания специально-созданного узла обмена для монопольного удаления не подскажите?!
58 Elisy
 
18.08.15
06:16
(53) Господи, сколько пафоса, аж противно. "Поделка на нет" имеет официальный статус 1С-совместимо, на ней основано примерно 30 проектов и примеров помимо этого. И она, на мой скромный взгляд, заслуживает отдельной страницы. Вам ближе будет эта ссылка
http://catalog.mista.ru/public/20035/
59 Kupogun
 
18.08.15
06:49
(58) а почему этой ссылке нет в статье из (0)?
60 magicSan
 
18.08.15
06:50
Нормальная тема, особено когда много загружать надо. Загружали раньше из джестори часов 10-15 с 20ти магазинов. А документы все однотипные, без аналитики по товару. выцепили в итоге какие должны быть ссылки в СУБД и грузили напрямую, в итоге за часа 2 и доки загружены и проведено.
61 Записьдампа
 
18.08.15
07:00
(58) Вот кстати да. Напомни, плз, номер информационного письма от 1С о сертификации. Беглый поиск говорит о том, что сертификат на продукт "Elisy .Net Bridge", выданный для 8.1 протух три года назад - 20.05.2012.
Какая версия сертифицировалась?
62 Elisy
 
18.08.15
08:20
(55) Я действительно не понимаю разности. Зачем при пометке на удаление 1С проверять ссылочную целостность, если объект физически не удаляется? Не проверяет она ее. И при обмене не проверяет. Разницы никакой нет. Пользователь, кстати, в моем случае не сможет записать документ, потому что процесс обмена заблокирует таблицы, по которым идет обмен.
63 ifso
 
18.08.15
08:55
это закладка такая для последующего "исправлю поломанную базу", не ?)
64 Elisy
 
18.08.15
10:10
(59) Статья описывает алгоритм, который можно реализовать любым методом доступа к СУБД. На Хабре мало 1С-ников, кто захочет поиграться с обработкой. Ссылку на .Net Bridge привел в (58)
65 Serginio1
 
18.08.15
10:23
(58) Ты так сильно не расстраивайся. К сожалению, даже такой продвинутый Ёпрст не хочет применять .Net. Хотя  профит от его  применения огромный. Можно использовать сборки гак из GAC а, так и пользовательские без регистрации, использовать события через подключитьОбработчик итд. Это намного больше чем разного рода скрипты. Но вот почему, то вся это мощь мало кому нужна.
66 magicSan
 
18.08.15
10:26
(65) Чтоб вместо 2ух суток ждать 40 минут.
67 18_plus
 
18.08.15
10:28
почитал.
тем, кто не понимает, что и как делает обработка, в руки давать нельзя.
те, кто понимает, сами накидают запрос и, при необходимости, оформят в обработку.
68 Elisy
 
18.08.15
11:19
(61) http://www.1c.ru/news/info.jsp?id=11871
Факт сертификации есть. 3я или 4я версия на тот момент сертифицировалась.
69 vhl
 
18.08.15
11:45
(0) А что, через обычный ADO нельзя уже? Обязательно какой-то НЕТ-Бридж надо городить?
70 ДенисЧ
 
18.08.15
11:46
(69) не, он уже смилостивился и разрешил
71 Elisy
 
18.08.15
13:31
(63) Реальная база неделю работает стабильно. Это скорее вкладка для поиска единомышленников.
72 Записьдампа
 
18.08.15
14:34
(68) Нашёл, спасибо.

Нет факта сертификации.
По правилам 1С
http://www.1c.ru/rus/products/1c/predpr/compat/soft/condition.htm
1) Новые редакции ранее сертифицированных продуктов, отличающиеся по функциональности от предыдущих версий, имеют право на использование логотипа «Совместимо! Система программ 1С:Предприятие» только после пересертификации продукта.
2) Сертификат выдается сроком на два года. По истечении этого срока продукт должен быть подан на сертификацию заново. Исключения составляют продукты, сертифицируемые по категории "Программы для удаленного банковского обслуживания".

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

Попробуй сфокусироваться на других примерах использования дотнета, вещь-то забавная =)
73 МуМу
 
18.08.15
20:36
Забавно, сегодня обсуждали один из проектов. Стоп фактором был вопрос посвященный обрезке базы.(БД под террабайт). Вообще подобные проекты не люблю категорически. Изначально, архитектурно нужно планировать обрезку БД. В случае нормальной структуры и простейших правил.(прямые сслыки, избыточные реквизиты даты и т.п.) этот процесс очень простой. Если же не задумываться то об этом изначально - начинаются приключения. Заказчика как правило в этом убеждать очень сложно(как правило в силу его слабой компетенции).  Я к чему - в 95-и случаях из 100-а правильный программист все сделает стандартными средствами 1С. В редких случаях нужно написать несложный код на T-SQL(для не более 5-и процентов объектов) в силу ограничений по времени переноса.  Средствами 1С есть тоже масса вариантов для ускорения, учитывая уровень параллелизма 8.2-8.3.
74 Elisy
 
19.08.15
09:33
(69) (70) Когда все исследовано и разжевано до 3х SQL-запросов конечно уже можно и ADO применить.
75 Elisy
 
19.08.15
09:34
(72) Если вы боитесь поноса от просроченного .Net Bridge я специально для вас найду старую версию, конкретно на которую был выдан сертификат 1С-совместимо.
76 Elisy
 
19.08.15
09:37
(73) Часто выбирать-то особо не приходится. Есть задача обрезки конкретной базы - ее нужно выполнять. Не реально тратить недели времени на ее оптимизацию, как некоторые предлагают.
77 magicSan
 
19.08.15
10:07
(73) "учитывая уровень параллелизма 8.2-8.3." - чо?
78 Serginio1
 
19.08.15
10:19
(73) Вообще для усечения базы есть две стратегии копирование и удаление. А вот массовые операции по усечению базы 1С могла бы и предусмотреть создав для этого инструменты которые бы генерили запросы для массовых операций.
79 Зеленый пень
 
19.08.15
10:19
(73) Когда регистры накопления в десятки миллионов записей, то чистить их средствами 1С при любой параллельности - слишком долго. Штатный механизм записи строго "по регистратору" слишком медлителен.
80 Serginio1
 
19.08.15
10:25
(77) Ты можешь создать несколько фоновых заданий которые будут удалять движения документов, предварительно отключив пересчет итогов УстановитьИспользованиеИтогов(ложь)
81 Serginio1
 
19.08.15
10:33
(73) Кстати при обновлении записей вполне могли бы использовать Merge, что бы не трогать неизмененные записи в том числе и при пересчете итогов
82 Славен
 
19.08.15
10:34
А автор молодец, статья норм. А еще понравлся коммент автора по поводу русскоязычного названия переменных
83 magicSan
 
19.08.15
10:38
(80) Это не параллельность
84 Записьдампа
 
19.08.15
12:37
(75) Благодарю за сочувствие. Согласно пункту 2.2.2, ваш сертификат уже можно использовать как бумажку при поносе, да.
85 Elisy
 
19.08.15
13:29
(84) Я как бы догадывался, что сертификаты 1С не очень уважают, но не думал, что до такой степени ))))))))
86 Записьдампа
 
19.08.15
15:23
(85) Сертификаты-то уважают. Торгашей, размахивающих просроченной лицензией - не очень. Особенно когда это пафосно подаётся как одно из достоинств продукта за 6000.
87 Serginio1
 
19.08.15
18:36
(0) По поводу пересчета итогов http://catalog.mista.ru/public/177171/
88 Serginio1
 
19.08.15
18:46
(83) Можно назначить потоки, которые будут удалять данные только по одному регистру.
89 Elisy
 
20.08.15
10:05
(86) То есть, если сертификат не просроченный, то почет и уважение, а если просрочен - презрение? )))) Не подскажете, кстати, презрение когда начинается: с времени регистрации плюс 2 года или с 12:00 ночи того же дня? В пункте 2.2.2 непонятно выразились.
90 Elisy
 
21.08.15
06:33
(48) Про специально созданный узел в РИБ и обрезку итогов. На периферийной базе продолжились массовые операции. На основе их был сформирован незаархивированный пакет обмена весом в 5,5Гбайт. Он не вошел в центральый узел. 1С после 4х часов работы вывалилась с ошибкой: "Ошибка преобразования данных XML: [file://E....... ][40796033,8]". Я это пишу к тому, что при огромных обменах лучше не надеяться на 1С.
91 magicSan
 
21.08.15
06:38
(88) Всё ровно не паралельность
92 Elisy
 
21.08.15
10:33
(90) Если кому-то интересно, вероятнее всего, в плане обмена не допустима строчка <ДокументОснование xsi:nil="true"/>. А именно тэг xsi:nil. Явный баг платформы 1С - источник сгенерировал такой XML, приемник - не принял.
93 Serginio1
 
21.08.15
10:40
(91) А что же это такое, когда запросы выполняются параллельно? Может ты придумал свое понимание этого понятия?
Тогда огласи его.
94 rsv
 
21.08.15
10:51
(0) Америку не открыли . Напишите лучше статью как генерится значение для поля _IDRRef для INSERT новых строк .  А UPDATE строк  это  не сложно  .
95 Serginio1
 
21.08.15
10:54
94 Наверное как то так v8: _SimpleKey и его установка
96 rsv
 
21.08.15
10:56
(90) Переходите к модели одной БД . И не будет " огромных обменов ". Прикупить лучше Enterp. версию скуля и железок.
97 rsv
 
21.08.15
10:57
(95) Не то .
98 Гёдза
 
21.08.15
11:00
(92) Говорят это еще в 8.2 исправили
99 magicSan
 
21.08.15
11:02
(93) Это непонимание тобой сути проблемы - хоть 100 потоков если удаляют один регистр - в очереть.
100 ДенисЧ
 
21.08.15
11:03
(99) нуну
101 Гёдза
 
21.08.15
11:03
(99) если без пересчета итогов, то без очереди будет
102 Гёдза
 
21.08.15
11:04
(99) это ты не понимаешь, что такое блокировки и откуда они берутся
103 Serginio1
 
21.08.15
11:04
(97) Почему? Разве _IDRRef не binary(16)?
104 Elisy
 
21.08.15
11:04
Многопоточность в 1С всерьез можно будет года через 3 обсуждать
105 Serginio1
 
21.08.15
11:09
(99) Еще раз каждый поток удалят только один регистр. Для понимания. Есть 33 регистра, на каждый регистр запускается отделное фоновое задание. При этом запросы нв удаления не конфликтуют. Удаляются через
УстановитьДопЗначенияРегистров(Тз,ДокСсылка);
  НаборЗаписей=Регистр.СоздатьНаборЗаписей();
  НаборЗаписей.Отбор.регистратор.Установить(ДокСсылка);
  НаборЗаписей.Записать();
106 Гёдза
 
21.08.15
11:09
(104) вряд ли. не ранее чем ооп введут )))
107 Гёдза
 
21.08.15
11:09
(105) 33 фоновых задания???
108 Гёдза
 
21.08.15
11:10
Как бы запуск фонового задания не бесплатен
109 Serginio1
 
21.08.15
11:10
(104) Помоему ты сильно оптимистичен. Может еще и замыкания,Linq и прочие вкусности?
110 rsv
 
21.08.15
11:12
(103) Тип то да .  Но вот как его собирает сервер приложения ?  Учитывая что newid() появился вроде как с 2008 го .  И тождественно ли это .
111 rs_trade
 
21.08.15
11:13
(103) чет мне кажется смешалось в кучу, тип ссылки и прикладной смысл существования симплкея в регистрах сведений.
112 Serginio1
 
21.08.15
11:13
(107)  В очередь встанут. Там все равно основная нагрузка на SQL идет. По сути потоки то простаивают и ожидают события по выполнению запроса от SQL. А SQL уже сам разрулит как ему эффективнее распараллелить запросы
113 Elisy
 
21.08.15
11:13
(109) Есть мысли ускорить развитие 1С через C#. Принцип такой:  http://habrahabr.ru/post/245453/
114 rs_trade
 
21.08.15
11:15
(110) сервер 1С какую то отсебятину вставляет в ссылки. что бы они сильно не отличались и были более-менее последовательны. типа для индексов это хорошо.
115 Serginio1
 
21.08.15
11:16
(110) _IDRRef это binary(16) который можно сгенерировать через Convert(binary(16),NEWID())
116 Гёдза
 
21.08.15
11:17
(114) Просто у сервера свой алгоритм формирования ГУИДОВ. 1 по правилам, а следующие просто увеличением
117 rsv
 
21.08.15
11:18
(115) Т.е получается что значение поля _IDRRef  заполняемое движком сервера приложения = Convert(binary(16),NEWID()) ?
118 Serginio1
 
21.08.15
11:19
(114) При этом у многих возникают дубли. Я часто использую.

ПолучитьСсылку(Новый УникальныйИдентификатор);

УстановитьСсылкуНового(
119 Гёдза
 
21.08.15
11:20
(118) В пределах 1 справочника дублей не бывает
120 rsv
 
21.08.15
11:20
(118) Т.е. Новый УникальныйИдентификатор = Convert(binary(16),NEWID()) ?
121 Serginio1
 
21.08.15
11:21
(117) Нет. Но такой вариант равнозначен 118
(119) При распределенных базах бывает. Есть примеры на этом форуме
122 Serginio1
 
21.08.15
11:21
(120) Да
123 rsv
 
21.08.15
11:22
(122) Так и не понял :) То да то нет .
124 Serginio1
 
21.08.15
11:25
(123) 1С для экономии времени генерирует свой GUID, который инкрементируется в одном из его разделов.
Но никто не запрещает использовать 118, поэтому и да и нет.
125 Serginio1
 
21.08.15
11:27
126 rsv
 
21.08.15
11:30
(124) Интересно . Надо будет покрутить вставку в табличку дока новой строки через NEWID().
127 rsv
 
21.08.15
11:30
+(126) Распарсит ли движок при чтении и отображениии..
128 Гёдза
 
21.08.15
11:32
+17
Русанов Дмитрий (1С, Москва)
04.12.2014 19:45
1301799
Отвечает на

  Внесем некоторую ясность. Ссылка и UUID - это разные вещи. Но при этом существует однозначное преобразование UUID в ссылку и наоборот. Ссылка представляет собой массив из 16 байт. Если рассматривать UUID как последовательность байт, то получается что в ссылке те же самые байты переставлены в другом порядке. Определение структуры GUID можно найти в файле Guiddef.h Windows SDK. Выглядит она следующим образом:

typedef struct _GUID {
    unsigned long  Data1;
    unsigned short Data2;
    unsigned short Data3;
    unsigned char  Data4[ 8 ];
} GUID;

В ссылке данные переставлены следующим образом:
- Data4 - 8 байт
- 1-й байт Data3
- 0-й байт Data3
- 1-й байт Data2
- 0-й байт Data2
- 3-й байт Data3
- 2-й байт Data3
- 1-й байт Data3
- 0-й байт Data3

  При автоматической генерации ссылок, UUID'ы, используемые для получения ссылок, генерируются в Windows с помощью функции Win32 API UuidCreateSequential(). В результате ссылки, полученные по последовательно сгенерированным UUID'ам отличаются в байтах с максимальными индексами. То есть две последовательно сгенерированные ссылки будут отличаться значениями байтов с индексом 15 (0-базированный индекс).
Такая дисциплина генерации ссылок дает очень компактные индексы по ссылкам в файловой базе данных, так как в терминальных страницах индекса (листьях дерева) для упаковки ключей используется общий префикс. Другими словами, на терминальной странице индекса целиком обязательно записывается только первый ключ. Если последующий ключ имеет общий префикс с предыдущим, то для последующего ключа записываются только отличающиеся хвостовые байты.
  Еще одной особенностью является то, для автоматической генерации ссылок, соединение с базой данных получает сразу пакет из последовательно сгенерированных UUID'ов. Размер пакета равен 64. При необходимости генерации новой ссылки используется очередной UUID из этого пакета. Как только пакет заканчивается соединение запрашивает новый пакет и т. д. Пакеты были введены для борьбы с неприятными последствия KeyRange блокировок, используемых MS SQL Server в режиме изоляции транзакций SERIALIZABLE. Не вдаваясь в излишние подробности, рассмотрим простой пример. Если в режиме SERIALIZABLE в рамках транзакции выполнить SELECT с WHERE <ссылка>=<значение ссылки>, то для индекса, построенного по ссылке, до конца транзакции окажется заблокированным диапазон ключей от ближайшего меньшего, чем <значение ссылки> до ближайшего большего, чем <значение ссылки>. (Если ближайшего меньшего или ближайшего большего нет, то блокируется все начало или весь хвост индекса.) Соответственно, внесение другими транзакциями новых записей с ключами попадающими в этот диапазон будет заблокировано до завершения транзакции, заблокировавшей диапазон.
  Пакеты ссылок позволяют возможное пространство ключей разделить на диапазоны, каждый из которых "принадлежит" определенному соединению. Диапазоны непостоянны и меняются со временем. Но в идеальном случае такой диапазон с одной стороны ограничен максимальной использованной ссылкой из пакета, принадлежащего данному соединению, а с другой стороны - минимальной ссылкой из пакета, принадлежащего другому соединению.
  В режиме управляемых блокировок режим SERIALIZABLE не используется и использование пакетов в значительной мере утратило свой смысл.
129 magicSan
 
21.08.15
11:40
(102) (105) Нуда блокировки на уровне записи точно. Только елси твои фоновые попадут в один рабочий процесс какая нафиг разница? Они в очереди будут.
130 rsv
 
21.08.15
11:52
(128) Судя по sql. ru  получается что newid = UuidCreate
131 rsv
 
21.08.15
11:54
132 Гёдза
 
21.08.15
11:54
(129) у процесса есть ПОТОКИ
133 Serginio1
 
21.08.15
11:55
(129) Какие блокировки, если каждое фоновое задание удаляет только свой регистр не конфликтуя с другими?
Еще раз внимательно прочитай 105.
1. Фоновое задание Метаданные.РегистрыНакопления[0]
2. Фоновое задание Метаданные.РегистрыНакопления[2]
3. Фоновое задание Метаданные.РегистрыНакопления[3]

1,2,3 задание никак не могут конфликтовать на уровне таблицы, другое дело, что может вмешаться конкуренция записи на диск, но это уже проблема железа.
134 Serginio1
 
21.08.15
11:57
(131) 115 и 118 идентичны
135 Serginio1
 
21.08.15
12:00
136 Serginio1
 
21.08.15
12:01
137 Serginio1
 
21.08.15
12:05
138 yukon
 
21.08.15
12:07
(130) UuidCreate это как раз "Новый УникальныйИдентификатор()", а для ссылок используется UuidCreateSequential. И выбран такой метод как раз из-за производительности.

Note. The UuidCreateSequential function tends to be slightly faster than the UuidCreate function. When the performance of the generation of a UUID is a significant consideration, the UuidCreateSequential function may be used.
https://msdn.microsoft.com/ru-ru/library/windows/desktop/aa379322
139 rsv
 
21.08.15
12:09
(138) Ок. Получается что можно полностью инсертить движком скуля через  newid() .
140 rsv
 
21.08.15
12:21
Скорее так NEWSEQUENTIALID является оболочкой для функции Windows UuidCreateSequential.
141 magicSan
 
21.08.15
12:42
(135) нук фигли ты же видешь очереть. (132) Пусть есть задания в одной очереди. (133) Да знаю я - спутал написал же.
142 Serginio1
 
21.08.15
13:47
(141) Это не очередь, а одновременно выполняющиеся задания.
При этом на самом деле Сервер приложений ничего не делает, большую часть нагрузки выполняет SQL.
Ну вот в 136 цифры ну никак не согласны с тобой. Упирайся дальше.
143 Serginio1
 
21.08.15
13:51
(141) Оаять же есть пул потоков он как правило ограничен на одновременное выполнение.
https://msdn.microsoft.com/ru-ru/library/h4732ks0.aspx
144 Serginio1
 
21.08.15
13:53
145 Elisy
 
21.08.15
14:07
(137) Судя по этой ссылке прирост скорости не очень высокий 5 минут с 20 - около 25%. Имею ввиду не в разы, как ожидал.
146 Serginio1
 
21.08.15
14:22
(145) Код выполнялся на виртуальной машине с одним процессором без RAID массивов. На реальном и хорошем «железе» выигрыш в скорости будет существенно больше.

Сколько ядер, и где находится SQL сервер неизвестно.
Если 2 ядра и SQL на одном сервере с сервером приложений вполне нормальный результат. Плюс обрабатывеатся одна таблица.
147 Elisy
 
24.08.15
12:24
(98) (92) Ошибся - <ДокументОснование xsi:nil="true"/> оказался не виноват. Проблема в том, что периферийный узел выгружала реквизит "УдалитьЗаказПокупателя", а главный узел ожидал реквизит "ЗаказПокупателя" (хотя в конфигураторе он виделся как "УдалитьЗаказПокупателя")
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.