Имя: Пароль:
1C
1С v8
Индексы 1С + MS SQL Server
0 jamesgold
 
08.08.16
18:26
Добрый день, прошу помочь!

Имеем в 1с запрос поля в котором покрываются определенным индексом на СУБД, но самое первое поле в индексе не используется в запросе, - получается что этот индекс оптимизатор запросов использовать не будет.
Помогите понять физическую причину почему так происходит? Буду рад любой полезной ссылке или грамотному комментарию.
1 b_ru
 
08.08.16
18:39
>>Помогите понять физическую причину почему так происходит?
Ну собственно для любого человека, который в принципе понимает что такое индекс это вроде как очевидно.
https://ru.wikipedia.org/wiki/Индекс_(базы_данных)#.D0.9F.D0.BE.D1.81.D0.BB.D0.B5.D0.B4.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8C.D0.BD.D0.BE.D1.81.D1.82.D1.8C_.D1.81.D1.82.D0.BE.D0.BB.D0.B1.D1.86.D0.BE.D0.B2_.D0.B2_.D1.81.D0.BE.D1.81.D1.82.D0.B0.D0.B2.D0.BD.D0.BE.D0.BC_.D0.B8.D0.BD.D0.B4.D0.B5.D0.BA.D1.81.D0.B5

Для понимания процессов, происходящих под капотом движка БД можно погуглить про хеш-функции и B-деревья и попробовать в познавательных целях реализовать эти библиотечные алгоритмы самому. В конце концов все получившие профильное образование это в свое время проделывали на лабах.
2 H A D G E H O G s
 
08.08.16
18:40
(0) Алгоритм не знает, куда идти по B+ дереву.
Если в условие поиска заданы все индексные поля - алгоритм пройдет по всему B+ дереву, если не все - по части B+ Дерева, а затем по данным.
https://ru.wikipedia.org/wiki/B-дерево#.D0.9F.D0.BE.D0.B8.D1.81.D0.BA
3 H A D G E H O G s
 
08.08.16
18:42
Вершина B+ дерева - это точка начала поиска, это приблизительная середина всех УПОРЯДОЧЕННЫХ значений индекса. Середина не по значению, а по количеству элементов.
4 jamesgold
 
08.08.16
18:48
(1) Значит ли это что каждый уровень дерева это таже последовательность к примеру измерений в регистре? Т.е. верхний уровень дерева индекса это Измерение1?
5 H A D G E H O G s
 
08.08.16
18:49
(4) нет.
6 jamesgold
 
08.08.16
18:54
Получается что вершина дерева это начальные значения оглавления без которого поиск в этом индексе для данной СУБД невозможен, так?
7 H A D G E H O G s
 
08.08.16
18:55
Берется весь РС, создается табличка (в "памяти") с двумя колонками
ИЗМ1+ИЗМ2, где ИЗМ1+ИЗМ2 - байтовое поле, тупо сложение обоих измерений как наборов байт и RID, где RID - ссылка на строку данных
Табличка сортируется по возрастанию, делится на 2 части и серединка формирует вершину дерева поиска, рядом записывается ее RID. Левая и правая часть списка формирует левую и правую ветвь дерева, и.т.д.
8 H A D G E H O G s
 
08.08.16
18:56
(6) Можно сказать и так.
9 jamesgold
 
08.08.16
18:58
(7) Очень интересно!
10 jamesgold
 
08.08.16
19:02
(7) Зачем складываются измерения? Ссылка формируется на конкретные значения в таблице данных?
11 H A D G E H O G s
 
08.08.16
19:05
(9) Представь индекс, как УПОРЯДОЧЕННОЕ оглавление книги, к примеру

Овощи-Заморозка  -11 стр
Овощи-Сбор- 12 стр
Овощи-Сушка - 13 стр
Фрукты-Сбор - 24 стр.
Фрукты-Хранение - 24 стр.

И список в 2000 действий.
И ты ищешь:
1) Овощи-Сбор
2) Просто Сбор

Для 1 варианта, ты найдешь примерно серединку и где - то тут рядом, будут Овощи и недалеко Сбор :-). И узнаешь номер страницы.
Для 2 варианта - ты с листочком пойдешь по списку.
12 Йохохо
 
08.08.16
19:07
(0) что такое "индекс 1с покрывает все поля в запросе"? в 1с такой индекс всего 1 и каатся вопрос в (0) не очень сформулирован
13 H A D G E H O G s
 
08.08.16
19:08
(10) Не понял вопроса. Измерения складываются, чтобы сформировать значение индекса. Побайтово - для отхода от строк, дат, чисел, и.т.д.
14 jamesgold
 
08.08.16
19:13
(13) Как я сначала понял измерения складываются для того чтобы потом упорядочить по получившемуся значению  и сформировать ссылку на конкретные данные уже в той таблице для которой индекс строился, если индекс не кластерный.
15 H A D G E H O G s
 
08.08.16
19:18
(14) Ссылка на данные - RID - уже есть. Измерения складываются (измерения - это пример, вместо измерения лучше сказать - поля индекса), чтобы по ним искать RID.
16 jamesgold
 
08.08.16
19:24
H A D G E H O G огромное тебе спасибо! Я кажется понял! Выражаю тебе огромную благодарность от меня и от тех кому данная тема поможет в будущем. Спасибо!
17 H A D G E H O G s
 
08.08.16
19:29
18 Провинциальный 1сник
 
08.08.16
19:40
А в фокспро, помнится, можно было индекс создать не только по полю или комбинации полей, но и по любому выражению над ними)
19 Optan
 
08.08.16
19:52
(18) Было дело) А еще там можно было создавать и переключать "на лету" тэги индекса (разные индексы(индексные выражения) для одной таблицы). Для относительно небольших СУБД до сих пор бывает использую...хотя поддержку и прекратили(
20 H A D G E H O G s
 
08.08.16
20:00
кхе-кхе-кхе
21 vde69
 
08.08.16
20:43
вообще-то индексы они разные бывают, все что описал H A D G E H O G s справедливо только для составных индексов...

но вот на сколько 1с использует несоставные индексы - это второй вопрос...

хотя в целом тут все правильно писали :)
22 vde69
 
08.08.16
20:47
(21) +

например галочка "индексировать" на измерении регистра создает отдельный индекс, и в этом случае оптимизатор вполне может его использовать даже при одном самом среднем отборе...
23 Jija Grenkov
 
08.08.16
20:57
(22) В 1с в общем случае все индексы составные. Индексирвоать на регистре сделает составной индекс на первое место выставив индексируемый реквизит. И index seek будет, если явно запрашивать это поле. Если запрашиваемое поле на 2-м месте, то уже будет index scan.
24 jamesgold
 
09.08.16
11:24
(5) Значит ли это что каждый уровень дерева это таже последовательность к примеру измерений в регистре? Т.е. верхний уровень дерева индекса это Измерение1?

Вот нашел такую статью где написано обратное:
структура индекса в СУБД представляет собой дерево значений проиндексированных полей. На первом уровне дерева находятся значения первого поля индекса, на втором – второго и так далее. Чтобы выполнить поиск данных по индексу, сначала необходимо провести поиск по значению первого поля индекса, затем – второго и так далее. Если, например, условие по первому полю индекса не указано, то индекс уже не сможет обеспечить быстрый поиск. Если указано условие по нескольким первым полям индекса, а затем одно или несколько полей индекса не задано, то индекс может быть использован.
25 jamesgold
 
09.08.16
11:26
Получается что вершина дерева это первое измерение
26 H A D G E H O G s
 
09.08.16
11:40
(24) задача решается просто.

Спроектируйте алгоритм индекса сами.
27 jamesgold
 
09.08.16
11:50
(26) Хотелось обсудить это, возможно это описано тоже самое оглавление только другими словами
28 jamesgold
 
09.08.16
11:51
Ведь первое поле в индексе это и есть начало оглавления, - с него начинается индекс
29 jamesgold
 
09.08.16
14:37
up
30 SSSSS_AAAAA
 
09.08.16
14:55
(18) В общем-то, в фоксе индексы только по выражению и одно поле есть всего лишь частный случай выражения. И никаких индексов по нескольким полям.