|
Первый раз запрос выполняется 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
|
Индекс в ВТ вам не поможет никогда
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |