Содержание

Медленная выборка из таблиц

Ситуация

Следующий запрос к регистрам вида РегистрСведений.* (например РегистрСведений.ЦеныНоменклатуры.СрезПоследних)

ЗапросЦенХарактеристики.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ ПЕРВЫЕ 1
|	ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
|ИЗ
|	РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
|ГДЕ
|	ЦеныНоменклатурыСрезПоследних.ТипЦен В(&ТипЦен)
|	И ЦеныНоменклатурыСрезПоследних.ХарактеристикаНоменклатуры В(&ХарактеристикаНоменклатуры)";

работает ОЧЕНЬ долго.

Причина

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

Решение

Решение через запрос (не очень быстрое)

Для виртуальных таблиц параметры нужно задавать не на вкладке «Условия» в конструкторе запроса, а на вкладке «Таблицы и поля». Над перечнем «Таблицы» необходимо нажать кнопку «Параметры виртуальной таблицы», а в появившемся окне задать параметры. В результате получается, что виртуальная таблица сразу строится только из полей, удовлетворяющим условиям. В этом случае запрос приобретает следующий вид:

ЗапросЦенХарактеристики.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ ПЕРВЫЕ 1
|	ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
|ИЗ
|	РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ХарактеристикаНоменклатуры = &ХарактеристикаНоменклатуры И ТипЦен = &ТипЦен) КАК ЦеныНоменклатурыСрезПоследних";

Решение через Отбор (самое быстрое)

Отбор = Новый Структура("ТипЦен, Номенклатура, ХарактеристикаНоменклатуры");
Отбор.ТипЦен = ТипЦен;
Отбор.Номенклатура = Номенклатура;
Отбор.ХарактеристикаНоменклатуры = ХарактеристикаНоменклатуры;
Выборка = РегистрыСведений.ЦеныНоменклатуры.СрезПоследних(ТекущаяДата(),Отбор);