Вход | Регистрация



Первый раз запрос выполняется 30 сек, а потом 3 сек - как оптимизировать?

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

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

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

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

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


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

;

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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


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

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

ИНДЕКСИРОВАТЬ ПО
  Регистратор
   VS-1976
 
31 - 15.12.17 - 15:03
К главной пристыковывается втИсключаемыеТалоны без индекса, то есть методом перебора. И чтобы меньше было соединений нужно различные по Регистратор-у для регистров делать в начале, а потом делать левое соединение с втИсключаемыеТалоны. На мой взгляд так будет правильно, но нужно смотреть планы запроса
   RomaH
 
32 - 15.12.17 - 15:06
(26) помогло - 1.1 сек
(27) - хуже - 1.6
   VS-1976
 
33 - 15.12.17 - 15:07
(32) По пункту (27) Просто различных тогда мало.
 
 
   VS-1976
 
34 - 15.12.17 - 15:08
(32) Прикрути индекс к втИсключаемыеТалоны
   RomaH
 
35 - 15.12.17 - 15:08
(31) запрос изначально с индексом
(29) - фигня получилась
   RomaH
 
36 - 15.12.17 - 15:09
(33) ну от 2 до 10 на каждый регистратор
   VS-1976
 
37 - 15.12.17 - 15:09
(35) Я про индексирование ВТ.
   VS-1976
 
38 - 15.12.17 - 15:11
(36) Смотри в начале выбирается данные из РС, далее идёт соединение в ВТ. И поиск идёт в ВТ методом полного сканирования. Если будет индекс по соединяемому полю то 125000 записей не проблема
   RomaH
 
39 - 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) - спасибо
   RomaH
 
40 - 15.12.17 - 15:16
ВЫБРАТЬ РАЗЛИЧНЫЕ
    Мед_ИспользованиеДокументовВРеестрах.Документ КАК Регистратор
ПОМЕСТИТЬ втИсключаемыеТалоны
ИЗ
    РегистрСведений.Мед_ИспользованиеДокументовВРеестрах КАК Мед_ИспользованиеДокументовВРеестрах
ГДЕ
    Мед_ИспользованиеДокументовВРеестрах.Период >= &ДатаКонцаМинус6Месяца
    И Мед_ИспользованиеДокументовВРеестрах.ВидСтрахования <> ЗНАЧЕНИЕ(Перечисление.Мед_ВидыСтрахования.ПустаяСсылка)
    И Мед_ИспользованиеДокументовВРеестрах.Документ ССЫЛКА Документ.Мед_СтатТалон

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

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

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

    //И Мед_ТалоныПриема.Регистратор ССЫЛКА Документ.Мед_СтатТалон

    //И Мед_ТалоныПриема.ИФ = 2

    //И Мед_ТалоныПриема.СМООМС = &Организация

;

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

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

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

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


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует