|
Управляемая блокировка в 1С 8.3 | ☑ | ||
---|---|---|---|---|
0
Dmitry1c
01.05.22
✎
15:58
|
Управляемая блокировка в 1С 8.3
правильно понимаю, что наложение управляемой блокировки (с помощью объекта БлокировкаДанных) просто повышает уровень изоляции транзакции с READ COMMITTED до REPEATABLE READ на записи отбора при наложении? И вся суть оптимизации и параллельности в 1С 8.3 управляемых блокировок сводится именно к грамотному повышению изоляции до REPEATABLE READ только там, где надо? |
|||
1
H A D G E H O G s
01.05.22
✎
16:22
|
Нет, не правильно.
|
|||
2
Dmitry1c
01.05.22
✎
16:29
|
(1) а что не так, обладатель эксперта? :) я сдавать его не планирую, просто для новой работы требуется харды подтянуть.
|
|||
3
Dmitry1c
01.05.22
✎
16:41
|
>>Предназначен для явной блокировки данных от чтения или изменения другими сессиями.
вообще если читнуть в конфигураторе, то для блокировки от ЧТЕНИЯ или ИЗМЕНЕНИЯ запрещает ли уровень изоляции REPEATABLE READ читать прочитанные ранее данные? В этом неправильность? |
|||
4
Dmitry1c
01.05.22
✎
16:41
|
(3) запрещает ли уровень изоляции REPEATABLE READ читать прочитанные ранее данные другой транзакцией? В этом неправильность?
быстрофикс |
|||
5
Dmitry1c
01.05.22
✎
17:09
|
Я еще не учел, что упр. блокировки бывают разделямые(S) и исключительные(X)
ы |
|||
6
Dmitry1c
01.05.22
✎
17:18
|
(1) +охренеть, управляемые блокировки работают на уровне сервера 1С и вообще не имеют отношения к уровню изоляции транзакций в сервере СУБД ?
|
|||
7
dreizehn
01.05.22
✎
17:18
|
(2) > требуется харды подтянуть.
https://uc1.1c.ru/course/podgotovka-k-1s-ekspertu-po-tehnologicheskim-voprosam-osnovnoj-kurs/ Сдавать не обязятельно. |
|||
8
Dmitry1c
01.05.22
✎
17:19
|
(7) я сейчас книгу эксперта читаю
|
|||
9
H A D G E H O G s
01.05.22
✎
17:29
|
(6) Вооот.
|
|||
10
H A D G E H O G s
01.05.22
✎
17:29
|
(6) Упр. блокировка - это уровень между RC и RR
|
|||
11
Dmitry1c
01.05.22
✎
17:37
|
Да, я понял, сейчас уже с ИТС перечитываю:
В 8.3 в режиме управляемых блокировкок клиент-серверная СУБД работает в режиме READ COMMITTED (SNAPSHOT) и ни в каком другом режиме А на уровне сервера 1С можно управлять дополнительно с помощью управляемых блокировок для обеспечения разделяемой (Shared) или исключительной (eXclusive) блокировки. Сейчас столкнулся с тем, что не могу придумать, когда нужна разделяемая управляемая блокировка - когда ее надо кодить? Ну надо, чтобы другая транзакция не могла записать данные, но могла прочитать. А живой пример этого - какой? |
|||
12
Dmitry1c
01.05.22
✎
17:38
|
Посмотрел в ERP порядка 200 разделяемых блокировок и порядка 800 исключительных.
|
|||
13
Dmitry1c
01.05.22
✎
17:39
|
Короче разделяемый надо ставить тогда, когда мы записали объект (зачем-то), а потом планируем еще раз записать объект, но при этом в промежутках между этими двумя записями надо позволить другим транзакциям считать объект
|
|||
14
Dmitry1c
01.05.22
✎
17:42
|
Походу разделяемая блокировка предназначена для борьбы с фантомами, исключительная - с проблемой "неповторяемого" чтения
|
|||
15
ДедМорроз
01.05.22
✎
19:05
|
Исключительная блокировка - это когда мы что-то изменяем и хотим,чтобы до окончания транзакции никто не мог ни прочитать ни записать объект,другими словами,не позволяем транзакциям выполняться параллельно.
Разделяемая блокировка - это когда мы что-то читаем и хотим,чтобы параллельно никто туда не мог записать. Любая служебная информация для транзакции,которая в процессе транзакции не меняется,но может повлиять на ее ход,дрлжна блокировпться в разделяемом режиме. |
|||
16
Dmitry1c
01.05.22
✎
19:48
|
(15) спасибо
|
|||
17
Dmitry1c
03.05.22
✎
07:12
|
(7) посмотрел содержание этого курса, там куча инфы про работу с ЦУП-ом.
Мне оно нафиг не надо. |
|||
18
Dmitry1c
03.05.22
✎
16:57
|
Вот еще вопрос возник.
Нафига в регистре ЕРП "Партии прочих расходов" проиндексировано поле "Организация"? поидее элементов в справончнике "Организация" немного, зачем его индексировать? ради т.н. "покрывающего индекса"? |
|||
19
ДедМорроз
03.05.22
✎
17:59
|
(18)здрасьте,приехали.
А отбор по организации как делать? |
|||
20
H A D G E H O G s
03.05.22
✎
18:00
|
(18) По идее вам рановато такие темы создавать
|
|||
21
Dmitry1c
03.05.22
✎
19:32
|
(19) (20) хорошо.
почему в регистре "ТоварыНаСкладах" в той же ЕРП поле "Номенклатура" не проиндексировано? |
|||
22
piter3
03.05.22
✎
19:33
|
(21) идешь в тп и там спрашиваешь
|
|||
23
H A D G E H O G s
03.05.22
✎
19:38
|
(21) "поидее элементов в справончнике "Организация" немного, зачем его индексировать?"
Почему ты задал этот вопрос? |
|||
24
Dmitry1c
03.05.22
✎
19:41
|
(23) ну вот есть у тебя три юрлица в базе.
Как будет работать индекс для 1000 записей в таблице (предположим, что по 333 записи на каждую организацию) у тебя индекс на первом уровне уведет тебя в 333 записи ... и среди них потом будет обычный TABLE SCAN? профит от этого индекса - в 3 раза быстрее скорость будет? |
|||
25
hhhh
03.05.22
✎
19:47
|
(21) вы ЮМОРИСТ. каждый первоклассник знает, что по первому измерению регистр индексируется всегда. Поэтому галку Индексировать на нем никто не ставит. И в типовых нигде ее нет. В Товары на складах первый индекс по номенклатуре.
|
|||
26
H A D G E H O G s
03.05.22
✎
19:47
|
(24) А, не, я испугался, что ты применимость индекса оцениваешь по количеству элементов в справочнике, а не по селективности основной таблицы.
А по ситуации с ПартииПрочихРасходов - я думаю, там проеб 1С, ставить на первое место Организацию и индексировать ее - ну такое. |
|||
27
H A D G E H O G s
03.05.22
✎
19:48
|
(25) Для таблицы движений это не так.
|
|||
28
Dmitry1c
03.05.22
✎
19:48
|
(25) ерп 2.5, регистр "ПартииПрочихРасходов", первое измерение - Организация, проиндексировано
|
|||
29
Dmitry1c
03.05.22
✎
19:49
|
(26) понял, спасибо
|
|||
30
Dmitry1c
03.05.22
✎
19:51
|
(25) он не по первому измерению, а по всем измерениям, включая первое. Я по сути сам себе и ответил, почему "Номенклатура" в регистре "Товары на складах" не проиндексирована: не нужно, она входит в кластерный составной индекс, который создается для всех измерений, входящих в регистр
|
|||
31
H A D G E H O G s
03.05.22
✎
19:54
|
(30) Вы все забываете про таблицу движений
|
|||
32
Dmitry1c
03.05.22
✎
19:54
|
(30) +только опять же противоречие у себя выявил: а в каком случае надо для регистра измерение ставить "Индексировать"? если есть всегда кластерный составной индекс, в который входят все измерения.
Он в работает получается медленнее для не первого измерения в сравнении с индивидуальным индексом измерения? |
|||
33
hhhh
03.05.22
✎
19:56
|
(30) ну да, похоже потому что измерение номенклатура первое в составном индексе, делать по нему отдельный индекс не имеет смысла.
|
|||
34
ДедМорроз
04.05.22
✎
18:18
|
Вообще,там есть галка основной отбор,позволяющая делать отбор по этому измерению.
И,в подчиненном регистре первое индексированное поле - регистратор,по которому и отобрать можно. Селективность индекса - это отдельный вопрос,но,в любом случае,index scan лучше,чем full scan. С учетом того,что при full scan нужно прочитать каждую запись,а по индексу мы записи читать будем,если к нас доп.условия или уже в процессе получения и выдачи результата. |
|||
35
H A D G E H O G s
04.05.22
✎
18:25
|
(34) "index scan лучше,чем full scan.
С учетом того,что при full scan нужно прочитать каждую запись,а по индексу мы записи читать будем,если к нас доп.условия или уже в процессе получения и выдачи результата." Настало время интересных историй. |
|||
36
Timon1405
04.05.22
✎
18:31
|
(34) галка основной отбор, позволяющая делать отбор по этому измерению
делать отбор где? |
|||
37
H A D G E H O G s
04.05.22
✎
18:45
|
(36) При обмене в планах обмена. Но к делу это мало относится. Просто надо знать, что будет еще один отдельный индекс по измерениям, которые указаны этими галками, если только этот индекс не совпадает по полям с уже существующими.
|
|||
38
Fragster
гуру
04.05.22
✎
18:49
|
(37) вроде не только
|
|||
39
H A D G E H O G s
04.05.22
✎
18:58
|
||||
40
ДедМорроз
04.05.22
✎
19:06
|
Еще в независимом регистре,включающая отбор по измерениям.
|
|||
41
H A D G E H O G s
04.05.22
✎
19:09
|
(40) А еще и больше нет других регистров и их типов, в которых есть "основной отбор"
Живу в России я, а жил в Союзе я -- А это все была иллю-зи-я. На самом деле весь мир нам кажется, Вокруг нас матрица, как в фильме "Матрица". |
|||
42
ДедМорроз
04.05.22
✎
20:02
|
(41)естественно,что нету,так как все остальные подчинены решистратору,и если не рассматривать регистр сведений,то все остальные регистры используют решистратор и номер записи как первичный ключ.
|
|||
43
rsv
04.05.22
✎
20:08
|
(0) когда устанете , в свойствах конфы поставте
Режим блокировок автомат , все последовательно начнут. |
|||
44
ДедМорроз
04.05.22
✎
20:12
|
(43) вот не надо.
Блокировки начнут работать на уровне sql,и очень большая вероятность столкновений будет. А так,две транзакции,не затронувшие общие ресурсы вполне себе параллельно выполняться будут. |
|||
45
Dmitry1c
04.05.22
✎
20:52
|
(43) для однопользовательской работы покатит
|
|||
46
ДедМорроз
04.05.22
✎
21:05
|
(45)для однопользовательской и управляемый режим годится - блокировки-то можно не ставить вообще.
|
|||
47
Dmitry1c
05.05.22
✎
08:13
|
https://its.1c.ru/db/metod8dev#content:5842:hdoc
Основные индексы, создаваемые 1С:Предприятием: индекс по уникальному идентификатору (ссылке) для всех объектных сущностей (справочники, документы и т.д.); индекс по регистратору (ссылке на документ) для таблиц движений регистров, подчиненных регистратору; индекс периоду и значениям всех измерений для __итоговых таблиц__ регистров накопления; индекс периоду, счету и значениям всех измерений для итоговых таблиц регистров бухгалтерии. Вот ответ, зачем индексируется первое измерение "Организация" в регистрах накопления. Для взаимодействия с физическими таблицами, а не виртуальными. Там нет индекса, а он нужен. |
|||
48
Dmitry1c
05.05.22
✎
09:59
|
Можно еще вопрос. В ЕРП есть следующий программный код в модуле менеджера документа "Этап производства"
Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("Документ.ЭтапПроизводства2_2"); ЭлементБлокировки.УстановитьЗначение("Ссылка", Выборка.Ссылка); Блокировка.Заблокировать(); ДокументОбъект = Выборка.Ссылка.ПолучитьОбъект(); Если ДокументОбъект = Неопределено ИЛИ ДокументОбъект.Статус <> СтатусСформирован Тогда ВызватьИсключение НСтр("ru = 'Обрабатываемый объект не соответствует условиям отбора.'; |en = 'Processed object does not match filter conditions.'"); КонецЕсли; ДокументОбъект.Статус = Перечисления.СтатусыЭтаповПроизводства2_2.КВыполнению; ДокументОбъект.УстановитьРежимПакетнойПередачиКВыполнению(); ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение); ЗафиксироватьТранзакцию(); зачем здесь блокировка? |
|||
49
Dmitry1c
05.05.22
✎
10:01
|
(48) сам задал, сам отвечу: пока мы манипулируем с объектом, чтобы другой с ним также не "проманипулировал" ...
несмотря на то, что это три безобидные и мгновенные строчки кода |
|||
50
Dmitry1c
05.05.22
✎
10:06
|
&НаСервере
Функция ОбновитьЦелевыеПараметрыНаправления(ЦелевыеПараметры) ДанныеСохранены = Истина; НачатьТранзакцию(); Попытка БлокировкаДанных = Новый БлокировкаДанных; ЭлементБлокировкиДанных = БлокировкаДанных.Добавить("Справочник.НаправленияДеятельности"); ЭлементБлокировкиДанных.УстановитьЗначение("Ссылка", НаправлениеДеятельности); ЭлементБлокировкиДанных.Режим = РежимБлокировкиДанных.Исключительный; БлокировкаДанных.Заблокировать(); НаправлениеОбъект = НаправлениеДеятельности.ПолучитьОбъект(); ЗаполнитьЗначенияСвойств(НаправлениеОбъект, ЦелевыеПараметры); НаправлениеОбъект.Записать(); ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); ДанныеСохранены = Ложь; ОбщегоНазначенияКлиентСервер.СообщитьПользователю( НСтр("ru = 'Для направления деятельности не удалось сохранить новые целевые значения.'; |en = 'Cannot save new target values for line of business.'"), , "Контракт"); КонецПопытки; Возврат ДанныеСохранены; КонецФункции вот тут тоже самое: но непонятно, когда надо блокировку ставить, а когда не надо? мы же частенько через ПолучитьОбъект() меняем объекты, что теперь, каждый раз блокировку управляемую хреначить и транзакцию явно открывать? |
|||
51
ptiz
05.05.22
✎
10:25
|
(50) Может там ПриЗаписи еще другие объекты меняются? Чтоб уж гарантированно "кашу" не получить.
|
|||
52
Dmitry1c
05.05.22
✎
10:26
|
(51) вот хотелось бы понять, откуда ваще это появилось ... ибо я не понимаю
|
|||
53
ptiz
05.05.22
✎
10:28
|
(52) Хотя один фиг это в одной транзакции происходит. Возможно, планировали и другие объекты менять в этой процедуры.
|
|||
54
lodger
05.05.22
✎
10:34
|
(52) так в самой первой статье про Управляемые Блокировки же написано
... Явная управляемая блокировка должна устанавливаться перед чтением данных: - если считываются данные, которые в дальнейшем должны быть изменены; ... https://its.1c.ru/db/v8std/content/460/hdoc |
|||
55
rozer76
05.05.22
✎
10:34
|
||||
56
rozer76
05.05.22
✎
10:36
|
+ (55) без этого есть риск словить дедлок
|
|||
57
Dmitry1c
05.05.22
✎
10:56
|
(54) (55) спасибо, погляжу сейчас.
|
|||
58
H A D G E H O G s
05.05.22
✎
10:58
|
(47) welcome to the club body!
https://youtu.be/yrHXMhrs6Qg |
|||
59
Dmitry1c
05.05.22
✎
11:01
|
(54) т.е. это по сути все равно что каждый раз, когда программист пишет Объект = ОбъектныйТип.ПолучитьОбъект(); с целью дальнейшей записи объекта необходимо открывать явную транзакцию и создавать управляемую блокировку?
|
|||
60
Dmitry1c
05.05.22
✎
11:29
|
Кажется я еще понял одну причину, по которой следует использовать ОбщегоНазначения.ЗначенияРеквизитовОбъекта - в данном случае не требуется, согласно стандартам, накладывать управляемую блокировку, т.к. чтение происходит не в объектной модели, а запросом.
|
|||
61
lodger
05.05.22
✎
11:40
|
(59) (60) ну если следовать простой формальной логике и простой оптимизации, то метод ПолучитьОбъект() нужен ТОЛЬКО для того чтобы записать его в дальнейшем.
а значит, все места с методом ПолучитьОбъект() надо оформить в управляемую блокировку. если нужны данные объекта, пускай даже все - получите запросом. |
|||
62
Dmitry1c
05.05.22
✎
11:41
|
(61) просто я всегда ранее использовал ПолучитьОбъект() - в целях обработки данных - и никогда не использовал упр. блокировок
|
|||
63
lodger
05.05.22
✎
12:24
|
(62) если не нужно его записывать и лень разбираться в запросах, то можно через точку ковыряться в реквизитах - эффект тот же.
|
|||
64
Dmitry1c
05.05.22
✎
13:04
|
(63) через точку у тебя объект прочитается вместе с таб. частями, даже если данные табличных частей тебе не нужны
|
|||
65
lodger
05.05.22
✎
14:15
|
(64) через ПолучитьОбъект, как в (62) будто ТЧ не прочитаются?
|
|||
66
Dmitry1c
13.05.22
✎
22:54
|
Про индексы вопросы остались
1. для регистра сведений 1С создает "составной индекс" - что сие есть? просто соединяет колонки, входящие в индекс? например, индекс состоит из Период|Измерение1СсылочныйТип|Измерение2СсылочныйТип сам индекс физически будет содержать значения вида "ПериодГуид1Гуид2" или как-то по-другому? 2. можно ли средствами 1С создать т.н. покрывающий индекс? |
|||
67
H A D G E H O G s
13.05.22
✎
22:58
|
(66)
1. Да 2. Можно для всех других порядков измерений. |
|||
68
H A D G E H O G s
13.05.22
✎
23:00
|
Проиндексируй
Измерение2СсылочныйТип и 1С создаст тебе некластерный индекс "ПериодГуид2Гуид1" который будет покрывающим |
|||
69
Dmitry1c
14.05.22
✎
09:12
|
(68) прошу прощения, но ты различаешь покрывающий индекс и составной индекс?
составной индекс, это индекс, создаваемый конструкцией к SQL вида SELECT OrderID, OrderDate FROM Sales WHERE OrderID = 12345; покрывающий индекс, это индекс, который создается конструкцией SQL вида CREATE NONCLUSTERED INDEX ix_orderid ON dbo.Sales(OrderID) INCLUDE (OrderDate); Т.е. в первом случае КАК Я СЕЙЧАС ПОНИМАЮ идет конкатенация полей (?верно), а во втором случае - конкатенация составной части индекса и добавление отдельных столбцов С ДАННЫМИ для того, чтобы индекс стал покрывающим |
|||
70
Dmitry1c
14.05.22
✎
09:13
|
(69) просто в курсах от 1с и от курсы-по-1с.рф я описание этих различий о составном и о покрывающем индексе НЕ встретил
|
|||
71
Dmitry1c
14.05.22
✎
09:22
|
(69) первый пример запроса некорректный, там должно быть что-то вроде
CREATE NONCLUSTERED INDEX ix_orderid ON dbo.Sales(OrderID, OrderDate) |
|||
72
Dmitry1c
14.05.22
✎
09:25
|
У 1С почему-то "покрывающим" индексом называется такой индекс, который является составным и просто "покрывает"-содержит- все поля, которые будут в условии запроса по этому индексу
мне кажется опять что-то где-то 1Сники напортачили |
|||
73
Dmitry1c
14.05.22
✎
10:54
|
Вот в итоге ключевой вопрос философии индексов 1С
Если проиндексировать поле "Реквизит1" у простого справочника, то он создаст индекс а) Конструкцией вида CREATE NONCLUSTERED INDEX ИмяИндекса ON dbo.Sales(Реквизит1, Ссылка) б) Конструкцией вида CREATE NONCLUSTERED INDEX ИмяИндекса ON dbo.Sales(Реквизит1) INCLUDE (Ссылка); |
|||
74
Dmitry1c
14.05.22
✎
11:02
|
Короче куплю сегодня лицензию на сервер 1С... для разработчка которая, посмотрю и отпишусь
|
|||
75
ДедМорроз
14.05.22
✎
12:14
|
Когда индекс не кластерный,то есть вторичный,то он создает соответствие индексировпнных полей класткрному индексу,то есть первичносу ключу,так как другой ссылки на записи в базе нет.
Если бы в базе был некластерный первичный индекс,а записи располагались в порядке добавления,то разница бы была. А так,по идее,две конструкции дадут одно и то же на выходе. |
|||
76
ДедМорроз
14.05.22
✎
12:19
|
А блокировку ставят,чтобы избежать ошибки параллельного выполнения.
Если два потока (на сервере) будут одеовременно изменять один и тот же документ,то прочитают до изменения они одно и то же,а вот при записи будет проверка версии - первый запишет,а второй получит ошибку различия версии объекта. |
|||
77
Dmitry1c
14.05.22
✎
13:33
|
Вот индекс в MS SQL включая Include-поля
https://i0.wp.com/www.malinga.me/wp-content/uploads/2020/07/physical-design-example-non-clustered-index-with-includes-3.png?resize=1024%2C993&ssl=1 создает ли 1С include-поля ? |
|||
78
ДедМорроз
14.05.22
✎
13:52
|
Там где индексировать с доп.упорядочиваниеи,вполне вероятно,что используются включаемые поля по полям упорядочивания.
В остальных случаях явно нет. |
|||
79
ДедМорроз
14.05.22
✎
14:09
|
https://use-the-index-luke.com/blog/2019-04/include-columns-in-btree-indexes
Здесь можно почитать,как индекс с включаемыми полями работает. И понять,что раз Oracle его не умеет,то 1с его использовать не будет из-за кросплатформенной совместимости,хотя postgresql его умеет без проблем с 11-той версии. |
|||
80
Dmitry1c
14.05.22
✎
14:10
|
(79) т.е. в платформе 1С покрывающие индексы при работе не создаются
а то что 1С называет покрывающим индексом, это просто составной индекс ? |
|||
81
ДедМорроз
14.05.22
✎
14:52
|
В 1с есть промежуточный уровень sdbl,который абстрагирован от способностей конкретного sql-сервера,а уже после все действия преобразуются в команды для конкретного sql-сервера.
Можно получить структуру хранения для всей базы и посмотреть,что она из себя представляет и понять,что в ней нет места include. |
|||
82
ДедМорроз
14.05.22
✎
15:01
|
Вообще,в терминах sql покрывающий индекс рассматривается для конкретного запроса - это индекс,позволяющий выполнить этот запрос.
Разница в том,что при определении включаемых полей есть разница между покрывающим индексом и композитным (который тоже покрывпющий,но содержит все необходимые поля в структуре индексирования). Соответственно,1с будет называть покрывающим конпозитный индекс. Еще следует отметить,что все верно доя баз данных,использующих кластерный индекс для первичного ключа,так как в дополнительных индексах хранится значение первичного ключа по которому нужно искать запись. В базах,где нет кластерного индекса,в индексе хранится ссылка на запись,и ее поиск так много времени не занимает,поэтому там нет смысла в дополнительных полях в индексе. |
|||
83
ДедМорроз
14.05.22
✎
15:06
|
Например, ibm db требует явно указать,что для таблицы применяется кластерный индекс по первичному ключу,соответственно,если этого не сказано,то механизм индексирования будет работать по-другому.
Но,насколько я понимаю,1с требует кластерный индекс для своих таблиц. |
|||
84
Dmitry1c
14.05.22
✎
15:45
|
(73) проверил
создает индекс, включая в ключ индекса поле "Ссылка" |
|||
85
Dmitry1c
14.05.22
✎
15:46
|
А нельзя через Management Studio посмотреть содержимое листьев индекса в виде таблицы?
|
|||
86
Dmitry1c
14.05.22
✎
15:49
|
Получается платформа 1С лишает возможности использовать механизм включения столбцов основной таблицы в индексы
Очень жаль, поидее хороший с точки зрения производительности механизм |
|||
87
Dmitry1c
14.05.22
✎
16:00
|
Чет я не догоняю
Если у нас справочник и мы ведем поиск по неиндексированному реквизиту, у нас всегда будет CLUSTERED INDEX SCAN? мы TABLE SCAN никогда не увидим, потому что существует кластерный индекс для этой таблицы ? |
|||
88
ДедМорроз
14.05.22
✎
16:10
|
Кластерный индекс - это и есть сама таблица.
Table scan - это если для таблицы нет кластерного индекса. Например,если в таблице вообще нет первичного ключа. |
|||
89
H A D G E H O G s
14.05.22
✎
17:57
|
(86) Мелочи, в сравнении с отсутствием сделать составной индекс для нескольких полей объектного типа. Приходится извращаться с отдельными регистрами поиска
|
|||
90
ptiz
14.05.22
✎
18:14
|
(89) "извращаться с отдельными регистрами поиска" - это как? Можно пример?
|
|||
91
H A D G E H O G s
14.05.22
✎
18:30
|
(90) Не уверен, что смогу объяснить, но вот запрос к регистру АСФКлючиПоискаДиапазоновМарок, в которые вынесены поля НачалоПолногоДиапазона, КонецПолногоДиапазона из справочника ДиапазоныМарок.
Да, только в 2 из 3 случаев будет использован индекс полностью, без остаточного предиката, но и то хлеб. "ВЫБРАТЬ | ТаблицаДиапазонов.НачалоДиапазона КАК НачалоДиапазона, | ТаблицаДиапазонов.КонецДиапазона КАК КонецДиапазона, | ТаблицаДиапазонов.ИдентификаторСтроки КАК ИдентификаторСтроки, | ТаблицаДиапазонов.СостояниеМарок КАК СостояниеМарок |ПОМЕСТИТЬ ТаблицаДиапазонов |ИЗ | &ТаблицаДиапазонов КАК ТаблицаДиапазонов |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ РАЗЛИЧНЫЕ | Диапазоны.Диапазон КАК Диапазон, | Диапазоны.НачалоПолногоДиапазона КАК НачалоДиапазона, | Диапазоны.КонецПолногоДиапазона КАК КонецДиапазона, | ТаблицаДиапазонов.НачалоДиапазона КАК НачалоДиапазонаПоиска, | ТаблицаДиапазонов.КонецДиапазона КАК КонецДиапазонаПоиска, | ТаблицаДиапазонов.ИдентификаторСтроки КАК ИдентификаторСтроки, | ТаблицаДиапазонов.СостояниеМарок КАК СостояниеМарок |ПОМЕСТИТЬ ПромежуточныеДиапазоны |ИЗ | РегистрСведений.АСФКлючиПоискаДиапазоновМарок КАК Диапазоны | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаДиапазонов КАК ТаблицаДиапазонов | ПО Диапазоны.НачалоПолногоДиапазона <= ТаблицаДиапазонов.НачалоДиапазона | И Диапазоны.КонецПолногоДиапазона > ТаблицаДиапазонов.НачалоДиапазона | |ОБЪЕДИНИТЬ | |ВЫБРАТЬ | Диапазоны.Диапазон, | Диапазоны.НачалоПолногоДиапазона, | Диапазоны.КонецПолногоДиапазона, | ТаблицаДиапазонов.НачалоДиапазона, | ТаблицаДиапазонов.КонецДиапазона, | ТаблицаДиапазонов.ИдентификаторСтроки, | ТаблицаДиапазонов.СостояниеМарок |ИЗ | РегистрСведений.АСФКлючиПоискаДиапазоновМарок КАК Диапазоны | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаДиапазонов КАК ТаблицаДиапазонов | ПО Диапазоны.НачалоПолногоДиапазона < ТаблицаДиапазонов.КонецДиапазона | И Диапазоны.КонецПолногоДиапазона >= ТаблицаДиапазонов.КонецДиапазона | |ОБЪЕДИНИТЬ | |ВЫБРАТЬ | Диапазоны.Диапазон, | Диапазоны.НачалоПолногоДиапазона, | Диапазоны.КонецПолногоДиапазона, | ТаблицаДиапазонов.НачалоДиапазона, | ТаблицаДиапазонов.КонецДиапазона, | ТаблицаДиапазонов.ИдентификаторСтроки, | ТаблицаДиапазонов.СостояниеМарок |ИЗ | РегистрСведений.АСФКлючиПоискаДиапазоновМарок КАК Диапазоны | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаДиапазонов КАК ТаблицаДиапазонов | ПО Диапазоны.КонецПолногоДиапазона < ТаблицаДиапазонов.КонецДиапазона | И Диапазоны.НачалоПолногоДиапазона > ТаблицаДиапазонов.НачалоДиапазона |; |
|||
92
ДедМорроз
14.05.22
✎
18:51
|
Ваши марки хрень полная.
Хэш-индекс нужно использовать,который ms5 и в guid его родимый. Ну и на случай совпадения проверять само значение,и никаких проблем с префиксами и прочим мусором не будет. По крайней мере,абзацы текста переменной длины по хэш-индексу искались на ура,а длина у них поболее будет,чем марки. |
|||
93
H A D G E H O G s
14.05.22
✎
18:52
|
(92) Ваше мнение очень важно для нас.
|
|||
94
ДедМорроз
14.05.22
✎
20:29
|
Ладно,не хотел вас ни чем обидеть.
Просто,в некоторых случаях хэш дает такой прирост в скорости,что потом кажется,что можно внзде использовать. С марками же - порядок не важен,основная последовптельность (исключая криптохвост)уникальна и важно только совпадение. Да,конечно,может потребоваться найти марку,похожую на другую в пределах какого-то числа символов,но это,в общем случае,без полного сканирования таблицы невозможно,так как обычный индекс тут ни чем не поможет. |
|||
95
ДедМорроз
14.05.22
✎
20:32
|
Задачп поиска килобайта с одним-двумя изменениями требует использования кодов рида-соломона и прогулки по ближайшим в пространстве этих кодов.
|
|||
96
H A D G E H O G s
14.05.22
✎
20:40
|
(94) (95) Ага. Все верно. Проблема только в том, что в (91) - не марки.
|
|||
97
ДедМорроз
14.05.22
✎
21:56
|
Ну там интервалы.
С интервалами интереснее. Тут одним индексом не обойдешься,так как нужно и по началу (и возможно с концом) и по концу,или переводить интервалы в неперекрывающиеся,тогда можно начало и конец положить в один индекс и все находить сканированием индекса. |
|||
98
Dmitry1c
15.05.22
✎
10:13
|
Вот еще вопрос достойный 1С Экспертов
Каким образом происходит индексирование в соответствии, если в соответствии ключом является составной тип данных ? |
|||
99
Dmitry1c
15.05.22
✎
10:15
|
(98) ну, не составной конечно, не обязательно.
|
|||
100
H A D G E H O G s
15.05.22
✎
10:40
|
(98) в соответствие пихается
Хэшключа Ключ Значение Ищется, естественно по хэшу |
|||
101
rphosts
15.05.22
✎
10:55
|
(100) откуда инфа? Снифером снял или утечка из конторы?
|
|||
102
H A D G E H O G s
15.05.22
✎
10:59
|
(101) я бы сделал так.
|
|||
103
Dmitry1c
15.05.22
✎
11:09
|
(100)
блин, круто. Вообще аналог в ЯВУ соответствия - это HashMap поэтому очевидно предположить, что ключ соответствия хэшируется и индекс создается уже по хэшам, а не по самому значению ключа. ну я это так думаю, тут уже надо у разрабов платформы спрашивать |
|||
104
rphosts
15.05.22
✎
11:13
|
(102) ну это почти очевидно, но порой в конторе делают несколько не так как все от них ждут
|
|||
105
Dmitry1c
15.05.22
✎
11:14
|
а у объекта ТаблицаЗначений создаются какие-нибудь индексы ?
|
|||
106
rphosts
15.05.22
✎
11:14
|
(103) даже для длинного хэша значения хэша могут совпадать для разных исходных значений хэш-функции.
|
|||
107
Dmitry1c
15.05.22
✎
11:15
|
Опа
ТЗ.Индексы.Добавить("Колонка1"); я и не знал о таком ... |
|||
108
rphosts
15.05.22
✎
11:15
|
(105) продам СП... дорого....
|
|||
109
rphosts
15.05.22
✎
11:15
|
(107) эх, уже не продать...
|
|||
110
Dmitry1c
15.05.22
✎
11:16
|
спустя 10 лет работы узнать что таблицу значений можно проиндексировать :) нормально так
|
|||
111
xXeNoNx
15.05.22
✎
11:42
|
(0) сдается мне я знаю в какую контору ты пришел и зачем тебе kvm.
|
|||
112
H A D G E H O G s
15.05.22
✎
11:44
|
(111) Сдается мне, я знаю, какой веткой ты ошибся..
|
|||
113
xXeNoNx
15.05.22
✎
11:45
|
(112) нет, если бы не эта ветка, я бы этого не понял.
|
|||
114
ptiz
15.05.22
✎
12:32
|
(91) Я понял так:
- есть огромный список документов/справочник - создаем РС, в который ПриЗаписи каждого документа пишутся поля (измерения), которые используются для поиска в тяжелых запросах - в этих тяжелых запросах для быстрого поиска лезем в РС (а его поля индексированы в нужном нам порядке) и быстро находим Ссылку на документ Тут, видимо, аналогично, только уже не надо лезть в таблицу самого документа/справочника, т.к. все данные уже в АСФКлючиПоискаДиапазоновМарок. |
|||
115
H A D G E H O G s
15.05.22
✎
12:43
|
(114) Да
|
|||
116
ДедМорроз
15.05.22
✎
12:46
|
При желании,индекс можно создать и по самим значениям,точнее,для объектов,сначпла по типу,а потом по адресу,ничуть не медленнее будет,но будет двухуровневый индекс,а в случае хэша - одноуровневый.
|
|||
117
H A D G E H O G s
15.05.22
✎
12:49
|
(116) Ну давай, расскажи нам.
|
|||
118
Dmitry1c
15.05.22
✎
14:22
|
(116) ?! это как
|
|||
119
ДедМорроз
15.05.22
✎
14:38
|
И что тут такого сложного?
Для типов есть rtti А что такое объект в памяти? Это адрес,где размещаются какие-то данные объекта,и этого достаточно для того,чтобы различать объекты. Правда,чтобы не спутать два интерыейса одного объекта,обычно,договариваются,по какому или по каким интерыейсам идентифицировать объект. Собственно говоря,хэш-то тоже от этого значения будет строится. Можно,конечно,сериализовать объект и построить хэш от его данных,но тут можно получить что два документа й1с полученные из одной ссылки,будут одинаковыми,пока в них не запишут разные значения. Опять же,не зря 1с придумала термин МутабельныйОбъект. |
|||
120
H A D G E H O G s
15.05.22
✎
17:04
|
(119) Ты втираешь какую-то дичь
|
|||
121
ДедМорроз
15.05.22
✎
17:22
|
Какая дичь?
Это основы программирования на Си. Как в Си можно сравнить два объекта? Только сравнить ссылки. Ну и ничего не мешает упорядочить объекты по адресу в памятм и так их искать - все остальные методы тркбуют хоть что-то знать о внутренностях объекта. Да,наверное,людям,которые не программировпли на ассемблере,сложно понять,что есть объекты и что есть данные. |
|||
122
Dmitry1c
16.05.22
✎
08:09
|
Вот еще прикол.
У меня есть самописная учетная система для личных финансов. Закинул ее на клиент-серверный режим. В итоге замером профайлера при проведении документа увидел: SET TRANSACTION ISOLATION LEVEL READ COMMITTED BEGIN TRANSACTION А где SNAPSHOT ? |
|||
123
Dmitry1c
16.05.22
✎
15:12
|
https://infostart.ru/1c/articles/936914/
вот здесь вот, кстати, в разделе >>Можно ли сделать покрывающий индекс нашелся ответ на ранее поставленный мной вопрос про INCLUDE и некорректность термина "покрывающий индекс" у 1С |
|||
124
Dmitry1c
16.05.22
✎
17:00
|
Еще прикол из-за разделителя ОбластьДанныхОсновныеДанные:
сделал запрос по индексированному измерению регистра сведений, и не по индексированному измерению регистра сведений в обоих случаях получаю Clustered Index Seek в визуализации плана запроса, пушо первым полем индекса идет разделитель ... хотя во втором случае явно происходит сканирование таблицы что помогает - надпись Missing Index (Impact 94) ... |
|||
125
H A D G E H O G s
16.05.22
✎
18:06
|
(124) Ничего не понял, но очень интересно.
|
|||
126
Dmitry1c
16.05.22
✎
18:08
|
(125) из-за разделителя областей данных не очевидно, что Clustered Index Seek на самом деле является Scan'ом
т.к. на уровне корня индекса первым столбцом идет разделитель области данных, который предназначен для работы в модели сервиса а потом идет сканирование всего индекса но план запроса отображает как будто идет SEEK, хотя от SEEK по факту там нулевой разделитель области данных |
|||
127
H A D G E H O G s
16.05.22
✎
18:12
|
(126) Да, есть такое.
|
|||
128
H A D G E H O G s
16.05.22
✎
18:13
|
(126) Но ты молодец, редко такое упорство встретишь.
|
|||
129
Merkalov
17.05.22
✎
02:27
|
Вопрос по объеду "БлокироваДанных".
В СП и на its написано что в качестве источника данных может выступать НаборЗаписей, но не может. "Ошибка при установке значения атрибута контекста (ИсточникДанных) по причине: Несоответствие типов" Прошелся поиском в типовых конфигурациях - БП и УТ, не нашел использований набора записей в качестве источника. Меня что, обманули? |
|||
130
lodger
17.05.22
✎
10:35
|
(129) НЗ у тебя от РС? подчинен регистратору?
|
|||
131
Merkalov
18.05.22
✎
03:05
|
(130) Попробовал на РС с регистратором - та же ошибка.
|
|||
132
lodger
18.05.22
✎
09:32
|
(131) слушай, а куда ты там собрался набор записей совать?
есть такой синтаксис: Бл=Новый БлокировкаДанных; Эл=Бл.Добавить("РегистрСведений.ЦеныНоменклатуры.НаборЗаписей"); Эл.Режим=РежимБлокировкиДанных.Исключительный; Эл.УстановитьЗначение("Регистратор",Ссылка); Бл.Заблокировать(); а ты со своим НЗ прочитанным из базы наверное хочешь его же и заблочить? так вот нет. в ИсточникДанных можно сунуть только РезультатЗапроса, Табличная часть, ТаблицаЗначений. |
|||
133
Merkalov
18.05.22
✎
10:52
|
(132)
https://its.1c.ru/db/metod8dev/content/5839/hdoc >В качестве источника данных можно указывать результат запроса, табличную часть, набор записей или таблицу значений. А мне сказали, что всунуть можно и сам набор записей.. "на заборе тоже написано" |
|||
134
lodger
18.05.22
✎
11:01
|
(133) забавно. в СП одно, и исполняемый код ему вторит, а в доке другое.
https://its.1c.ru/db/v8320doc#bookmark:dev:TI000000535 |
|||
135
lodger
18.05.22
✎
11:02
|
может уровень совместимости надо снять?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |