Здраствуйте коллеги!

Так получилось, что был такой к примеру запрос

```1c
    "ВЫБРАТЬ
    | СУММА(ТиповойДвиженияССубконто.Сумма) КАК Сумма,
    | ТиповойДвиженияССубконто.СубконтоДт1
    |ИЗ
    | РегистрБухгалтерии.Типовой.ДвиженияССубконто КАК ТиповойДвиженияССубконто
    |ГДЕ
    | ТиповойДвиженияССубконто.Период < &Период
    | И ТиповойДвиженияССубконто.СчетДт = &СчетДт
    | И ТиповойДвиженияССубконто.СубконтоДт1 = &СубконтоДт1
    | И ТиповойДвиженияССубконто.СубконтоДт2 = &СубконтоДт2
    |
    |СГРУППИРОВАТЬ ПО
    | ТиповойДвиженияССубконто.СубконтоДт1";
```

Запрос обрабатывался очень долго.

Потом решил переделать его, ну чтобы ускорить, получилось примерно так

```1c
    "ВЫБРАТЬ
    | СУММА(ТиповойДвиженияССубконто.Сумма) КАК Сумма,
    | ТиповойДвиженияССубконто.СубконтоДт1
    |ИЗ
    | РегистрБухгалтерии.Типовой.ДвиженияССубконто(, &Период, СчетДт = &СчетДт, , ) КАК ТиповойДвиженияССубконто
    |ГДЕ
    | ТиповойДвиженияССубконто.СубконтоДт1 = &СубконтоДт1
    | И ТиповойДвиженияССубконто.СубконтоДт2 = &СубконтоДт2
    |
    |СГРУППИРОВАТЬ ПО
    | ТиповойДвиженияССубконто.СубконтоДт1";
```

Теперь запрос обрабатывается в десятки раз быстрее.

Сообственно вопрос, в чем разница этих запросов? как оно примерно работает изнутри? И когда лучше пользоваться тем или иным? Благодарю за уделенное время.
---
Во втором случае 1С в виртуальной таблице сделала отбор, за счет введеных вами параметров виртуальной таблицы.
А в первом случае вы шерстили всю физическую таблицу и в предложении ГДЕ делали отбор
---
soulsb, Да этот вариант будет оптимальнее. тк параметры накладываются уже на виртуальную таблицу
---
Во втором случае 1С в виртуальной таблице сделала отбор, за счет введеных вами параметров виртуальной таблицы.
А в первом случае вы шерстили всю физическую таблицу и в предложении ГДЕ делали отбор
---
makfromkz, Спасибо за пояснение.

(3) necropunk, Мдаа даже и не думал что все настолько продуманно. Пошел учить. Спасибо Большое!
---
"При использовании виртуальных таблиц в запросах, следует передавать в параметры таблиц все условия, относящиеся к данной виртуальной таблице. Не рекомендуется фильтровать виртуальные таблицы при помощи условий в секции ГДЕ и т.п. Такой запрос будет возвращать правильный (с точки зрения функциональности) результат, но СУБД будет намного сложнее выбрать оптимальный план для его выполнения. В некоторых случаях это может привести к ошибкам оптимизатора СУБД и значительному замедлению работы запроса."

https://its.1c.ru/db/metod8dev#content:5842:hdoc

Тут можно почитать поподробнее, с примерами. Там на самом деле много очень всяких нюансов
http://www.gilev.ru/optimquery/
---
И как я понял, самый оптимальный будет примерно так ?

```1c
    "ВЫБРАТЬ
    | СУММА(ТиповойДвиженияССубконто.Сумма) КАК Сумма,
    | ТиповойДвиженияССубконто.СубконтоДт1
    |ИЗ
    | РегистрБухгалтерии.Типовой.ДвиженияССубконто(
    | ,
    | &Период,
    | СчетДт = &СчетДт
    | И СубконтоДт1 = &СубконтоДт1
    | И (СубконтоДт2 = &СубконтоДт2
    | ИЛИ СубконтоДт3 = &СубконтоДт2),
    | ,
    | ) КАК ТиповойДвиженияССубконто
    |
    |СГРУППИРОВАТЬ ПО
    | ТиповойДвиженияССубконто.СубконтоДт1";
```
---
soulsb, Да этот вариант будет оптимальнее. тк параметры накладываются уже на виртуальную таблицу