Имя: Пароль:
1C
 
Субботний вопрос про индексы в СУБД
0 Dmitry1c
 
25.10.14
10:19
Ну вот есть древовидный индекс в базе

Вот мы нашли вхождение на первом уровне, вот на втором, на третьем и так дошли до конца индекса (B-дерева).

А как мы найдем запись в таблице, найдя конец этого самого В-дерева?
1 GANR
 
25.10.14
10:24
(0) Вопрос полегче: могут ли выполнять функцию индекса такие структуры как массивы и списки? (допустим БД висит в оперативной памяти целиком). Ответ обоснуйте.

Пусть людям будет пища для размышлений.
2 Dmitry1c
 
25.10.14
10:25
(1) таблицу значений в 1С можно проиндексировать)

вопрос в (0) - мне нужен на него ответ. я тут не устраиваю спец. олимпиаду
3 ifso
 
25.10.14
10:36
(0) чего в деревянном индексе ищешь?
4 DmitrO
 
25.10.14
10:43
(0)Листьями дерева как раз и являются записи.
5 Dmitry1c
 
25.10.14
10:55
(4) да, листьями.

Но запись надо еще найти. Где связь между этой иерархической структурой и таблицей СУБД?

У нас снова появляется поиск - дерево (найденный индекс) и таблица? WTF?
6 sda553
 
25.10.14
10:58
(5) Упрощенно:в листке дерва записано "Запись номер 324584357". Дальше движок в таблице запись быстро находит по порядковому номеру
7 Dmitry1c
 
25.10.14
11:03
(6) т.е. индекс для нескольких полей только создается, правильно?

Соответственно мы находим индекс (поиск по нескольким полям) и уже дальше по номеру записи прыгаем туда, куда надо?
8 sda553
 
25.10.14
11:04
(7) Да, как оглавление в книге
9 Dmitry1c
 
25.10.14
11:06
(8) спасибо, это то, что я хотел узнать
10 Dmitry1c
 
27.10.14
11:20
Чтобы не плодить темы, спрошу здесь.

Создал 2 измерения в регистре накопления, у обоих отметил галку "Индексировать".

Ожидал появление индекса, в поля которого войдут оба измерения, однако, этого не произошло - в СУБД (MS SQL) появилось 2 индекса.

Вопрос, а как же нам тогда создать индекс по обоим измерениям, допустим, я хочу искать сразу по складу и номенклатуре, или я чего-то не понимаю?
11 Looser-1c
 
27.10.14
11:21
(10) Никак.
1с не создаёт составные индексы по произвольным измерениям.
Руками сделай.
12 Dmitry1c
 
27.10.14
11:21
(11) WTF??? O_O
13 Looser-1c
 
27.10.14
11:21
(12) Чо? (с)
14 Dmitry1c
 
27.10.14
11:21
(11) а потом при реструктуризации снова их делать?
15 Looser-1c
 
27.10.14
11:22
(14) И чего? Сделай...
16 Dmitry1c
 
27.10.14
11:24
Составной индекс возможен только когда мы в запросе создаем временную таблицу и индексируем несколько полей?
17 Dmitry1c
 
27.10.14
11:30
(16) под составным я подразумеваю состоящим из пользовательских полей
18 H A D G E H O G s
 
27.10.14
11:34
(16) Да.
19 H A D G E H O G s
 
27.10.14
11:34
(16) Но этого делать не надо почти никогда.
20 Dmitry1c
 
27.10.14
11:35
(19) это в принципе понятно.

Заглянул в регистр накопления "ПартииТоваровНаСкладах" - там проиндексировано поле "Склад", но не проиндексировано поле "Номенклатура".

Они там что, измерением ошиблись, когда галку ставили, или это имеет какой-то смысл?
21 Dmitry1c
 
27.10.14
11:35
(20) УПП*
22 H A D G E H O G s
 
27.10.14
11:39
(20) А что не так?

Номенклатуру они отбирают сразу с Периодом, работает Кластерный индекс.
Склад они отбирают вместе с Номенклатурой - работает кластерный индекс, либо без Номенклатуры - работает индекс по Складу.
23 H A D G E H O G s
 
27.10.14
11:40
(20) Кстати, Перенеси Измерение "Организация" на самый верх, походу добавляли его в каком-то релизе, забили (забыли) про индексы.
24 Dmitry1c
 
27.10.14
11:42
(22) а откуда кластерный индекс знает, что поле "Номенклатура" будет в него включено?
25 Dmitry1c
 
27.10.14
11:43
(22) ну например в том же регистре "ПартииТоваровНаСкладахБухгалтерскийУчет" индексация наоборот - номенклатура проиндексирована, а склад нет.

Это зависит от дальнейшего использования регистра (написанных запросов, получающих из него данные)?
26 H A D G E H O G s
 
27.10.14
11:47
(24) В кластерный индекс таблицы остатков включен:
Период
Все измерения регистра
Разделитель
27 H A D G E H O G s
 
27.10.14
11:48
(25) Там первым идет Организация, из за этого (но я поспорю с этим решением).
28 H A D G E H O G s
 
27.10.14
11:48
(27) Поспорю потому, что очень мало случаев, когда нужно получить остатки по всем организациям.
29 Dmitry1c
 
27.10.14
11:49
(26) у меня в кластерном индексе нет измерений

http://i65.fastpic.ru/big/2014/1027/46/8480b9b1cebe6f57d0a7a01c5266e546.png
30 H A D G E H O G s
 
27.10.14
11:49
(28) При Партионном списании всегда стоит фильтр по Организации (а это главное).
31 H A D G E H O G s
 
27.10.14
11:49
(29) Это таблица движений
32 Dmitry1c
 
27.10.14
11:50
(31) Точно. Нашел! :)
33 Dmitry1c
 
27.10.14
11:51
(31) спасибо
34 Dmitry1c
 
09.11.14
12:33
-----Продолжаю вопросы-----

Вот смотрите, kb.1c.ru говорит, что у таблицы документа всегда есть кластерный индекс по Ссылке (GUID)

Вроде как GUID формируется - первые 8 байт это дата компьютера + что-то еще, вторые 8 байт - железо

Это что же получается. Если у меня есть некоторое количество документов, и я переведу дату компьютера назад и создам документ, то, согласно кластерному индексу по ссылке, мой документ будет не последним, а встанет где-то между всеми документами?

WTF?
35 Dmitry1c
 
09.11.14
12:34
(34) увы, попробовать сейчас на субд не могу, железяки подходящей нет (сижу за 8-летним ноутбуком)
36 etc
 
09.11.14
12:50
(34) у тебя положение документа на временной оси чем определяется? наверно не GUID-ом, верно?
37 Dmitry1c
 
09.11.14
12:51
http://forum.sources.ru/index.php?showtopic=101231

ух ты, я оказывается не один такой
38 Dmitry1c
 
09.11.14
12:52
(36) у нас есть таблица, по которой создан кластерный индекс. Согласно определению кластерного индекса, в этом случае физическая таблица сортируется по связанной с индексом колонке, в данном случае по ссылке (GUID).

В вопросе я конкретно про физическую таблицу
39 Reaper_1c
 
09.11.14
12:53
(38) На физическом уровне таблиц не существует. Уймись уже.
40 ДенисЧ
 
09.11.14
12:54
(39) Хренассе... О_о
41 Dmitry1c
 
09.11.14
12:54
(39) вот это поворот
42 etc
 
09.11.14
12:55
чет я про сортировку физ таблиц в замешательстве. Немного не так представляю себе хранение данных.
43 Dmitry1c
 
09.11.14
12:55
(42) я сейчас читаю главу 8, Вильямс - Программирование баз данных MS SQL 2005
44 etc
 
09.11.14
12:57
на физическом уровне там же страницы, смещение, не?
45 Dmitry1c
 
09.11.14
12:58
46 Dmitry1c
 
09.11.14
12:58
(44) я про физический уровень, на котором я вижу таблицу в MS SQL Management Studio
47 Reaper_1c
 
09.11.14
13:00
(44) там HoBT
(46) И что, ты сам что ли будешь записи искать? Искать их будет движок СУБД, и оперировать он будет не таблицами.
48 Dmitry1c
 
09.11.14
13:03
(47) вопрос в (34) и он до сих пор не разрешился
49 Reaper_1c
 
09.11.14
13:04
(48) тебе какая разница?
50 Dmitry1c
 
09.11.14
13:05
(49) задача стоит
51 Reaper_1c
 
09.11.14
13:06
(50) Прими холодный душ.
52 Dmitry1c
 
09.11.14
13:07
(51) в тренажерку схожу и приму, хватит оффтопить
53 DmitrO
 
09.11.14
13:07
(50)идентификатор ссылки это не совсем GUID хотя тип данных такой же, 1С формирует идентификаторы ссылок своим способом так чтобы они были уникальны и всегда возрастали, так что не волнуйся, все у тебя будет хорошо.
54 Dmitry1c
 
09.11.14
13:08
(53) можно еще подробнее, ссылку на ресурс 1С или еще что-то такое? Откуда инфа?
55 Dmitry1c
 
09.11.14
13:09
56 Reaper_1c
 
09.11.14
13:10
(52) Хватит страдать херней. Ты полез в дебри которые для решения задачи не нужны. Между тобой и данными - N слоев абстракций, предоставляемых различными компонентами большой информационной системы. Чего ты лезешь на финальный? Почему начинаешь с конца? Приведи задачу - тебе помогут, нафига вот это теоретизирование о высоких материях?
57 DmitrO
 
09.11.14
13:10
:) "..больше знать не надо, но это надо знать на зубок" (С) Карты, деньги, два ствола
58 Dmitry1c
 
09.11.14
13:10
(56) все гораздо прозаичней
59 tridog
 
09.11.14
13:14
(34) 1С генерирует гуиды для ссылок "читерски". Если сделать

Для Шаг = 0 По 10 Цикл
   Сообщить(Справочники.Справочник1.ПолучитьСсылку().УникальныйИдентификатор());

КонецЦикла;

- то можно увидеть, что в них некоторая часть последовательно возрастает.

Насколько помню обсуждение на партнерке - это именно борьба с page splits.
60 Dmitry1c
 
09.11.14
13:16
В ветке
v8: Где взять описание GUID, который в 1С 8?

H A D G E H O G s

ответил на вопрос в п.7

Всем спасибо, все свободны.
61 Dmitry1c
 
09.11.14
13:22
Кстати, товарищ в
https://partners.v8.1c.ru/forum/topic/620414#m_620414

видимо даже нашел практическое применение моему вопросу
62 Dmitry1c
 
09.11.14
13:23
63 Dmitry1c
 
09.11.14
23:03
(34) подтвердил мысль практически.

Если снимем сортировку с даты и времени, то в списке документов на файловой базе при запущенных 2 клиентских приложениях порядок документов будет зависеть от кластерного индекса, который идет по ссылке, т.е. не факт, что если мы на 2 клиенте создадим позже документ, то и в списке документов (список документов без сортировки по полям даты и времени) он будет позже.

Положение документа в списке будет зависеть от того, какой был начальный ГУИД сеанса для данного типа документов. Т.е. в списке будут по порядку идти сначала либо документы 1го клиента, либо документы 2го клиента.

Вот такая практическая закономерность.
64 famnam
 
10.11.14
08:01
Добавлю свои 5 копеек про индексы.
Для каждого нового объекта метаданных система автоматически создает основной кластерный индекс. Он один для каждого объекта. Для периодического РС он выглядит так: Период + Измерение1 + Измерение2 + ... Как видите, индексировать первое измерение  нет смысла, тк в основном индексе уже измерение1 идет впереди. Если включить индексирование у второго измерения, то будет создан новый индекс: Измерение2 + Период + Измерение1 + Измерение2 + ... Аналогично и с реквизитом или ресурсом.
65 Dmitry1c
 
10.11.14
08:28
(64) что-то у тебя тут запутанно как-то

на kb.1c.ru отдельная статья есть про создаваемые индексы
66 Dmitry1c
 
10.11.14
11:52
------------------------------------------
Почему, когда я ищу по составному индексу, если вы выборке кроме проиндексированного поля есть другие поля

у меня все-таки выполняется CLUSTERED INDEX SCAN,
а не INDEX SEEK?
67 Dmitry1c
 
10.11.14
12:01
(66) да и не факт, что виновата именно "составность" индекса
68 H A D G E H O G s
 
10.11.14
12:02
(67) Селективность, не?
69 Dmitry1c
 
10.11.14
12:04
(68) т.е. оптимизатор принял решение, что тот вариант будет лучше?
70 Dmitry1c
 
10.11.14
12:08
Просто я думал: есть таблица, есть по ней составной не кластерный индекс.

Если я выполняю запрос для нескольких полей выборки с условием WHERE по этой таблице по проиндексированному полю (которое по порядку является первым в составном индексе), выборка должна идти через INDEX SEEK.

Как тут оптимизатор запроса мог принять стратегию INDEX SCAN?

Причем INDEX SEEK выполняется, если в запросе идет выборка по одному полю - проиндексированному.
71 H A D G E H O G s
 
10.11.14
12:11
(70) Странно.
72 viktor_vv
 
10.11.14
12:21
(70) А Index scan по тому же индексу ? Может сканировался другой индекс, где есть все поля выборки.
73 H A D G E H O G s
 
10.11.14
12:25
(72) Сканировался кластерный индекс, дефакто - таблица.
74 Dmitry1c
 
10.11.14
12:31
Как догадаюсь, почему так, отпишусь
75 упс
 
10.11.14
12:39
(70) какой процент записей таблицы вы получаете этим запросом? ЕМНИП, если ожидается, что запрос вернёт более 10% записей таблицы, SQL Server не заморачивается на index seek.
Возможно, статистика устарела и сервер обманывается.

Хотя, с учётом (66), скорее всего, количество записей и размеры индексов таковы, что оптимизатор решает, что быстрее будет один раз просканировать кластерный индекс, чем сначала лезть в некластреный индекс, а потом в кластерный за доп. полями.
76 H A D G E H O G s
 
10.11.14
13:02
(75) "чем сначала лезть в некластреный индекс, а потом в кластерный за доп. полями."

Глупость какая. Автор сказал, что ищет по полю, которое входит первым в кластерный индекс.
77 упс
 
10.11.14
13:04
(76) в (70):
>>Просто я думал: есть таблица, есть по ней составной не кластерный индекс.
78 viktor_vv
 
10.11.14
13:05
(76) Как раз-то у ТС некластерный индекс.

" есть по ней составной не кластерный индекс"
79 H A D G E H O G s
 
10.11.14
13:06
(78) (77) Балин, кривые мои глаза.
80 H A D G E H O G s
 
10.11.14
13:07
Индекс недостаточно селективен, чтобы делать indexseek+keylookup в случае наличия доп. полей, но достаточно селективен, чтобы сделать indexseek вместо indexscan по одному полю, вот и все дела.
Ошибка? Это не ошибка, это системная функция.