Имя: Пароль:
1C
1С v8
Тормозит запрос по регистру "ДополнительныеСведения" в БП 3.0
0 bvb
 
30.04.14
11:21
Доброго всем дня

Делаю обработку которая преобразует возвраты в документы поступления.
Исходные номер и дату возврата решил записывать в дополнительные сведения документа поступления чтобы потом искать по ним.
Сведения определяются в ПВХ как :
Объект.СвойствоНомерВозврата   = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Номер документа возврата (Поступление товаров и услуг)",ИСТИНА);
Объект.СвойствоДатаВозврата    = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Дата документа возврата (Поступление товаров и услуг)",ИСТИНА)

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

    
Запрос работает но тормозит ужасно : время выполнения up 10 секунд.
ЧЯДНТ ?
2 H A D G E H O G s
 
30.04.14
11:28
ДополнительныеСведения.Объект.Ссылка КАК Ссылка

заменить на
ДополнительныеСведения.Объект КАК Ссылка
3 Chai Nic
 
30.04.14
11:33
Не делайте соединения с выборкой. Никогда. Соединяйте или с таблицей, или с временной таблицей.
4 bvb
 
30.04.14
11:48
(2) Помогло спасибо
5 mikecool
 
30.04.14
11:55
(3) с чего бы это?
6 H A D G E H O G s
 
30.04.14
11:58
(5) С того бы это.

Но автору хватит и (2)
7 Chai Nic
 
30.04.14
11:58
(5) sql может выбрать очень неоптимальный алгоритм соединения в этом случае..
8 DexterMorgan
 
30.04.14
12:05
(0) + еще использовать Выразить для составных типов
9 DexterMorgan
 
30.04.14
12:06
кароч переписывай)
10 DexterMorgan
 
30.04.14
12:06
но основные тормоза имхо из-за (3)
11 mikecool
 
30.04.14
12:07
(6) (7) тото я смотрю последние веяния писания запросов - пихать одну-две записи в ВТ, а потом ее юзать в соединении
херня полная, надо смотреть планы, а уж потом юзать ВТ
12 DexterMorgan
 
30.04.14
12:09
(11) время на создание вт некритично, соединять всегда лучше с вт, чем с выборкой
13 mikecool
 
30.04.14
12:10
(12) почему это не распространено в т-скл или рл-скл?
вот что меня мучает
14 H A D G E H O G s
 
30.04.14
12:11
(11) да-да, продолжай.
15 mikecool
 
30.04.14
12:12
(14) какие ваши доказательства?
16 DexterMorgan
 
30.04.14
12:17
(15) Рупасов, для тебя не авторитет?
17 mikecool
 
30.04.14
12:19
(16) кто это?
18 DexterMorgan
 
30.04.14
12:19
(17) =)
19 mikecool
 
30.04.14
12:21
(18) ты так это написал, что я должен был сразу пасть ниц? )))
20 mikecool
 
30.04.14
12:22
посмотрел статью на ИТС - есть исключения из правила
так что - следовать слепо рекомендациям тоже плохо
21 DexterMorgan
 
30.04.14
12:23
(19) ну просвещайся =)http://its.1c.ru/db/metod81#content:4050:1
22 H A D G E H O G s
 
30.04.14
12:23
(13) Еще как распространено.

Скажу больше, там (MS SQL!!!) можно декларировать таблицы в памяти - годная, дико годная вещь для 1С-ки с учетом того, что 1С часто меняет временные таблицы (создает, удаляет) и я немного не понимаю, почему 1С не добавит это в платформу. Мыслей 2:

1) Хранить в памяти SQL большие объемы - не комильфо, но где 1С-ники их возьмут :-) да и можно отдать это на откуп программерам.
2) Для таблиц в памяти нельзя создавать индексы, но и это можно отдать на совесть программерам.
23 H A D G E H O G s
 
30.04.14
12:25
3) Всякие левые богомерские sql-и (постгрии, ibm db) могут не поддерживать эту штуку и 1С толерастно не запиливает ее только для рассово верной ms sql. Это скорее всего главная причина.
24 DexterMorgan
 
30.04.14
12:26
(20) ссылку на статью или хотя бы пример исключения
25 mikecool
 
30.04.14
12:26
(23) ты меня иногда поражаешь своей верой )))
26 DexterMorgan
 
30.04.14
12:26
(23) + 100
27 mikecool
 
30.04.14
12:27
(24) Запросы, выполняющие соединение с вложенными запросами или виртуальными таблицами - такую нашел в стандартах и методиках
28 mikecool
 
30.04.14
12:27
не только  т-скл-ом живо человечество!!!
29 H A D G E H O G s
 
30.04.14
12:28
(25) Тоесть?
30 mikecool
 
30.04.14
12:28
(29) всякая тварь, то бишь субд, достойна жизни!
31 DexterMorgan
 
30.04.14
12:29
(27) ПРИМЕР ИСКЛЮЧЕНИЯ?
32 H A D G E H O G s
 
30.04.14
12:29
(30) Это по мнению 1С. Я его не поддерживаю.
33 DexterMorgan
 
30.04.14
12:30
Неужели этого недостаточно, чтобы понять, что лучше использовать?

Пояснения
Во встроенном языке запросов "1С:Предприятия" версии 8.0 отсутствовала возможность использовать временные таблицы и писать пакетные запросы. При этом часто было необходимо выполнять сложные вычисления в рамках одного запроса (то есть одного цикла взаимодействия клиент - сервер "1С:Предприятия" - сервер СУБД). Для решения таких задач использовались подзапросы - обращения не к объектам метаданных, а к выборкам из этих объектов. Как правило, подзапросы выполнялись с группировкой и часто использовались в соединениях.

Оптимизатор сервера СУБД (независимо от того, какую СУБД вы используете) не всегда может правильно оптимизировать подобный запрос. В данном случае проблемой для оптимизатора является выбор правильного способа соединения. Существуют несколько алгоритмов соединения двух выборок. Выбор того или иного алгоритма зависит от того, сколько записей будет содержаться в одной и в другой выборке. В том случае, если вы соединяете две физические таблицы, СУБД может легко определить объем обоих выборок на основании имеющейся статистики. Если же одна из соединяемых выборок представляет собой подзапрос, то понять, какое количество записей она вернет, становится очень сложно. В этом случае СУБД может ошибиться с выбором плана, что приведет к катастрофическому падению производительности запроса.

Переписывание запроса по приведенной выше методике имеет своей целью упростить работу оптимизатору СУБД. В переписанном запросе все выборки, участвующие в соединениях, будут представлять собой физические таблицы, и СУБД сможет легко определить размер каждой выборки. Это позволит СУБД гарантированно выбрать самый быстрый из всех возможных планов. Причем СУБД будет делать правильный выбор независимо ни от каких условий. Переписанный подобным образом запрос будет работать одинаково хорошо на любых СУБД, что особенно важно при разработке тиражных решений. Кроме того, переписанный подобным образом запрос лучше читается, проще для понимания и отладки.

Следует понимать, что, переписав запрос таким образом, мы, возможно, внесли в него некоторое замедление за счет дополнительных накладных расходов - создания временных таблиц. Если СУБД не ошибется с выбором плана, то она, возможно, выполнит старый запрос быстрее, чем новый. Однако это замедление всегда будет крайне незначительным. Размер замедления зависит от используемой СУБД и производительности оборудования. В типичном случае на создание одной временной таблицы может уйти несколько миллисекунд. То есть эти замедления не могут оказать заметного влияния на производительность системы, и, как правило, ими можно пренебречь.
34 mikecool
 
30.04.14
12:30
(31) да не ори ты так, щас...
3.1 Исключением из этого правила является случай, когда при левом соединении выборка по ведущей таблице дает мало записей, а вложенный запрос много. Тогда использование соединения с вложенным запросом (виртуальной таблицей) более оптимально, чем использование временных таблиц.
35 mikecool
 
30.04.14
12:31
(33) ". Однако это замедление всегда будет крайне незначительным. " незначительным, если запрос не выполняется сотню раз в секунду...
36 DexterMorgan
 
30.04.14
12:35
(35) Слушай разговор ни о чем. Когда есть тормоза при выполнении запроса и выполнены все рекомендации из (21), конечно следует анализировать план и ВОЗМОЖНО переписать на вложенный запрос. Но согласись что ситуации, когда нужно ВТ переписать на вложенный встречаются на очень много реже, чем наоборот, поэтому изначально следует писать, используя ВТ
37 mikecool
 
30.04.14
12:37
(36) разговор всегда о чем, если есть суть разговора... )
38 DexterMorgan
 
30.04.14
12:38
(37) у меня нет цели убедить тебя, для себя я сделал вывод, как писать)
39 krbIso
 
30.04.14
12:46
(22) если вы про табличные переменные, то они так же живут на диске как и временные таблицы.
40 H A D G E H O G s
 
30.04.14
12:50
(39) А можно ссылку?
41 krbIso
 
30.04.14
13:07