Имя: Пароль:
1C
1С v8
Медленная выборка из виртуальной таблицы
0 НеПапоКарло
 
11.11.19
14:29
При работе с ветсистемой Меркурий, используется запрос остатков на стороне Меркурия, результат которого заносится в таблицу значений «Остатки». Далее при создании документа "Ветеринарное свидетельство" по номенклатурной позиции запросом вытаскивается необходимая партия.
Ранее когда строк остатков было примерно около 100-200, то скорость выборки из таблицы значений была нормальной (1-2 секунды), то сейчас это 10-15 секунд из таблицы 500-700 строк. Соответственно при создании ветдокументов (300-400 штук в день) время ожидания стало очень затратным.

Подскажите, пжл, оптимальный выход из ситуации. Ниже текст запроса (если убрать условия, то скорость запроса увеличивается не значительно):

ВЫБРАТЬ
О.ГУИД КАК ГУИД,
О.ДатаВыработки КАК ДатаВыработки,
О.ДатаПросрочки КАК ДатаПросрочки,
О.ДатаВыработкиКон КАК ДатаВыработкиКон,
О.ДатаПросрочкиКон КАК ДатаПросрочкиКон,
О.ДатаВыработкиСтрокой КАК ДатаВыработкиСтрокой,
О.ДатаПросрочкиСтрокой КАК ДатаПросрочкиСтрокой,
О.ЕдиницаХранения КАК ЕдиницаХранения,
О.Фасовка КАК Фасовка,
О.КодПартии КАК КодПартии,
О.Количество,
О.КоличествоУпаковок,
О.Категория КАК Категория,
О.Номенклатура КАК Номенклатура,
О.НоменклатураСтрокой КАК НоменклатураСтрокой,
О.ГУИДНоменклатуры,
О.Организация КАК Организация,
О.ДатаСоздания КАК ДатаСоздания,
О.ГУИДПроизводителя КАК ГУИДПроизводителя,
О.Производитель,
О.СписокПроизводителей,
О.НомерСЗ
ПОМЕСТИТЬ Остатки
ИЗ
&Остатки КАК О
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
СкладскиеЗаписи.Категория КАК Категория,
СкладскиеЗаписи.Номенклатура КАК Номенклатура,
СкладскиеЗаписи.ЕдиницаХранения КАК Единица,
СкладскиеЗаписи.Количество КАК КоличествоОстаток,
СкладскиеЗаписи.КоличествоУпаковок КАК КоличествоУпаковокОстаток,
СкладскиеЗаписи.ДатаВыработки КАК ДатаВыработки,
СкладскиеЗаписи.ДатаПросрочки КАК ДатаПросрочки,
СкладскиеЗаписи.ДатаВыработкиКон КАК ДатаВыработкиКон,
СкладскиеЗаписи.ДатаПросрочкиКон КАК ДатаПросрочкиКон,
СкладскиеЗаписи.ДатаВыработкиСтрокой КАК ДатаВыработкиСтрокой,
СкладскиеЗаписи.ДатаПросрочкиСтрокой КАК ДатаПросрочкиСтрокой,
СкладскиеЗаписи.НомерСЗ,
СкладскиеЗаписи.ГУИД КАК ГУИД,
СкладскиеЗаписи.Фасовка КАК Фасовка,
СкладскиеЗаписи.КодПартии КАК КодПартии,
СкладскиеЗаписи.НоменклатураСтрокой КАК НоменклатураСтрокой,
СкладскиеЗаписи.ГУИДНоменклатуры,
СкладскиеЗаписи.ГУИДПроизводителя КАК ГУИДПроизводителя,
СкладскиеЗаписи.Производитель,
СкладскиеЗаписи.СписокПроизводителей
ИЗ
Остатки КАК СкладскиеЗаписи
ГДЕ
СкладскиеЗаписи.Организация = &Организация
И (&ДатаВыработки = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
ИЛИ &ДатаВыработки <= СкладскиеЗаписи.ДатаВыработки
ИЛИ СкладскиеЗаписи.ДатаВыработки = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0))
И СкладскиеЗаписи.Количество > 0
И (&ГУИДПроизводителя = ""
ИЛИ (ВЫРАЗИТЬ(СкладскиеЗаписи.ГУИДПроизводителя КАК СТРОКА(36))) = &ГУИДПроизводителя)
И ВЫБОР
КОГДА &Номенклатура = НЕОПРЕДЕЛЕНО
ИЛИ СкладскиеЗаписи.Номенклатура = НЕОПРЕДЕЛЕНО
ИЛИ СкладскиеЗаписи.Номенклатура = &ПустойТовар
ТОГДА СкладскиеЗаписи.Категория = &Категория
ИНАЧЕ СкладскиеЗаписи.Номенклатура = &Номенклатура
КОНЕЦ
И (НЕ СкладскиеЗаписи.КоличествоУпаковок ПОДОБНО "%устаревшая%")
И (&КодПартии = ""
ИЛИ СкладскиеЗаписи.КодПартии = &КодПартии)

УПОРЯДОЧИТЬ ПО
Номенклатура УБЫВ,
ДатаВыработки,
СкладскиеЗаписи.ДатаСоздания
1 H A D G E H O G s
 
11.11.19
14:35
Ну тут 3 проблемы:
1) Неадекватный алгоритм
2) Неадекватное время выполнения с таким размером данных
3) Ничего с этим вы поделать не сможете.
2 H A D G E H O G s
 
11.11.19
14:36
Это вообще красивятина

И (НЕ СкладскиеЗаписи.КоличествоУпаковок ПОДОБНО "%устаревшая%")
3 Жан Пердежон
 
11.11.19
14:45
в отборами порешай, индексы добавь
4 timurhv
 
11.11.19
14:58
(3) Автор же написал:
>если убрать условия, то скорость запроса увеличивается не значительно
5 тарам пам пам
 
11.11.19
15:13
(0) А точно именно этот запрос тормозит?
Обычно хоть сколько-нибудь заметные тормоза при помещении ТЗ во временную таблицу начинаются от 10000 строк, твои 500 - это ниочем обычно.
6 1С Ассенизатор ПРОФ
 
11.11.19
15:17
Секция ИЛИ, и (ВЫРАЗИТЬ(СкладскиеЗаписи.ГУИДПроизводителя КАК СТРОКА(36))) = &ГУИДПроизводителя) и И (НЕ СкладскиеЗаписи.КоличествоУпаковок ПОДОБНО "%устаревшая%") Не попадет в индекс например никогда. Если он есть конечно =)
7 H A D G E H O G s
 
11.11.19
15:17
(5) там в фоне могут 10-20 насиловать tempdb неактуальной статистикой.
8 H A D G E H O G s
 
11.11.19
15:17
там в фоне могут 10-20 ->
там в фоне могут 10-20 пользователей
9 1С Ассенизатор ПРОФ
 
11.11.19
15:18
(6) Правда проблема не в этом конечно
10 1С Ассенизатор ПРОФ
 
11.11.19
15:20
А вообще темпдб хватает? Мб просто места нету под него? (в момент запроса)
11 palsergeich
 
11.11.19
15:24
В этом запросе в секции ГДЕ ИМХО все антипаттерны языка запросов собраны.
и условие ИЛИ на разные поля
и Подобно %текст%
и конструкция Выбор когда тогда конец в условии
12 НеПапоКарло
 
11.11.19
15:29
(5) Точно в нём.
13 timurhv
 
11.11.19
15:30
(0) Так утверждение:
"Ниже текст запроса (если убрать условия, то скорость запроса увеличивается не значительно)"
Точно верно? Т.е. если убрать полностью секцию ГДЕ, то тормоза в целом сохраняются?
14 palsergeich
 
11.11.19
15:32
Неверю, что при 700 строках 1 таблицы и без условия во 2ой запрос выполняется 15 секунд.
15 palsergeich
 
11.11.19
15:32
А точно проблема с запросом, а не с другими вещами?
16 Cyberhawk
 
11.11.19
15:34
(11) "условие ИЛИ на разные поля" // Нормально все будет
17 palsergeich
 
11.11.19
15:55
(16) В общем случае не рекомендуецца так делать, но на таблице в 700 строк и правда пофиг
18 НеПапоКарло
 
11.11.19
15:57
(13) Да, точно верно, запрос такой:

ВЫБРАТЬ
    О.ГУИД КАК ГУИД,
    О.ДатаВыработки КАК ДатаВыработки,
    О.ДатаПросрочки КАК ДатаПросрочки,
    О.ДатаВыработкиКон КАК ДатаВыработкиКон,
    О.ДатаПросрочкиКон КАК ДатаПросрочкиКон,
    О.ДатаВыработкиСтрокой КАК ДатаВыработкиСтрокой,
    О.ДатаПросрочкиСтрокой КАК ДатаПросрочкиСтрокой,
    О.ЕдиницаХранения КАК ЕдиницаХранения,
    О.Фасовка КАК Фасовка,
    О.КодПартии КАК КодПартии,
    О.Количество КАК Количество,
    О.КоличествоУпаковок КАК КоличествоУпаковок,
    О.Категория КАК Категория,
    О.Номенклатура КАК Номенклатура,
    О.НоменклатураСтрокой КАК НоменклатураСтрокой,
    О.ГУИДНоменклатуры КАК ГУИДНоменклатуры,
    О.Организация КАК Организация,
    О.ДатаСоздания КАК ДатаСоздания,
    О.ГУИДПроизводителя КАК ГУИДПроизводителя,
    О.Производитель КАК Производитель,
    О.СписокПроизводителей КАК СписокПроизводителей,
    О.НомерСЗ КАК НомерСЗ
ПОМЕСТИТЬ Остатки
ИЗ
    &Остатки КАК О
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    СкладскиеЗаписи.Номенклатура КАК Номенклатура
ИЗ
    Остатки КАК СкладскиеЗаписи
19 kabanoff
 
11.11.19
16:39
(18) Есть подозрение, что проблема не в выборке, а в ставке во временную таблицу.
Попробуй просто вставить во временную таблицу, без выборки данных.

Т.е.:

Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.Текст = ТвойТекст;
Запрос.УстановитьПараметр("Остатки", ТвояТаблица);
Запрос.Выполнить();


И скажи, у тебя база файловая или клиент-сервер?
20 НеПапоКарло
 
11.11.19
16:51
(19) Клиент-сервер
21 Максим Нижегородец
 
11.11.19
16:57
(11) Еще бы добавил: решение придумано так, что кажется его задача повесить SQL.
Большие таблицы ни кто не выгружает из базы, чтобы по том их отправить опять четез ТЗ в SQL. Их крутят внутри и результатом возвращают не большую табличку.
22 ДенисЧ
 
11.11.19
16:58
(21) Как никто не выгружает? А ТС? )))
23 НеПапоКарло
 
11.11.19
16:59
(18) Ещё если убрать строки:

О.Фасовка КАК Фасовка,
О.СписокПроизводителей КАК СписокПроизводителей,
О.КоличествоУпаковок КАК КоличествоУпаковок

То отрабатывает мгновенно, значения этих полей имеют вид:

Фасовка -
{"#",acf6192e-81ca-46ef-93a6-5a6968b78663,¶{8,¶{4,¶{0,"Уровень",¶{"Pattern",¶{"#",a042fa85-edfa-4e44-bee9-9a021b1b8c19}¶},"",0},¶{1,"Упаковка",¶{"Pattern",¶{"#",4c8c2075-78cb-408c-ac8a-8a44faa1fdf3}¶},"",0},¶{2,"Количество",¶{"Pattern",¶{"N"}¶},"",0},¶{3,"Маркировки",¶{"Pattern",¶{"S"}¶},"",0}¶},¶{2,4,0,0,1,1,2,2,3,3,¶{1,2,¶{2,0,4,¶{"#",a042fa85-edfa-4e44-bee9-9a021b1b8c19,10491:9ad264a684332af6415f87e3871b564d},¶{"#",4c8c2075-78cb-408c-ac8a-8a44faa1fdf3,10461:809f49eb4ad78f2d4cc1da0f5bf6561b},¶{"N",6},¶{"S","EAN128:0112000000365838111808051720011810180718"},0},¶{2,1,4,¶{"#",a042fa85-edfa-4e44-bee9-9a021b1b8c19,10491:abe372ccfe1cbd4a456f239a6b4957e1},¶{"#",4c8c2075-78cb-408c-ac8a-8a44faa1fdf3,10461:8fbebff805715106498e21cf8a5094aa},¶{"N",100},¶{"S","EAN13:2000000365831"},0}¶},3,1}¶}¶}

СписокПроизводителей -

{"#",acf6192e-81ca-46ef-93a6-5a6968b78663,¶{8,¶{2,¶{0,"Производитель",¶{"Pattern",¶{"S"}¶},"",0},¶{1,"ГУИД",¶{"Pattern",¶{"S"}¶},"",0}¶},¶{2,2,0,0,1,1,¶{1,2,¶{2,0,2,¶{"S","Филиал в с. Ворсино ООО ""Нестле Россия"""},¶{"S","fcb42271-277f-42c5-9ffd-34a0f2cfe45c"},0},¶{2,1,2,¶{"S","ООО ""Сентос Централ Логистикс РУС"" д. Денисово склад ООО ""Нестле Россия"""},¶{"S","f5c97fda-fd24-4e38-b70e-cee2e40d0553"},0}¶},1,1}¶}¶}

КоличествоУпаковок -

Коробка(1 176);Штука.(1);"Коробка, картонная"(24)
24 Максим Нижегородец
 
11.11.19
17:01
(22) Как решение не мучить SQL. Все обрабатывать в талицах значений. Будут доли секунды.
25 mistеr
 
11.11.19
17:03
(0) Моя попытка: в таблице значений колонки типизированы?
26 mistеr
 
11.11.19
17:04
(23) И какой размер данных в этих колонках?
27 Максим Нижегородец
 
11.11.19
17:06
Для любого SQL запрос с параметром СПИСОК в 1000 записей, превращается в тормоза.
28 НеПапоКарло
 
11.11.19
17:10
(25) Дело в том, что код закрыт, имеем только строку:
Остатки = ПараметрыСеанса.АСП_СкладскиеЗаписи.Получить();
29 timurhv
 
11.11.19
17:12
(23) Партии наобъединяли поди, поэтому записи как снежный ком накопились. 700 строк в таблице по 700 строк задублированных производителей, фасовки и тд дадут условно 49тыс строк.
30 pechkin
 
11.11.19
17:16
на тыщу строк без обращений через точку не может так долго выполнять.
где то тут косяк в другом месте
31 pechkin
 
11.11.19
17:19
на тущу строк даже инндексы скорее всего не нужны. не тот эффект
32 H A D G E H O G s
 
11.11.19
17:20
XML план запроса решит все вопросы.
33 mistеr
 
11.11.19
17:26
(28) Но ничто ведь не мешает посмотреть тип колонок в отладчике?
34 НеПапоКарло
 
11.11.19
17:39
(33) Колонки типизированы.
35 pechkin
 
11.11.19
17:40
(23) в этих колонках получается мегабайты текста?
и тормозит передача их на скл?
36 rphosts
 
11.11.19
17:46
(0) месье знает толк в том как не следует писать запросы! Такое кол-во ИЛИ в разделе ГДЕ - зло! Но даже тупо отбирая все 700 записей нет тут места доя 10-15 секунд ну никак!!!
37 НеПапоКарло
 
11.11.19
21:15
(0) Вообщем решение оказалось таким:

Перед выполнением запроса сворачивалась таблица значений по номенклатуре, и запрос отрабатывался уже по этой таблице.
Спасибо за помощь и новый познания.

Отбор = Новый Структура;
Отбор.Вставить("Номенклатура", Запрос.Параметры.Номенклатура);
ОстаткиПоНоменклатуре = Остатки.Скопировать(Отбор);
Запрос.УстановитьПараметр("Остатки", ОстаткиПоНоменклатуре);