Имя: Пароль:
1C
1С v8
Оптимизация запроса
0 BujiMuji
 
06.11.12
14:09
есть РегистрНакопления.УстановкаСчетчик каждый месяц довабляется 9 000 000 запись

надо оптимизировать этот код

ВЫБРАТЬ
   КОЛИЧЕСТВО(АбонентА),
   СУММА(Минут) КАК Минут    
ИЗ
   РегистрНакопления.УстановкаСчетчик
ГДЕ
   Период МЕЖДУ &Дата1 И &Дата2
   И Минут МЕЖДУ 0 И 60

на это уйдёт 21 сек
1 Feanorko
 
06.11.12
14:10
Обращайтесь к виртуальной таблице регистра
2 prog01
 
06.11.12
14:11
(0)индексы и прямой запрос
3 Maxus43
 
06.11.12
14:12
(2) сгинь 7-шник и нарушитель лицензионного соглашения :)
4 BujiMuji
 
06.11.12
14:12
Feanorko можно какой нибудь пример?
5 zladenuw
 
06.11.12
14:13
какой пример. открываешь консоль запросов. и там смотришь. кроме этой таблицы, есть еще Остатки и Обороты. тебе походу Обороты
6 Feanorko
 
06.11.12
14:14
(4) сфорумилруйте задачу как-то полнее, а то я нихрена не понял, что нужно получить в итоге :)
7 DexterMorgan
 
06.11.12
14:15
(5) Как условие наложить в вирт таблице  И Минут МЕЖДУ 0 И 60 (как я понял это ресурс)
8 Feanorko
 
06.11.12
14:16
(7) нужно как-то иначе спроектировать регистр, видимо
9 BujiMuji
 
06.11.12
14:17
ВЫБРАТЬ
   КОЛИЧЕСТВО(АбонентА),
   СУММА(Минут) КАК Минут    
ИЗ
   РегистрНакопления.УстановкаСчетчик.Обороты(&Дата1,&Дата2)
ГДЕ
   Минут МЕЖДУ 0 И 60

на этом уйдёт 33 сек
10 Feanorko
 
06.11.12
14:17
(9) русским языком можешь объяснить, чего хочешь этим запросом плоучить?
11 DexterMorgan
 
06.11.12
14:18
(9) у тебя с (0) разный результат будет в общем случае
12 zladenuw
 
06.11.12
14:19
ты хочешь за 1 секунду получать ? или какой минимум.
13 bodik911
 
06.11.12
14:23
B Что значит это 33 21 ?

Какой MSSQL проц и тд на чем выполняете ?

Может стоит туда смотреть
14 Feanorko
 
06.11.12
14:25
(13) т.е. обращение к физической таблице регистра накопления нисколько не смущает? :)
15 bodik911
 
06.11.12
14:26
Да к виртуальной нужно
16 BujiMuji
 
06.11.12
15:15
17 BujiMuji
 
06.11.12
15:17
(12)
минимум нужен 0,020 сек
18 Serginio1
 
06.11.12
15:18
А сколько у тебя вообще обонентов без условия на минуты?
И вся база в памяти умещается?
19 BujiMuji
 
06.11.12
15:21
(18) мне нужен такой отчет

http://img.uz/s?k27ge9d
20 Maxus43
 
06.11.12
15:21
а период то какой хоть? за год поди смотриш
21 BujiMuji
 
06.11.12
15:22
(20) за месяц
22 Rovan
 
гуру
06.11.12
15:24
(19) делай пакетом: 1я выборка в запросе - это сумма минут в разрезе клиентов, а потом идут выборки из нее - с условиями интервалов значенений
23 МихаилМ
 
06.11.12
15:25
full scan detected.
-> чем больше данных, тем дольше испольнение запроса.

где группировки в запросе?


какие измерения регистра?
какие поля дополнительно проиндексированны?
24 BujiMuji
 
06.11.12
15:27
25 BujiMuji
 
06.11.12
15:28
(23) зачем группировака?
26 Rovan
 
гуру
06.11.12
15:30
(24) офигеть !
27 Ёпрст
 
06.11.12
15:32
(24) зачетные измерения.. чего уж там
Странно, что вообще что-то еще работает
28 МихаилМ
 
06.11.12
15:36
(24)
это аналитический запрос.
даже если перенести измерение "минут"  
после даты скорость выборки принципиально не увеличится ну в 2-3 раза.
29 Serginio1
 
06.11.12
15:38
(27) С такими измерениямиэто проблема со вставкой связанная с индексом. Для ускорения можно в реквизиты добавить
Часы добавить
30 МихаилМ
 
06.11.12
15:43
(25)
группировка или различные нужны
тк КОЛИЧЕСТВО(АбонентА) - бессмысленно.
31 unregistered
 
06.11.12
15:43
(24) А что означают измерения "Дата" и "Время" в твоём регистре? Какова их суть?
32 Maxus43
 
06.11.12
15:46
Индексы в РН по измерениям формируются тока если стоит галка Индексировать у них, а т.к. тип примитивный - нет индекса
33 Feanorko
 
06.11.12
15:47
Надеюсь, РН хотя бы оборотный?
34 Maxus43
 
06.11.12
15:50
часы и т.д. не в ресурс ли надо по логике то? и считать их быстро будет
35 Ёпрст
 
06.11.12
15:56
(33) нет конечно - "Агрегаты" не активен на скриншоте..

у него останковый.. и Это полный ПЭ..
не закрывается он никогда
36 Serginio1
 
06.11.12
15:57
(32) Но длина индекса увеличивается в количеством и длиной измерения, что ведет к замедлению вставки в индекс, т.к. на одной странице размещается меньшее количество индексов, что ведет к бОльшей высоте Б+ дерева, и соответственно издержки на вставку. Ну и при чтении даже если все находится в памяти не будет эффекта от DDR памяти.
37 Feanorko
 
06.11.12
15:58
(35) убиццо тапком просто...
38 Maxus43
 
06.11.12
15:58
резюме - проетировка регистра *авно, перепроектировать саму суть этого всего что б там не было
39 DexterMorgan
 
06.11.12
15:59
(24) Сорри за оффтоп какой тип у измерения "Что"? Любопытно.
40 ERWINS
 
06.11.12
16:04
ВЫБРАТЬ
   СУММА(выбор когда счетчик.Минут<=60 тогда счетчик.минут иначе 0) КАК Минут    
ИЗ
   РегистрНакопления.УстановкаСчетчик как счетчик
ГДЕ
   Период МЕЖДУ &Дата1 И &Дата2
41 Feanorko
 
06.11.12
16:07
(40) это мёртвому припарка
42 Serginio1
 
06.11.12
16:18
(0) А какой смысл от такого регистра? Зачем нужно накапливать именно по таким измерениям. Просто большая часть может легко выведена в ревкизиты. У тебя база наверное пухнет и выборка так долго потому, что вся база в памяти не помещается и идет медленное обращение к диску.
43 alexhtn
 
06.11.12
16:33
(0) Сделай справочник Интервалы с полями "от" и "до"
И потом весь отчет можно получить одним запросом

ВЫБРАТЬ
   УстановкаСчетчик.АбонентА,
   УстановкаСчетчик.Минут,
   Интервалы.Ссылка КАК Интервал
ПОМЕСТИТЬ Данные
ИЗ
   РегистрНакопления.УстановкаСчетчик КАК УстановкаСчетчик
       ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Интервалы КАК Интервалы
       ПО УстановкаСчетчик.Минут >= Интервалы.От
           И УстановкаСчетчик.Минут < Интервалы.До

ИНДЕКСИРОВАТЬ ПО
   Интервал
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Данные.АбонентА) КАК АбонентА,
   СУММА(Данные.Минут) КАК Минут,
   Данные.Интервал
ИЗ
   Данные КАК Данные

СГРУППИРОВАТЬ ПО
   Данные.Интервал

УПОРЯДОЧИТЬ ПО
   Данные.Интервал.От
44 Maxus43
 
06.11.12
16:40
(43) + такой принцип заложен в том же РАУЗе, что сильно ускоряет все телодвижения с регистром с кучей аналитики
45 ERWINS
 
06.11.12
16:43
(41) записей 9 млн... скорей всего проблема с не вырным выбором индексов в запросе
46 Maxus43
 
06.11.12
16:45
(45) это потому что структура регистра не позволяет впринципе строить нормальные индексы
47 Feanorko
 
06.11.12
16:51
(46) да там хотя бы сделать регистр оборотным и условие засунуть в параметры ВТ - уже легче было бы.
48 Feanorko
 
06.11.12
16:51
+(47) ну и ресурс добавить соотв
49 Maxus43
 
06.11.12
16:51
примитивные типы выкинуть из измерений ещё бы
50 ERWINS
 
06.11.12
16:52
(47) так он должен работать без индексов для скорости
сканинг... всего 9 млн
51 Maxus43
 
06.11.12
16:55
обновлкение статистики может вобще ускорит в разок эту байду, хз чо там со скулем. иль файловая вобще?
52 МихаилМ
 
06.11.12
16:55
(49)
даже полный дибилизм
измерение "минут" число 10.0 (9 байт)
эффективней для построения индекса чем тип ссылка (16 байт)
53 Feanorko
 
06.11.12
16:56
(52) ссылка разве не 36 символов?
54 Maxus43
 
06.11.12
16:57
(52) по примитивным типам в РН индексы не строит вобще, ибо так гласит толстая библия 1с. Сам не смотрел правда, но всегда полагал что примитивные типы зло в измерениях
55 МихаилМ
 
06.11.12
16:58
(53)
путаете представление гуида
и значение.
56 Feanorko
 
06.11.12
16:59
(55) можно на примере?
57 Reset
 
06.11.12
17:00
(56) Число 100 - 1 байт
Его представление "100" - три символа
58 Feanorko
 
06.11.12
17:00
(57) применительно к гуиду и его представлению
59 Reset
 
06.11.12
17:02
(58) аналогично. guid - 16 байт.
Его представление в шестнадцатерично виде и с разделителями - 36 символов
60 Feanorko
 
06.11.12
17:03
(59) пример можно? гуида и его представления
61 Maxus43
 
06.11.12
17:03
индексы РН:
обязательные:
Период + Регистратор + НомерСтроки
Регистратор + НомерСтроки

Измерение + Регистратор + НомерСтроки
в том случае если у измерения стоит галка индексировать

Реквизит + Регистратор + НомерСтроки
в том случае если у реквизита стоит галка индексировать

Как я понимаю - примитивные типы вобще не участвуют в построении индексов
62 Feanorko
 
06.11.12
17:04
(61) это про физическую таблицу РН
63 Reset
 
06.11.12
17:05
(60) Блин ну как в (57) только в 16 раз длиннее. Очевидно же
64 Feanorko
 
06.11.12
17:05
+(62) и тут ничего не сказано про то, что платформе пофиг на "Индексировать" у измерения примитивного типа
65 Maxus43
 
06.11.12
17:06
ааа, затупил с примитивными. всё норм, строится если надо
66 КуплюКровать
 
06.11.12
17:07
(24)регистр кривой
67 Maxus43
 
06.11.12
17:09
(65) + только до сих пор не понял зачем это в Измерение. Зачем в разрезе Минут вести учёт? Смысла не видно, да и никогда не закроется
68 Feanorko
 
06.11.12
17:11
(63) понял) спасибо)
69 Feanorko
 
06.11.12
17:11
(67) регистр по смыслу не должен быть остаточным, он и не должен закрываться
70 Maxus43
 
06.11.12
17:12
(69) тут то остаточный)
71 Feanorko
 
06.11.12
17:13
(70) вроде как очевидно, что это косяк :)
72 BujiMuji
 
07.11.12
11:50
Ура получилось
(43) Спасибо

http://img.uz/s?j27hcoj

Код:
ВЫБРАТЬ
   УстановкаСчетчик.АбонентА,
   УстановкаСчетчик.Минут,
   Интервалы.Ссылка КАК Интервал
ПОМЕСТИТЬ Данные
ИЗ
   РегистрНакопления.УстановкаСчетчик КАК УстановкаСчетчик
       ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Интервалы КАК Интервалы
       ПО УстановкаСчетчик.Минут >= Интервалы.От
           И УстановкаСчетчик.Минут < Интервалы.До
ГДЕ
   УстановкаСчетчик.Период МЕЖДУ &Дата1 И &Дата2
   И УстановкаСчетчик.Тип = "Юр"
ИНДЕКСИРОВАТЬ ПО
   Интервал
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
   КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Данные.АбонентА) КАК АбонентА,
   СУММА(Данные.Минут) КАК Минут,
   Данные.Интервал
ИЗ
   Данные КАК Данные

СГРУППИРОВАТЬ ПО
   Данные.Интервал

УПОРЯДОЧИТЬ ПО
   Данные.Интервал.От
73 BujiMuji
 
07.11.12
11:51
Независимо от того, куда вы едете — это в гору и против ветра!