|
Субботний вопрос про индексы в СУБД | ☑ | ||
---|---|---|---|---|
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
|
||||
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 по одному полю, вот и все дела.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |