Имя: Пароль:
1C
 
Индексирование полей типа "Дата"
0 DF_Slayer
 
01.12.08
12:39
Всем привет, кого не видел :)
Есть запрос, в котором имеется следующее условие
|ГДЕ
|    Рег.ДатаНачала > &ДатаНачала
|    И Рег.ДатаНачала < &ДатаОкончания
Вопрос. Использует ли 1С индексы в случае такого условия (понятно что при условии "=" индекс используется), и можно ли вообще как-то отслеживать используемые индексы?
1 dimoff
 
01.12.08
12:44
Безусловно использует, отследить легко, создай справочник, заполни его сотней тысяч документов и сделай запрос по дате и неиндексируемому реквизиту типа дата с твоими условиями, увидишь разницу.
2 DF_Slayer
 
01.12.08
13:04
Ага, спасибо, так и делаю уже.
3 DF_Slayer
 
01.12.08
13:21
Хм, документов 30000, разницы никакой :)
4 Sadovnikov
 
01.12.08
13:23
(3) Ты запрос-то целиком покажи.
5 H A D G E H O G s
 
01.12.08
13:32
Раз уж пошла такая пьянка, есть кто подскажет - я правильно понимаю, что индекс на поле - это некая таблица с 2-мя колонками: "НомерСтроки", "Значение", в которой хранятся отсортированные значения из индексируемого поля основной таблицы, а также номера их строк.
Сортировка производится при вставке/удалении элемента, поиск - методом бисекции. Ищется номер строки основной таблицы.
Это мои фантазии, или в этом есть доля правды?
6 DF_Slayer
 
01.12.08
13:42
"ВЫБРАТЬ
            |    ВыгрузкаВБегучку.ДатаНачалаВыхода КАК ДатаНачалаВыхода,
            |    ВыгрузкаВБегучку.Длительность КАК Длительность,
            |    ВыгрузкаВБегучку.Активность КАК Активность,
            |    ВыгрузкаВБегучку.Текст КАК Текст,
            |    ВыгрузкаВБегучку.Картинка КАК Картинка,
            |    ВыгрузкаВБегучку.Выделение КАК Выделение,
            |    ВыгрузкаВБегучку.Рубрика КАК Рубрика,
            |    ВыгрузкаВБегучку.ПодРубрика КАК ПодРубрика,
            |    ВыгрузкаВБегучку.Номер КАК Номер,
            |    ВыгрузкаВБегучку.Регистратор КАК Объявление
            |ИЗ
            |    РегистрСведений.ВыгрузкаВБегучку КАК ВыгрузкаВБегучку
            |ГДЕ
            |    ВыгрузкаВБегучку.ДатаНачалаВыхода > &ДатаНачалаВыхода
            |    И ВыгрузкаВБегучку.ДатаНачалаВыхода < &ДатаОкончанияВыхода
            |
            |УПОРЯДОЧИТЬ ПО
            |    ДатаНачалаВыхода,
            |    Номер,
            |    Рубрика,
            |    ПодРубрика,
            |    Текст,
            |    Картинка,
            |    Выделение,
            |    Активность,
            |    Длительность
            |АВТОУПОРЯДОЧИВАНИЕ";
Это весь текст.

+ к сказанному приведу следующую цитату с одного форума...
"Как известно, в ДБФ-версии для индексирования numeric поля применяется выражение STR(поле, длина, точность).
К чему это приводит, тоже известно - идя по этому индексу, получаем, что  9 < -1 < 10"
7 Sadovnikov
 
01.12.08
13:44
(6) Так чего ты от такого запроса хочешь? Естественно, он у тебя по закладкам скачет чтобы данные получить. По этому и не видишь особого ускорения.
8 H A D G E H O G s
 
01.12.08
13:48
(7) Типа полный перебор таблицы, вы про это?
9 Sadovnikov
 
01.12.08
13:50
(8) По индексу будут отобраны необходимые номера строк. Но, за данными скулю придется лезть в таблицу. То самое "прыгать по закладкам". Эта-то процедура и съест весь выигрыш в скорости, если в выборку попала большая часть таблицы.
10 megalodon
 
01.12.08
13:52
(7) "по закладкам скачет" - не поясните, что это означает?
11 megalodon
 
01.12.08
13:54
(9) спасибо. только при малой селективности он и не будет "по закладкам скакать", будет использоваться сканирование.
12 H A D G E H O G s
 
01.12.08
13:54
(9) Тоесть полного перебора нет. Ок, ну а если интервал выборки - один день?
По поводу (5) - это так?
13 Sadovnikov
 
01.12.08
13:55
(10) "по закладкам скачет" = Bookmark Lookup. Прости, господи, за мой плохой английский...
14 Sadovnikov
 
01.12.08
13:55
(11) А это, смотря чего ему статистика скажет...
Блин, как я сегодня криво выражаюсь...
15 DF_Slayer
 
01.12.08
13:58
А в каком тогда запросе будет выигрыш?
16 megalodon
 
01.12.08
14:03
(15) а что с чем сравниваем?
17 DF_Slayer
 
01.12.08
14:05
(16) Запрос с условием больше/меньше на поле типа Дата, с индексом и без.
18 megalodon
 
01.12.08
14:07
в общем случае с индексом быстрее, но индекс будет использоваться не всегда - в этих случаях скорость будет одинаковая.
19 H A D G E H O G s
 
01.12.08
14:09
(18) Большой Зуб, ты мне скажи, я в (5) прав?
20 DF_Slayer
 
01.12.08
14:11
(18) Я вот и пытаюсь выяснить "не всегда" - это когда? :)
21 megalodon
 
01.12.08
14:13
(19) вроде прав в некотором приближении. в твоих терминах "Значение" - это хэш индексируемого выражения, а "Номер строки" - это та самая "закладка", то есть физический адрес записи в таблице.
22 H A D G E H O G s
 
01.12.08
14:16
(21) А хэш разве можно сравнивать на больше|меньше (поиск бисекцией, там это надо)?
23 megalodon
 
01.12.08
14:17
(20) это когда с результирующий набор запроса попадает более какого то процента всех записей таблицы (то есть если в условии запроса передан большой временной интервал). В этом слечае нет смысла определять по индексу "закладку" каждой записи, а потом по нему для каждой записи получать значения остальных полей - выгоднее сразу сканировать таблицу. Но есть например из миллиона записей возвращается одна - лучше по индексу получить ее адрес, а потом - значения остальных полей. Оптимизитор сам все определит, можешь не париться.
24 megalodon
 
01.12.08
14:17
(22) ой, там не хэш вовсе, потому что из него можно получить само значения.
25 DF_Slayer
 
01.12.08
14:22
(23) Теперь ясно, спасибо!
26 H A D G E H O G s
 
01.12.08
14:24
Мне - нет :-)
Ладно - время будет - буду спец. литературу читать. Где - то видел, что индекс формируется на основе бинарного дерева, но вот представить себе такое - не могу :-)
27 Sadovnikov
 
01.12.08
14:28
(26) А чего именно предстаить не можешь? Каждый символ индекса - веточка, от которой остальные символы-веточки растут :)
28 H A D G E H O G s
 
01.12.08
14:30
(27) Ну, и прошел я "от корней, до самых кончиков" © (Head and Sholders). И что получил?
29 H A D G E H O G s
 
01.12.08
14:31
(28) P.S. Я - тупой 1С-ник, не забываем..
30 Sadovnikov
 
01.12.08
14:31
(28) Номер в строке таблицы получил, которая соответствует индексу :)
31 H A D G E H O G s
 
01.12.08
14:35
(30) Номера на самых кончиках хранятся? А в средних узлах - диапазон (перечисление нескольких) номеров, соответствующих условию?
32 vde69
 
01.12.08
14:38
(31) алгоритм поиска по индексу:

1 находим в корне дерева первый символ -
2 получаем следующий уровень
3 если уровень последний имеем номер строки в базе, нет - п.1


при такой схеме индексы не надо переформировывать при изменении строки, достаточно "ТОЧЕЧНОЕ" вмешательство
33 Sadovnikov
 
01.12.08
14:41
(31) На сколько я понимаю, в средних узлах ничего не хранится. В смысле, никаких диапазонов строк там нет.
34 vde69
 
01.12.08
14:43
(33) и не может храниться, по тому как строки не храняться диапазонами :)
35 H A D G E H O G s
 
01.12.08
14:56
(34) Ладно, еще вопрос:

У меня есть Число.
Оно что, преобразуется в строку и посимвольно помещается в дерево индекса?
36 Sadovnikov
 
01.12.08
14:59
37 H A D G E H O G s
 
01.12.08
15:14
(36) Почитал. И все равно не понял, чем поиск/вставка элемента в двоичном дереве отличается от таблицы (5). Это же фактически одно и тоже?
38 vde69
 
01.12.08
15:18
(37) это зависит от реализации, но обычно дерево строиться byte, то есть и строка и число рассмативаються как одинаковый тип бинари, хотя есть и строковые индексы
39 Sadovnikov
 
01.12.08
15:21
Сидим тут, за теорию перетираем... А у людей, вот, глобальные проблемы:
Условия в запросе при разных типах переменных
:)
40 MSensey
 
01.12.08
15:36
(9) а ниче что в РС кластерный индекс?
41 Sadovnikov
 
01.12.08
15:37
(40) Поясни свою мысль?
42 H A D G E H O G s
 
01.12.08
15:39
(39) Просто у меня стойкая психологическое неприятие к деревьям после неудачной попытки реализовать B-дерево на Дельфи. :-)
43 MSensey
 
01.12.08
15:43
(41) >> Но, за данными скулю придется лезть в таблицу.
Если используется кластреный индекс, то данные в этой же таблице
44 Sadovnikov
 
01.12.08
15:54
(43) На поле ВыгрузкаВБегучку.ДатаНачалаВыхода построен кластерный индекс? Интересно, почему я в это не верю?
45 MSensey
 
01.12.08
15:58
(44) ну автор умлочал о том чем является ДатаНачалаВыхода
Но если взять во внимание фразу "понятно что при условии "=" индекс используется", то можно сказать, что это измерение
46 MSensey
 
01.12.08
15:59
(45) а не вру - нельзя сказать :)
47 Sadovnikov
 
01.12.08
16:02
(45) Вот и я думаю, что измерение. Мне, например, неизвестно, как по измерению можно построть кластерный индекс.
48 MSensey
 
01.12.08
16:06
(47) он по умолчанию строится по всем измерениям
49 Sadovnikov
 
01.12.08
16:10
(48) Так мы понятия не имеем, в каком порядке у автора идут измерения. И где именно это измерение находтся в индексе. Очень большая вероятность, что не на первом месте.
50 MSensey
 
01.12.08
16:12
(49) я писал, что если используется такой индекс.
Вобщем я к тому, что не обязательно за данными полезут в другую таблицу
51 Sadovnikov
 
01.12.08
16:13
(50) А нееет :)
Ты писал: "а ниче что в РС кластерный индекс?" :)
52 MSensey
 
01.12.08
16:42
(51) лень было вдаваться в детали ;)