Имя: Пароль:
1C
1С v8
Нужны планы ПЛОХИХ запросов!!!
0 BeaViS
 
21.06.15
13:10
Здравствуйте!

Необычная просьба :)

Пишу презенташку по оптимизации запросов

Нужны яркие примеры для демонстрации

Если у кого то завалялись любые сохраненные планы плохих запросов, пришлите пожалуйста!

Если сохранился текст запроса и есть пара комментов к нему, будет хорошо, но если нет - не критично

Если есть "до" и "после", то будет совсем сказка :)

Если текста не сохранилось, до и после не сохранилось - шлите as is !!!

Заранее спасибо!

PS Можно слать на  velifer .. yandex .. ru
1 Андрюха
 
21.06.15
13:25
Будешь неимоверно крут, если соптимизируешь вложенные запросы с иерархией...
2 DrLekter
 
21.06.15
14:17
(1) так их дробить на пакетные надо, как иначе-то?
3 GROOVY
 
21.06.15
14:38
ВЫБРАТЬ
Регистратор.Дата
ИЗ
ЛюбойРегистр

;)
4 BeaViS
 
21.06.15
15:56
(3) Не, ну не настолько же примитивно! ))
5 ILM
 
гуру
21.06.15
17:16
В УПП в процедуре расчета себестоимости фунции "сформировать текст запроса..." посмотри.
6 Рэйв
 
21.06.15
17:18
Выбрать * Из ПланСчетов.Типовой
:-)
7 Рэйв
 
21.06.15
17:21
*пардон, ошибся. Это не экстремально.
Вот так:



Выбрать * Из РегистрБухгалтерии.Типовой
Наименование зависит от страны:-)
8 Сергиус
 
21.06.15
17:21
(0)ЛЕВОЕ СОЕДИНЕНИЕ по условию <>
9 Рэйв
 
21.06.15
17:24
(8)По не равно отработает быстро. Лучше  НЕ В (&БльшойСписокНа100500 )
10 vicof
 
21.06.15
17:24
11 Сергиус
 
21.06.15
17:27
(9)Ну зависит от размера соединяемых таблиц еще конечно)
12 BeaViS
 
22.06.15
00:07
Я имел ввиду - может у кого завалялись сохраненные в файл планы запросов (*.sqlplan)

Ну и разумеется не совсем примитивное нечто должно быть


(9) Такой список сейчас платформа должна автоматом поместить во временную таблицу, еще в последних версиях 8.2 было
13 Armando
 
22.06.15
01:48
https://its.1c.ru/db/metod8dev#content:5812:hdoc:сpu_по_запросам
Там же тебе и планы будут
14 BeaViS
 
22.06.15
02:16
(13), (10)
Ага, то что там написано, в 3/4 случаев скуль прекрасно разруливает.
Или делает незначительно хуже, чем с пакетниками, поэтому яркого примера так легко не получится.

Нужна достаточно большая база и энное количество времени, чтобы воспроизвести эти проблемы. Или увидели Nested Loops и сразу паникуем?

(Ой чувствую счас холивар начнется :)))))

Я ж говорю - нужны с реальных внедрений, с достаточно больших баз файлики *.sqlplan
15 MSOliver
 
22.06.15
07:23
(3) а чем то запрос плох?
Регистратор - индексированное поле. А если обращение к реальным записям не кошерно то туча примеров из типровых..
16 MSOliver
 
22.06.15
07:25
(3) даже так
Дата + Ссылка
Эти индексы создаются всегда для любого документа. -
17 Kvant1C
 
22.06.15
08:28
+(3) еще можно лучше вот так: выбрать регистратор.* ....
18 Armando
 
22.06.15
08:30
(15)  в типовых чтоб не обращаться к полям регистратора дата и номер есть спец регистр сведений
19 Kvant1C
 
22.06.15
08:35
(0) Вот тут: http://catalog.mista.ru/public/184361/
куча примеров "плохих" запросов, с разъяснением, почему они плохие.
Например такой:

ВЫБРАТЬ РАЗЛИЧНЫЕ
    ОстаткиНоменклатуры.Номенклатура
ИЗ
    РегистрНакопления.ОстаткиНоменклатуры КАК ОстаткиНоменклатуры
ГДЕ
    ОстаткиНоменклатуры.Регистратор В(&ФильтрДокументов)
20 vde69
 
22.06.15
08:48
эмммм.... планы запросов зависят не только от самих запросов но еще и от структуры базы и размеры таблиц.....

в 1с практически нет средств оптимизации SQL плана запроса...

тебе чего конкретно надо?
21 vde69
 
22.06.15
08:51
а вообще смотри sys.dm_db_missing_index_stats и подобное, там будет тебе чего взять на презентаху...
22 MSOliver
 
22.06.15
08:54
(18) БП 3.0 последний релиз
|ГДЕ
|    ХозрасчетныйОборотыДтКт.Регистратор ССЫЛКА Документ.МодернизацияОС
|    И ХозрасчетныйОборотыДтКт.Регистратор.СобытиеОС.ВидСобытияОС = ЗНАЧЕНИЕ(Перечисление.ВидыСобытийОС.Модернизация)

а вообще глобальный поиск по "Регистратор" - развеет много сомнений...
23 BeaViS
 
22.06.15
15:00
(15) Есть интересные примеры с составными типами, но только с ними и всего :((
24 D_E_S_131
 
22.06.15
15:21
(22) Чисто ради интереса, что бы предполагалось изменить в этом "куске"?
25 Гёдза
 
22.06.15
15:26
(24) ВЫРАЗИТЬ по типудокумента
26 rs_trade
 
22.06.15
15:27
(0) Тогда почему именно 1С? Тут про планы запросов 1 из 10 знает. На скл.ру быстрее найдешь то что ищешь.
27 vicof
 
22.06.15
15:31
(26) Тут про запросы то не каждый слышал :))
28 33554432
 
22.06.15
15:31
Вот есть плохой, но работающий до сих пор в конторе запрос. Чем он плохой, решайте сами.

запрос1.Текст="ВЫБРАТЬ
              |    РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура,
              |    РеализацияТоваровУслугТовары.Цена,
              |    РеализацияТоваровУслугТовары.Сумма,
              |    РеализацияТоваровУслугТовары.Количество,
              |    РеализацияТоваровУслугТовары.Ссылка,
              |    РеализацияТоваровУслуг.Дата,
              |    РеализацияТоваровУслугТовары.Номенклатура.ВидНоменклатуры,
              |    РеализацияТоваровУслугТовары.Номенклатура.ВидНоменклатуры.Наименование,
              |    РеализацияТоваровУслуг.Контрагент КАК Контрагент,
              |    РеализацияТоваровУслуг.Контрагент.Наименование КАК КонтрагентНаименование,
              |    РеализацияТоваровУслуг.Склад,
              |    РеализацияТоваровУслугТовары.СуммаРучнойСкидки,
              |    РеализацияТоваровУслуг.Партнер.ОсновнойМенеджер
              |ИЗ
              |    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
              |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
              |        ПО РеализацияТоваровУслугТовары.Ссылка = РеализацияТоваровУслуг.Ссылка
              |ГДЕ
              |    РеализацияТоваровУслуг.Проведен = ИСТИНА
              |    И РеализацияТоваровУслуг.Дата >= &датанач
              |    И РеализацияТоваровУслуг.Дата <= &датакон
              |    И (РеализацияТоваровУслугТовары.Номенклатура.Родитель В (&списокном)
              |            ИЛИ РеализацияТоваровУслугТовары.Номенклатура В (&списокном)
              |            ИЛИ РеализацияТоваровУслугТовары.Номенклатура.Родитель.Родитель В (&списокном)
              |            ИЛИ РеализацияТоваровУслугТовары.Номенклатура.Родитель.Родитель.Родитель В (&списокном)
              |            ИЛИ РеализацияТоваровУслугТовары.Номенклатура.Родитель.Родитель.Родитель.Родитель В (&списокном)
              |            ИЛИ РеализацияТоваровУслугТовары.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель В (&списокном))
              |
              |УПОРЯДОЧИТЬ ПО
              |    КонтрагентНаименование,
              |    РеализацияТоваровУслуг.Дата";
29 Бубка Гоп
 
22.06.15
15:37
(28) всего лишь доя пяти уровней? слабаки
30 Славен
 
22.06.15
15:39
(28) в иерархии + по регистру надо бы, раз проведен
31 Бубка Гоп
 
22.06.15
15:41
(28) а почему вообще до сих пор не переписали по человечески? принцип "работает - не трожь"?
32 33554432
 
22.06.15
15:48
(31)
да, типа того. Кстати, извиняюсь, если не правильно понял, что нужно автору. С планами запросов не знаком (
33 EverGreenMouse
 
22.06.15
15:51
Для каждого строка из ТЗ цикл
запрос = Новый Запрос;
Запрос.Текст =
"Выбрать
| Бла-бла-бла"
|* тут Левое Соединение по условию <>;
Запрос.Выполнить().Выгрузить();
КонецЦикла;


Хуже не придумаешь
34 Легат
 
22.06.15
15:53
http://govnokod.ru/1c
хехе :)
35 BeaViS
 
22.06.15
19:59
(15) Есть интересные примеры с составными типами, но только с ними и всего :((
36 BeaViS
 
22.06.15
20:01
(34) За идею 5+ )))))
37 lucifer
 
22.06.15
20:36
(0)
Все просто берешь рекомендации по написанию запросов и делаешь на оборот.

Рекомендации, кратко:
1. При использовании "ДЛЯ ИЗМЕНЕНИЙ" нужно указывать конкретные таблицы для блокировки, иначе блокировка установится на все таблицы запроса, а это избыточно.
2. Запрос должен удовлетворять структуре индексов, т.е. все поля по которым устанавливается отбор должны входить в состав индекса и без пропусков (от этого зависит что СУБД будет использовать index seek или index scan, или вообще table scan)
3. Не нужно использовать подзапросы в условиях соединения, или в ГДЕ (исключение подзапрос к временной табл.)
4. не делать соединения с подзапросами
5. не соединять виртуальные таблицы с реальными, виртуальные с виртуальными
6. не использовать ИЛИ в условиях (или <>)
7. не получать значение через точку полей составного типа
38 BeaViS
 
22.06.15
20:56
(37) Я ж писал уже об этом в (14)
39 lucifer
 
22.06.15
21:00
(38)
"в 3/4 случаев скуль прекрасно разруливает"
а именно? Речь про подзапросы?
40 Basma4
 
22.06.15
21:24
тру 1С ник, готовит презентацию, но планы запросов требует от других.
Возникает вопрос о качестве презентации и о ее целесообразности.

Если лень делать полноценное репро, используй хинты и будут тебе такие планы какие хочешь (оптимальные, неоптимальные)
41 BeaViS
 
23.06.15
08:57
(40) Тру 1С-ник и вообще любой Тру все делает своими руками, по 12 часов в день и без выходных.
Поэтому, да, я не Тру 1С ник )))
Поскольку часто использую аутсорсинг и помощь сообщества, для того чтобы съекономить время и ресурсы.
42 rsv
 
23.06.15
09:04
(0)  по планам это к профайлеру скорее . Увидите  полный индекс скан уже можете оптимизировать
43 BeaViS
 
23.06.15
09:04
(40) +Хинты не очень интересно, так как это искуственно созданная проблема. Не люблю лукавить.

Вот не хочется стоять перед людьми - "А вот еще был вот такой уникальный случай в практике" со скрещенными пальцами за спиной. Это принципиальный вопрос для меня.
44 rsv
 
23.06.15
09:08
(43) :) ммммм. Лучше один раз использовать хины чем переделывать архитектуры таблиц .
45 Basma4
 
23.06.15
09:45
(43) т.е вы будете стоять перед людьми и честно говорить "А вот еще был вот такой уникальный случай в практике" и показывать чужие планы?

Принципиальность 146%!
46 vde69
 
23.06.15
11:30
(42) это не так... полный индекс скан иногда быстрее чем использование индексов...

я уже предлагал банально посмотреть в sys.dm_db_missing_index_stats

для начала этого хватит....