Имя: Пароль:
1C
 
Первый раз запрос выполняется 30 сек, а потом 3 сек - как оптимизировать?
0 RomaH
 
naïve
15.12.17
09:32
Заметил недавно
с утра пришел - дайка, думаю, пооптимизирую
нажал на кнопку - вот оно - запрос выполняется 30 сек, 66% времени

повторяем замер - 3 сек, 30% времени

меняю параметры запроса - 3 сек
перезапускаю 1С - 3 сек

вроде и оптимизировать нечего становится ...

объясните механизм - почему "первый" раз - долго, а потом в 10 раз быстрее
1 RomaH
 
naïve
15.12.17
09:32
SQL
2 Builder
 
15.12.17
09:33
Первый раз у SQL все на диске, потом все в памяти.
3 бомболюк
 
15.12.17
09:34
статистика пересчитывается регулярно?
4 aka AMIGO
 
15.12.17
09:34
И не только на SQL.. И не только в 8-ке.
Точно та же картина в 7-ке при запуске обработки.
5 Genayo
 
15.12.17
09:36
(0) 3 секунды на запрос - оптимизировать нечего? Серьезно?
6 RomaH
 
naïve
15.12.17
09:40
(5) потратить 3 часа времени. что бы оператор выполнил этот запрос 200 раз в год на ... 1 сек быстрее?
7 бомболюк
 
15.12.17
09:42
(6) (30-3) * 200 = 5400 кажется, то есть полтора человека часа в год - это все, что ты можешь сэкономить. Оно стоит 3х часов твоей работы? ;-)
8 vicof
 
15.12.17
09:46
(0) Кэш
9 Cyberhawk
 
15.12.17
09:47
Так у тебя СУБД не разогретая
10 Адинэснег
 
15.12.17
09:48
(0) где запрос-то? выкладывай, щас мы тебя из профессии то попросим :-D
11 Адинэснег
 
15.12.17
09:50
(7) сто таких запросов, и грустить начнет не только оператор, и не 27 секунд в день
12 stopa85
 
15.12.17
09:54
У меня был случай, я такой запрос в 3 сек при прогретом кеше до 0.3 сек при холодном кеше оптимизировал.... но запрос реально был кривой.
13 ИмяФамилия
 
15.12.17
09:54
(0) добавить памяти в sql сервер, что бы данные не вытеснялись. ну и дать чутка больше 1С серверу.
14 rs_trade
 
15.12.17
10:25
(0) запросы оптимизируют глядя на план запроса. даже если он стал 3 сек, там все равно видимо есть что подкрутить что бы чтений стало меньше.
15 Strogg
 
15.12.17
10:36
(0) после первого раза выборка в кэше хранится. Поэтому на порядок(да, да) быстрее.
Чтобы оптимизировать запрос, надо знать механизмы выборки. Есть целый курс по оптимизации запросов. ТАм описывается, почему получение данных через точку будет работать медленнее чем связывание данных, использование ВТшек, вместо вложенных запросов с последующим их уничтожением, короче, в рамках данной темы более лучше пройти курс.
16 Базис
 
naïve
15.12.17
10:56
А с утра роботом запустить несколько отчётов, чтобы весь день они крутились быстро - не прокатит?
17 RomaH
 
naïve
15.12.17
12:17
ну вот три таблички из 10


ВЫБРАТЬ РАЗЛИЧНЫЕ
    Мед_ИспользованиеДокументовВРеестрах.Документ КАК Регистратор
ПОМЕСТИТЬ втИсключаемыеТалоны
ИЗ
    РегистрСведений.Мед_ИспользованиеДокументовВРеестрах КАК Мед_ИспользованиеДокументовВРеестрах
ГДЕ
    Мед_ИспользованиеДокументовВРеестрах.Период >= &ДатаКонцаМинус6Месяца
    И Мед_ИспользованиеДокументовВРеестрах.ВидСтрахования <> ЗНАЧЕНИЕ(Перечисление.Мед_ВидыСтрахования.ПустаяСсылка)
    И Мед_ИспользованиеДокументовВРеестрах.Документ ССЫЛКА Документ.Мед_СтатТалон

;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
    Мед_ТалоныПриема.Регистратор КАК Регистратор
ПОМЕСТИТЬ втТалоныПриемаИсх
ИЗ
    РегистрСведений.Мед_ТалоныПриема КАК Мед_ТалоныПриема
        ЛЕВОЕ СОЕДИНЕНИЕ втИсключаемыеТалоны КАК втИсключаемыеТалоны
        ПО Мед_ТалоныПриема.Регистратор = втИсключаемыеТалоны.Регистратор
ГДЕ
    Мед_ТалоныПриема.Период МЕЖДУ &ДатаНачала И &ДатаКонца
    И Мед_ТалоныПриема.ИФ = 2
    И Мед_ТалоныПриема.СМООМС = &Организация
    И НЕ Мед_ТалоныПриема.Регистратор.НеВключатьВРеестры
    И втИсключаемыеТалоны.Регистратор ЕСТЬ NULL
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
    Мед_СтатистическиеТалоны.НомерСтроки КАК НомерСтроки,
    Мед_СтатистическиеТалоны.Основной КАК Основной,
    Мед_СтатистическиеТалоны.Регистратор КАК Регистратор,
    Мед_СтатистическиеТалоны.Диагноз КАК Диагноз,
    Мед_СтатистическиеТалоны.ХарактерЗаболевания КАК ХарактерЗаболевания
ПОМЕСТИТЬ втСтатистическиеТалоны
ИЗ
    РегистрСведений.Мед_СтатистическиеТалоны КАК Мед_СтатистическиеТалоны
        ЛЕВОЕ СОЕДИНЕНИЕ втИсключаемыеТалоны КАК втИсключаемыеТалоны
        ПО Мед_СтатистическиеТалоны.Регистратор = втИсключаемыеТалоны.Регистратор
ГДЕ
    Мед_СтатистическиеТалоны.Период МЕЖДУ &ДатаНачала И &ДатаКонца
    И втИсключаемыеТалоны.Регистратор ЕСТЬ NULL

ИНДЕКСИРОВАТЬ ПО
    Регистратор


выполняется 1.4 сек
125000
400
4000
записей во временных таблицах
18 Адинэснег
 
15.12.17
13:32
если перед соединением проиндексировать вот эти поля?
ПО Мед_ТалоныПриема.Регистратор = втИсключаемыеТалоны.Регистратор
19 RomaH
 
naïve
15.12.17
13:40
(18) дольше
если не делать первую временную - а левым
то для одного раза - быстрее (если быб было только одно соединение - во втором запросе

для двух - дольше
20 VS-1976
 
15.12.17
13:58
1. Мед_ТалоныПриема.Регистратор.НеВключатьВРеестры

Сколько регистраторов?

2. В РегистрСведений.Мед_ТалоныПриема, а так же в РегистрСведений.Мед_СтатистическиеТалоны много повторов Регистратор? Если да, то в начале выбери во временную таблицу различные, а потом уже соединяй.

3. Не забудь при этом индекс по полю Регистратор прикрутить к правой таблице ( втИсключаемыеТалоны ).
21 Мимохожий Однако
 
15.12.17
14:07
(0) Это кэш. Делай замеры после 2  и 3 запроса. Увидишь, что время одинаковое. Когда сделаешь новый запрос, то опять 2 и 3. Только после этого можно делать выводы.
22 RomaH
 
naïve
15.12.17
14:12
(20) - два типа
НеВключатьВРеестры- только в одном
- Выразить( КАК ) - не помогает
23 RomaH
 
naïve
15.12.17
14:13
(21) ну так

у заказчика претензия - пришел на работу - нажал кнопку и минуту жду результата

проверяем - нифига не минуту - 0.5 сек
так и объяснять - это кэш?
24 НЕА123
 
15.12.17
14:23
(17) условия,которые можно, из ГДЕ вставить ПО
25 Мимохожий Однако
 
15.12.17
14:31
(23) Качество объяснения Заказчику особенности работы программы относится только к опыту и профессионализму консультанта. Если отчет один и тот же, то его можно сформировать заранее по регламенту и выдать из сохранённого места. Еще можно дать Заказчику новопассита для успокоения или включить котиков на экране
26 VS-1976
 
15.12.17
14:44
(22) Выразить не поможет.

ВЫБРАТЬ РАЗЛИЧНЫЕ
    Мед_ТалоныПриема.Регистратор КАК Регистратор
ПОМЕСТИТЬ втТалоныПриемаИсх
ИЗ
    РегистрСведений.Мед_ТалоныПриема КАК Мед_ТалоныПриема

        СОЕДИНЕНИЕ Документ.[ тот у которого есть НеВключатьВРеестры ] КАК ТотСамыйДокумент
          ПО Мед_ТалоныПриема.Регистратор = ТотСамыйДокумент.Регистратор
           И ТотСамыйДокумент.НеВключатьВРеестры

        ЛЕВОЕ СОЕДИНЕНИЕ втИсключаемыеТалоны КАК втИсключаемыеТалоны
        ПО Мед_ТалоныПриема.Регистратор = втИсключаемыеТалоны.Регистратор
ГДЕ
    Мед_ТалоныПриема.Период МЕЖДУ &ДатаНачала И &ДатаКонца

    И Мед_ТалоныПриема.Регистратор ССЫЛКА Документ.[ тот у которого есть НеВключатьВРеестры ]

    И Мед_ТалоныПриема.ИФ = 2
    И Мед_ТалоныПриема.СМООМС = &Организация
    И втИсключаемыеТалоны.Регистратор ЕСТЬ NULL
27 VS-1976
 
15.12.17
14:44
(22) Что там с различными?
28 RomaH
 
naïve
15.12.17
14:56
а вот и нифига
первая таблица - 125000 записей
потом всего 4000


ИМХО - надо сократить первую - т.е. выбрать сначала вторую и третью, потом уже первую, а потом левую исключающую связь сделать
29 Мимохожий Однако
 
15.12.17
14:59
(28) Покажи, что получилось
30 VS-1976
 
15.12.17
15:00
(28) Я тебе про индексы писал.

ВЫБРАТЬ РАЗЛИЧНЫЕ
    Мед_ИспользованиеДокументовВРеестрах.Документ КАК Регистратор
ПОМЕСТИТЬ втИсключаемыеТалоны
ИЗ
    РегистрСведений.Мед_ИспользованиеДокументовВРеестрах КАК Мед_ИспользованиеДокументовВРеестрах
ГДЕ
    Мед_ИспользованиеДокументовВРеестрах.Период >= &ДатаКонцаМинус6Месяца
    И Мед_ИспользованиеДокументовВРеестрах.ВидСтрахования <> ЗНАЧЕНИЕ(Перечисление.Мед_ВидыСтрахования.ПустаяСсылка)
    И Мед_ИспользованиеДокументовВРеестрах.Документ ССЫЛКА Документ.Мед_СтатТалон

ИНДЕКСИРОВАТЬ ПО
  Регистратор
31 VS-1976
 
15.12.17
15:03
К главной пристыковывается втИсключаемыеТалоны без индекса, то есть методом перебора. И чтобы меньше было соединений нужно различные по Регистратор-у для регистров делать в начале, а потом делать левое соединение с втИсключаемыеТалоны. На мой взгляд так будет правильно, но нужно смотреть планы запроса
32 RomaH
 
naïve
15.12.17
15:06
(26) помогло - 1.1 сек
(27) - хуже - 1.6
33 VS-1976
 
15.12.17
15:07
(32) По пункту (27) Просто различных тогда мало.
34 VS-1976
 
15.12.17
15:08
(32) Прикрути индекс к втИсключаемыеТалоны
35 RomaH
 
naïve
15.12.17
15:08
(31) запрос изначально с индексом
(29) - фигня получилась
36 RomaH
 
naïve
15.12.17
15:09
(33) ну от 2 до 10 на каждый регистратор
37 VS-1976
 
15.12.17
15:09
(35) Я про индексирование ВТ.
38 VS-1976
 
15.12.17
15:11
(36) Смотри в начале выбирается данные из РС, далее идёт соединение в ВТ. И поиск идёт в ВТ методом полного сканирования. Если будет индекс по соединяемому полю то 125000 записей не проблема
39 RomaH
 
naïve
15.12.17
15:16
условия из ГДЕ в соединение - хуже 1.1 против 1.7

в общем все фигня - разброс замеров 0.99 - 1.32

https://www.dropbox.com/s/cufow14jkxsqbrn/2017-12-15_15h13_50.png?dl=0

на одном и том же запросе
сервер тестовый - я там один
копейки ловить - смысла нет
(26) - спасибо
40 RomaH
 
naïve
15.12.17
15:16
ВЫБРАТЬ РАЗЛИЧНЫЕ
    Мед_ИспользованиеДокументовВРеестрах.Документ КАК Регистратор
ПОМЕСТИТЬ втИсключаемыеТалоны
ИЗ
    РегистрСведений.Мед_ИспользованиеДокументовВРеестрах КАК Мед_ИспользованиеДокументовВРеестрах
ГДЕ
    Мед_ИспользованиеДокументовВРеестрах.Период >= &ДатаКонцаМинус6Месяца
    И Мед_ИспользованиеДокументовВРеестрах.ВидСтрахования <> ЗНАЧЕНИЕ(Перечисление.Мед_ВидыСтрахования.ПустаяСсылка)
    И Мед_ИспользованиеДокументовВРеестрах.Документ ССЫЛКА Документ.Мед_СтатТалон

ИНДЕКСИРОВАТЬ ПО
    Регистратор
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
    Мед_ТалоныПриема.Регистратор КАК Регистратор
ПОМЕСТИТЬ втТалоныПриемаИсх
ИЗ
    РегистрСведений.Мед_ТалоныПриема КАК Мед_ТалоныПриема
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.Мед_СтатТалон КАК ТотСамыйДокумент
        ПО Мед_ТалоныПриема.Регистратор = ТотСамыйДокумент.Ссылка
            И (ТотСамыйДокумент.НеВключатьВРеестры)
            И (Мед_ТалоныПриема.Период МЕЖДУ &ДатаНачала И &ДатаКонца)
            И (Мед_ТалоныПриема.Регистратор ССЫЛКА Документ.Мед_СтатТалон)
            И (Мед_ТалоныПриема.ИФ = 2)
            И (Мед_ТалоныПриема.СМООМС = &Организация)
        ЛЕВОЕ СОЕДИНЕНИЕ втИсключаемыеТалоны КАК втИсключаемыеТалоны
        ПО Мед_ТалоныПриема.Регистратор = втИсключаемыеТалоны.Регистратор
ГДЕ
    втИсключаемыеТалоны.Регистратор ЕСТЬ NULL
    //И Мед_ТалоныПриема.Период МЕЖДУ &ДатаНачала И &ДатаКонца
    //И Мед_ТалоныПриема.Регистратор ССЫЛКА Документ.Мед_СтатТалон
    //И Мед_ТалоныПриема.ИФ = 2
    //И Мед_ТалоныПриема.СМООМС = &Организация
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
    Мед_СтатистическиеТалоны.НомерСтроки КАК НомерСтроки,
    Мед_СтатистическиеТалоны.Основной КАК Основной,
    Мед_СтатистическиеТалоны.Регистратор КАК Регистратор,
    Мед_СтатистическиеТалоны.Диагноз КАК Диагноз,
    Мед_СтатистическиеТалоны.ХарактерЗаболевания КАК ХарактерЗаболевания
ПОМЕСТИТЬ втСтатистическиеТалоны
ИЗ
    РегистрСведений.Мед_СтатистическиеТалоны КАК Мед_СтатистическиеТалоны
        ЛЕВОЕ СОЕДИНЕНИЕ втИсключаемыеТалоны КАК втИсключаемыеТалоны
        ПО Мед_СтатистическиеТалоны.Регистратор = втИсключаемыеТалоны.Регистратор
ГДЕ
    Мед_СтатистическиеТалоны.Период МЕЖДУ &ДатаНачала И &ДатаКонца
    И втИсключаемыеТалоны.Регистратор ЕСТЬ NULL

ИНДЕКСИРОВАТЬ ПО
    Регистратор
41 RomaH
 
naïve
15.12.17
15:27
42 VS-1976
 
15.12.17
15:50
(41) Хочешь сказать что ничего не изменилось?
43 RomaH
 
naïve
15.12.17
16:03
(42) - ты видишь замеры?
44 RomaH
 
naïve
15.12.17
16:12
хотя "оптимизация" только первых трех запросов (и выполнение только этих трех) дала результат

а вот замена этих трех запросов в общем пакете (15 запросов) - сказалось отрицательно
45 VS-1976
 
15.12.17
17:55
(44) По тому что скорее всего данные были закинуты в кэш этим 3-мя запросами. Нужно в комплексе смотреть что происходит.
46 H A D G E H O G s
 
15.12.17
18:04
Индекс в ВТ вам не поможет никогда
Основная теорема систематики: Новые системы плодят новые проблемы.