Доброго времени суток!
Исходя из специфики выполняемых задач, в последнее время часто приходилось получать из базы 1С всю номенклатуру с характеристиками, для последующей обработки.
В процессе разработки различных решений задался целью проверить скорость и качество выполнения запросов.
Учитывая опыт практического применения приведенных в статье решений считаю оптимальным указать голые замеры с комментариями и не буду касаться планов запросов и остальной теоретической части.
Помним, что наилучшее решение всегда индивидуально и зависит от многих факторов.
Условия:
- Каждый запрос выполняется 1000 раз подряд (в цикле) для определения лучшего, худшего, среднего и общего результата. При длительных запросах по понятным причинам обходился замерами в консоли.
- На каждый запрос по 3 повтора (итого 3000 запросов) для разброса.
Предлагаю поэтапно составить запрос.
№
|
Особенности
|
Текст запроса
|
Время выполнения
|
|||
Лучшее
|
Худшее
|
Среднее
|
Общее
|
|||
1 |
одинарный отбор |
ВЫБРАТЬ |
00.012,000 00.011,000 00.011,000 |
00.017,000 00.020,000 00.023,000 |
00.012,695 00.012,787 00.012,823 |
12.695,000 12.787,000 12.823,000 |
2 |
двойной отбор, сперва по использованию характеристик |
ВЫБРАТЬ |
00.011,000 00.011,000 00.011,000 |
00.018,000 00.023,000 00.018,000 |
00.012,937 00.013,345 00.012,892 |
12.937,000 13.345,000 12.892,000 |
3 |
двойной отбор, сперва по принадлежности к группе |
ВЫБРАТЬ |
00.011,000 00.012,000 00.012,000 |
00.024,000 00.020,000 00.022,000 |
00.013,598 00.013,382 00.013,355 |
13.598,000 13.382,000 13.355,000 |
Исходя из таблицы полученных замеров можно сделать следующие выводы:
1 - Чем больше условий отбора в запросе, тем длительнее время выполнения запроса.
2 - Исходя из 2 (второй) строки таблицы можно сделать заключение о том, что при выполнении первого условия косвенно выполняется второе. По сути первое условие уже содержит второе (всегда будет "ИСТИНА", поскольку у группы не может быть признака использования характеристик). Как результат - увеличение времени выполнения запроса.
3 - Порядок условий влияет на результат.
№
|
Особенности
|
Текст запроса
|
Время выполнения
|
|||
Лучшее
|
Худшее
|
Среднее
|
Общее
|
|||
1 подход - через владельца номенклатуры | ||||||
1.1 | С оператором "Выразить" | ВЫБРАТЬ ВЫРАЗИТЬ(ХарактеристикиНоменклатуры.Владелец КАК Справочник.Номенклатура) КАК Номенклатура, ХарактеристикиНоменклатуры.Ссылка КАК Характеристика ИЗ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры ГДЕ ХарактеристикиНоменклатуры.Владелец ССЫЛКА Справочник.Номенклатура |
00.002,000 00.003,000 00.003,000 |
00.006,000 00.006,000 00.007,000 |
00.003,372 00.003,411 00.003,381 |
03.372,000 03.411,000 03.381,000 |
1.2 | Без оператора "Выразить" | ВЫБРАТЬ ХарактеристикиНоменклатуры.Владелец КАК Номенклатура, ХарактеристикиНоменклатуры.Ссылка КАК Характеристика ИЗ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры ГДЕ ХарактеристикиНоменклатуры.Владелец ССЫЛКА Справочник.Номенклатура |
00.004,000 00.004,000 00.004,000 |
00.008,000 00.009,000 00.014,000 |
00.004,924 00.004,948 00.004,989 |
04.924,000 04.948,000 04.989,000 |
1.3 | Недостоверные данные | ВЫБРАТЬ ВЫРАЗИТЬ(ХарактеристикиНоменклатуры.Владелец КАК Справочник.Номенклатура) КАК Номенклатура, ХарактеристикиНоменклатуры.Ссылка КАК Характеристика ИЗ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры |
00.002,000 00.002,000 00.002,000 |
00.004,000 00.005,000 00.006,000 |
00.003,201 00.003,209 00.003,271 |
03.201,000 03.209,000 03.271,000 |
1.4 | Недостоверные данные | ВЫБРАТЬ ХарактеристикиНоменклатуры.Владелец КАК Номенклатура, ХарактеристикиНоменклатуры.Ссылка КАК Характеристика ИЗ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры |
00.004,000 00.003,000 00.003,000 |
00.007,000 00.006,000 00.007,000 |
00.004,831 00.004,779 00.004,758 |
04.831,000 04.779,000 04.758,000 |
2 подход - через соединение таблиц (справочников) | ||||||
2.1 - соединение | ||||||
2.1.1 |
Внутреннее соединение "В лоб" по владельцу |
ВЫБРАТЬ Номенклатура.Ссылка КАК Номенклатура, ХарактеристикиНоменклатуры.Ссылка КАК Характеристика ИЗ Справочник.Номенклатура КАК Номенклатура ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры ПО (Номенклатура.Ссылка = ХарактеристикиНоменклатуры.Владелец) |
00.008,000 00.008,000 00.008,000 |
00.014,000 00.011,000 00.017,000 |
00.009,521 00.009,465 00.009,521 |
09.521,000 09.465,000 09.521,000 |
2.1.2 | Внутреннее соединение по виду номенклатуры и "В лоб" по владельцу |
ВЫБРАТЬ |
00.011,000 00.011,000 00.011,000 |
00.021,000 00.021,000 00.023,000 |
00.012,141 00.012,001 00.012,003 |
12.141,000 12.001,000 12.003,000 |
2.2 - соединение с последующими отборами | ||||||
2.2.1 |
Внутреннее соединение "В лоб" по владельцу, с отбором по признаку использования характеристик |
ВЫБРАТЬ Номенклатура.Ссылка КАК Номенклатура, ХарактеристикиНоменклатуры.Ссылка КАК Характеристика ИЗ Справочник.Номенклатура КАК Номенклатура ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры ПО (Номенклатура.Ссылка = ХарактеристикиНоменклатуры.Владелец) ГДЕ Номенклатура.ИспользованиеХарактеристик = ЗНАЧЕНИЕ(перечисление.ВариантыИспользованияХарактеристикНоменклатуры.ИндивидуальныеДляНоменклатуры) |
00.015,000 00.014,000 00.015,000 |
00.026,000 00.034,000 00.066,000 |
00.016,326 00.016,455 00.016,504 |
16.326,000 16.455,000 16.504,000 |
2.2.2 |
Внутреннее соединение "В лоб" по владельцу, с последующим отбором по признаку использования характеристик и типу ссылки владельца | ВЫБРАТЬ Номенклатура.Ссылка КАК Номенклатура, ХарактеристикиНоменклатуры.Ссылка КАК Характеристика ИЗ Справочник.Номенклатура КАК Номенклатура ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры ПО (Номенклатура.Ссылка = ХарактеристикиНоменклатуры.Владелец) ГДЕ Номенклатура.ИспользованиеХарактеристик = ЗНАЧЕНИЕ(перечисление.ВариантыИспользованияХарактеристикНоменклатуры.ИндивидуальныеДляНоменклатуры) и ХарактеристикиНоменклатуры.Владелец ССЫЛКА Справочник.Номенклатура |
00.015,000 00.015,000 00.015,000 |
00.028,000 00.031,000 00.028,000 |
00.016,418 00.016,367 00.016,449 |
16.418,000 16.367,000 16.449,000 |
2.2.3 | Внутреннее соединение с выражением типа владельца, с последующим отбором по признаку использования характеристик | ВЫБРАТЬ Номенклатура.Ссылка КАК Номенклатура, ХарактеристикиНоменклатуры.Ссылка КАК Характеристика ИЗ Справочник.Номенклатура КАК Номенклатура ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры ПО (Номенклатура.Ссылка = (ВЫРАЗИТЬ(ХарактеристикиНоменклатуры.Владелец КАК Справочник.Номенклатура))) ГДЕ Номенклатура.ИспользованиеХарактеристик = ЗНАЧЕНИЕ(перечисление.ВариантыИспользованияХарактеристикНоменклатуры.ИндивидуальныеДляНоменклатуры) |
00.015,000 00.015,000 00.015,000 |
00.035,000 00.024,000 00.025,000 |
00.017,070 00.016,777 00.016,786 |
17.070,000 16.777,000 16.786,000 |
2.2.4 | Внутреннее соединение с выражением типа владельца, с последующим отбором по признаку использования характеристик и типу ссылки владельца | ВЫБРАТЬ Номенклатура.Ссылка КАК Номенклатура, ХарактеристикиНоменклатуры.Ссылка КАК Характеристика ИЗ Справочник.Номенклатура КАК Номенклатура ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры ПО (Номенклатура.Ссылка = (ВЫРАЗИТЬ(ХарактеристикиНоменклатуры.Владелец КАК Справочник.Номенклатура))) ГДЕ Номенклатура.ИспользованиеХарактеристик = ЗНАЧЕНИЕ(перечисление.ВариантыИспользованияХарактеристикНоменклатуры.ИндивидуальныеДляНоменклатуры) и ХарактеристикиНоменклатуры.Владелец ССЫЛКА Справочник.Номенклатура |
00.015,000 00.016,000 00.015,000 |
00.034,000 00.031,000 00.032,000 |
00.016,756 00.016,883 00.016,785 |
16.756,000 16.883,000 16.785,000 |
2.3 - соединение с условиями | ||||||
2.3.1 | Внутреннее соединение с условием использования характеристик и "В лоб" по владельцу | ВЫБРАТЬ Номенклатура.Ссылка КАК Номенклатура, ХарактеристикиНоменклатуры.Ссылка КАК Характеристика ИЗ Справочник.Номенклатура КАК Номенклатура ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры ПО (Номенклатура.ИспользованиеХарактеристик = ЗНАЧЕНИЕ(перечисление.ВариантыИспользованияХарактеристикНоменклатуры.ИндивидуальныеДляНоменклатуры) И Номенклатура.Ссылка = ХарактеристикиНоменклатуры.Владелец) |
00.014,000 00.014,000 00.014,000 |
00.030,000 00.036,000 00.034,000 |
00.015,857 00.015,930 00.015,821 |
15.857,000 15.930,000 15.821,000 |
2.3.2 | Внутреннее соединение с условием использования характеристик и выражением владельца | ВЫБРАТЬ Номенклатура.Ссылка КАК Номенклатура, ХарактеристикиНоменклатуры.Ссылка КАК Характеристика ИЗ Справочник.Номенклатура КАК Номенклатура ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры ПО (Номенклатура.ИспользованиеХарактеристик = ЗНАЧЕНИЕ(перечисление.ВариантыИспользованияХарактеристикНоменклатуры.ИндивидуальныеДляНоменклатуры) И Номенклатура.Ссылка = (ВЫРАЗИТЬ(ХарактеристикиНоменклатуры.Владелец КАК Справочник.Номенклатура))) |
00.015,000 00.015,000 00.015,000 |
00.026,000 00.025,000 00.023,000 |
00.016,844 00.016,762 00.016,687 |
16.844,000 16.762,000 16.687,000 |
2.3.3 | Внутреннее соединение с условием использования характеристик, ограничением по типу ссылки и по владельцу | ВЫБРАТЬ Номенклатура.Ссылка КАК Номенклатура, ХарактеристикиНоменклатуры.Ссылка КАК Характеристика ИЗ Справочник.Номенклатура КАК Номенклатура ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры ПО (Номенклатура.ИспользованиеХарактеристик = ЗНАЧЕНИЕ(перечисление.ВариантыИспользованияХарактеристикНоменклатуры.ИндивидуальныеДляНоменклатуры) И ХарактеристикиНоменклатуры.Владелец ССЫЛКА Справочник.Номенклатура И Номенклатура.Ссылка = ХарактеристикиНоменклатуры.Владелец) |
00.015,000 00.014,000 00.014,000 |
00.026,000 00.039,000 00.037,000 |
00.015,925 00.016,455 00.016,027 |
15.925,000 16.455,000 16.027,000 |
2.3.4 | Внутреннее соединение с условием использования характеристик, ограничением по типу ссылки и выражением владельца | ВЫБРАТЬ Номенклатура.Ссылка КАК Номенклатура, ХарактеристикиНоменклатуры.Ссылка КАК Характеристика ИЗ Справочник.Номенклатура КАК Номенклатура ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры ПО (Номенклатура.ИспользованиеХарактеристик = ЗНАЧЕНИЕ(перечисление.ВариантыИспользованияХарактеристикНоменклатуры.ИндивидуальныеДляНоменклатуры) И ХарактеристикиНоменклатуры.Владелец ССЫЛКА Справочник.Номенклатура И Номенклатура.Ссылка = (ВЫРАЗИТЬ(ХарактеристикиНоменклатуры.Владелец КАК Справочник.Номенклатура))) |
00.015,000 00.015,000 00.015,000 |
00.026,000 00.019,000 00.022,000 |
00.016,851 00.016,745 00.016,782 |
16.851,000 16.745,000 16.782,000 |
1 - Лучший вариант - напрямую обращаться к реквизиту элемента, не делая соединений.
2 - Судя по запросам 1.1 и 1.2 - оператор "Выразить" влияет на результат достаточно серьезно в связке с ограничением типа ссылки.
3 - Внутреннее соединение "В лоб" - быстрее, чем любой дополнительный отбор как во время, так и после соединения таблиц.
4 - Количество отборов "до" или "во время" влияет на результат и при соединении. Стоит придерживаться стратегии наименьшего количества достаточных условий.
5 - Лучше соединение с условиями, чем последующий отбор.
ВНИМАНИЕ!!! Существенным недостатком 1 подхода считаю недостоверность данных. Конкретно в базе, на которой тестировал, пользователь сперва создал номенклатуру с индивидуальными характеристиками и создал характеристики, а потом поменял у номенклатуры вид на "без характеристик". Получилась ситуация, когда характеристика имеет владельца, но номенклатура-владелец не имеет признака использования характеристик.
№
|
Особенности
|
Текст запроса
|
Время выполнения
|
|||
Лучшее
|
Худшее
|
Среднее
|
Общее
|
|||
1 - соединение по владельцу | ||||||
1.1 - соединение по владельцу без условий | ||||||
1.1.1 | Внутреннее соединение "В лоб" по владельцу |
ВЫБРАТЬ |
00.002,000 00.002,000 00.002,000 |
00.004,000 00.005,000 00.011,000 |
00.003,007 00.003,048 00.003,051 |
03.007,000 03.048,000 03.051,000 |
1.1.2 | Внутреннее соединение "В лоб" по владельцу с выражением типа владельца | ВЫБРАТЬ Номенклатура.Ссылка КАК Номенклатура, ХарактеристикиНоменклатуры.Ссылка КАК Характеристика ИЗ Справочник.Номенклатура КАК Номенклатура ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры ПО (Номенклатура.ВидНоменклатуры = (ВЫРАЗИТЬ(ХарактеристикиНоменклатуры.Владелец КАК Справочник.ВидыНоменклатуры))) |
00.003,000 00.004,000 00.004,000 |
00.005,000 00.012,000 00.009,000 |
00.004,679 00.004,712 00.004,707 |
04.679,000 04.712,000 04.707,000 |
1.2 - соединение по владельцу с последующим наложением условий | ||||||
1.2.1 | Внутреннее соединение "В лоб" по владельцу, с последующим отбором по признаку использования характеристик |
ВЫБРАТЬ |
00.002,000 00.002,000 00.002,000 |
00.011,000 00.010,000 00.010,000 |
00.003,377 00.003,413 00.003,371 |
03.377,000 03.413,000 03.371,000 |
1.2.2 | Внутреннее соединение "В лоб" по владельцу, с последующим отбором по признаку использования характеристик и типу ссылки владельца |
ВЫБРАТЬ |
00.002,000 00.003,000 00.002,000 |
00.010,000 00.010,000 00.009,000 |
00.003,436 00.003,430 00.003,454 |
03.436,000 03.430,000 03.454,000 |
1.2.3 | Внутреннее соединение с выражением типа владельца и последующим отбором по признаку использования характеристик и типу ссылки владельца |
ВЫБРАТЬ |
00.003,000 00.003,000 00.003,000 |
00.011,000 00.012,000 00.007,000 |
00.003,996 00.003,945 00.003,777 |
03.996,000 03.945,000 03.777,000 |
1.3 - соединение по владельцу с условиями | ||||||
1.3.1 | Внутреннее соединение с условием использования характеристик и "В лоб" по владельцу | ВЫБРАТЬ Номенклатура.Ссылка КАК Номенклатура, ХарактеристикиНоменклатуры.Ссылка КАК Характеристика ИЗ Справочник.Номенклатура КАК Номенклатура ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры ПО (Номенклатура.ИспользованиеХарактеристик = ЗНАЧЕНИЕ(перечисление.ВариантыИспользованияХарактеристикНоменклатуры.ОбщиеДляВидаНоменклатуры)) И (Номенклатура.ВидНоменклатуры = ХарактеристикиНоменклатуры.Владелец) |
00.003,000 00.002,000 00.002,000 |
00.005,000 00.004,000 00.006,000 |
00.003,332 00.003,333 00.003,331 |
03.332,000 03.333,000 03.331,000 |
1.3.2 | Внутреннее соединение с условием использования характеристик и выражением владельца | ВЫБРАТЬ Номенклатура.Ссылка КАК Номенклатура, ХарактеристикиНоменклатуры.Ссылка КАК Характеристика ИЗ Справочник.Номенклатура КАК Номенклатура ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры ПО (Номенклатура.ИспользованиеХарактеристик = ЗНАЧЕНИЕ(перечисление.ВариантыИспользованияХарактеристикНоменклатуры.ОбщиеДляВидаНоменклатуры)) И (Номенклатура.ВидНоменклатуры = (ВЫРАЗИТЬ(ХарактеристикиНоменклатуры.Владелец КАК Справочник.ВидыНоменклатуры))) И (Номенклатура.ВидНоменклатуры = ХарактеристикиНоменклатуры.Владелец) |
00.003,000 00.003,000 00.003,000 |
00.005,000 00.010,000 00.005,000 |
00.003,983 00.004,013 00.003,993 |
03.983,000 04.013,000 03.993,000 |
1.3.3 | Внутреннее соединение с условием использования характеристик, ограничением по типу ссылки и по владельцу | ВЫБРАТЬ Номенклатура.Ссылка КАК Номенклатура, ХарактеристикиНоменклатуры.Ссылка КАК Характеристика ИЗ Справочник.Номенклатура КАК Номенклатура ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры ПО (Номенклатура.ИспользованиеХарактеристик = ЗНАЧЕНИЕ(перечисление.ВариантыИспользованияХарактеристикНоменклатуры.ОбщиеДляВидаНоменклатуры) И ХарактеристикиНоменклатуры.Владелец ССЫЛКА Справочник.ВидыНоменклатуры И Номенклатура.ВидНоменклатуры = ХарактеристикиНоменклатуры.Владелец) |
00.003,000 00.003,000 00.002,000 |
00.005,000 00.008,000 00.007,000 |
00.003,407 00.003,395 00.003,502 |
03.407,000 03.395,000 03.502,000 |
1.3.4 | Внутреннее соединение с условием использования характеристик, ограничением по типу ссылки и выражением владельца |
ВЫБРАТЬ |
00.003,000 00.003,000 00.003,000 |
00.005,000 00.005,000 00.007,000 |
00.004,059 00.004,057 00.004,053 |
04.059,000 04.057,000 04.053,000 |
2 - соединение по виду | ||||||
2.1 - соединение по виду без условий | ||||||
2.1.1 |
Внутреннее соединение "В лоб" по владельцу характеристик номенклатуры, не подходит для соединения по виду |
ВЫБРАТЬ Номенклатура.Ссылка КАК Номенклатура, ХарактеристикиНоменклатуры.Ссылка КАК Характеристика ИЗ Справочник.Номенклатура КАК Номенклатура ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры ПО (Номенклатура.ВладелецХарактеристик= ХарактеристикиНоменклатуры.ВидНоменклатуры) |
00.002,000 00.002,000 00.002,000 |
00.004,000 00.004,000 00.005,000 |
00.003,156 00.003,159 00.003,177 |
03.156,000 03.159,000 03.177,000 |
2.2 - соединение по виду с отборами | ||||||
2.2.1 | Внутреннее соединение "В лоб" по виду номенклатуры, с последующим отбором по признаку использования характеристик | ВЫБРАТЬ Номенклатура.Ссылка КАК Номенклатура, ХарактеристикиНоменклатуры.Ссылка КАК Характеристика ИЗ Справочник.Номенклатура КАК Номенклатура ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры ПО (Номенклатура.ВидНоменклатуры = ХарактеристикиНоменклатуры.ВидНоменклатуры) ГДЕ Номенклатура.ИспользованиеХарактеристик = ЗНАЧЕНИЕ(перечисление.ВариантыИспользованияХарактеристикНоменклатуры.ОбщиеДляВидаНоменклатуры) |
00.003,000 00.002,000 00.002,000 |
00.004,000 00.006,000 00.004,000 |
00.003,441 00.003,456 00.003,441 |
03.441,000 03.456,000 03.441,000 |
2.3 - соединение по виду с условиями | ||||||
2.3.1 | Внутреннее соединение с условием использования характеристик | ВЫБРАТЬ Номенклатура.Ссылка КАК Номенклатура, ХарактеристикиНоменклатуры.Ссылка КАК Характеристика ИЗ Справочник.Номенклатура КАК Номенклатура ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры ПО (Номенклатура.ИспользованиеХарактеристик = ЗНАЧЕНИЕ(перечисление.ВариантыИспользованияХарактеристикНоменклатуры.ОбщиеДляВидаНоменклатуры) И Номенклатура.ВидНоменклатуры = ХарактеристикиНоменклатуры.ВидНоменклатуры) |
00.003,000 00.002,000 00.002,000 |
00.005,000 00.005,000 00.005,000 |
00.003,476 00.003,431 00.003,458 |
03.476,000 03.431,000 03.458,000 |
К сожалению, рабочей базы с подходящей номенклатурой под рукой нет, замеры проводил на демо.
Различных вариантов получилось много.
Как и в предыдущих замерах соединение с последующим отбором занимает больше времени, чем отбор во время соединения. Так же многие условия косвенно уже выполняются (1.2.1 например, если владелец вид номенклатуры - то это общие характеристики, проверять после этого номенклатуру не имеет особого смысла).
Лучший вариант по замерам: просто соединить по реквизиту номенклатуры.
Особенности
|
Текст запроса
|
Время выполнения
|
|||
Лучшее
|
Худшее
|
Среднее
|
Общее
|
||
4 подзапроса | |||||
Объединение из самых быстрых |
ВЫБРАТЬ ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ |
00.017,000 00.016,000 00.017,000 |
00.039,000 00.032,000 00.026,000 |
00.017,999 00.018,012 00.017,944 |
17.999,000 18.012,000 17.944,000 |
3 подзапроса | |||||
запрос явно не оптимальный, хотя и сокращает количество подзапросов |
ВЫБРАТЬ ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ |
03.068,000 | 08.579,000 | 03.829,317 | 1:03:49.317,000 |
Изменил на соединение по виду номенклатуры. Чуть быстрее, но все равно не оптимально. |
ВЫБРАТЬ ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ |
03.001,000 | - | - | - |
2 подзапроса | |||||
явно не оптимально |
ВЫБРАТЬ ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ |
03.514,000 | |||
явно не оптимально |
ВЫБРАТЬ ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ |
03.701,000 | |||
1 подзапрос | |||||
долго, нудно... но одним подзапросом | ВЫБРАТЬ Номенклатура.Ссылка КАК Номенклатура, ЕСТЬNULL(ХарактеристикиНоменклатуры.Ссылка, ЗНАЧЕНИЕ(справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)) КАК Характеристика ИЗ Справочник.Номенклатура КАК Номенклатура ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры ПО (ВЫБОР КОГДА Номенклатура.ИспользованиеХарактеристик = ЗНАЧЕНИЕ(перечисление.ВариантыИспользованияХарактеристикНоменклатуры.ИндивидуальныеДляНоменклатуры) И ХарактеристикиНоменклатуры.Владелец ССЫЛКА Справочник.Номенклатура ТОГДА Номенклатура.Ссылка = (ВЫРАЗИТЬ(ХарактеристикиНоменклатуры.Владелец КАК Справочник.Номенклатура)) КОГДА Номенклатура.ИспользованиеХарактеристик = ЗНАЧЕНИЕ(перечисление.ВариантыИспользованияХарактеристикНоменклатуры.ОбщиеДляВидаНоменклатуры) ТОГДА Номенклатура.ВидНоменклатуры = ХарактеристикиНоменклатуры.ВидНоменклатуры КОГДА Номенклатура.ИспользованиеХарактеристик = ЗНАЧЕНИЕ(перечисление.ВариантыИспользованияХарактеристикНоменклатуры.ОбщиеСДругимВидомНоменклатуры) ТОГДА Номенклатура.ВладелецХарактеристик = ХарактеристикиНоменклатуры.ВидНоменклатуры КОНЕЦ) ГДЕ НЕ Номенклатура.ЭтоГруппа И ВЫБОР КОГДА не Номенклатура.ИспользованиеХарактеристик = ЗНАЧЕНИЕ(перечисление.ВариантыИспользованияХарактеристикНоменклатуры.неИспользовать) И ХарактеристикиНоменклатуры.Ссылка ЕСТЬ NULL ТОГДА ЛОЖЬ ИНАЧЕ ИСТИНА КОНЕЦ |
03.951,000 |
Заключаем, что "Выбор" при соединении замедляет скорость запроса.
Для того, чтобы все собрать в один подзапрос пришлось делать "Левое" соединение.
Без проверки на NULL запрос вытаскивал номенклатуру с отсутствующим списком характеристик (номенклатуру создали, характеристики к ней еще нет).
Запрос для быстрого вывода всей номенклатуры со всеми характеристиками, состоит из 4 подзапросов
ВЫБРАТЬ
Номенклатура.Ссылка КАК Номенклатура,
ЗНАЧЕНИЕ(справочник.ХарактеристикиНоменклатуры.ПустаяСсылка) КАК Характеристика
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.ИспользованиеХарактеристик = ЗНАЧЕНИЕ(перечисление.ВариантыИспользованияХарактеристикНоменклатуры.неИспользовать)
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ВЫРАЗИТЬ(ХарактеристикиНоменклатуры.Владелец КАК Справочник.Номенклатура),
ХарактеристикиНоменклатуры.Ссылка
ИЗ
Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
ГДЕ
ХарактеристикиНоменклатуры.Владелец ССЫЛКА Справочник.Номенклатура
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
Номенклатура.Ссылка КАК Номенклатура,
ХарактеристикиНоменклатуры.Ссылка КАК Характеристика
ИЗ
Справочник.Номенклатура КАК Номенклатура
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
ПО (Номенклатура.ВидНоменклатуры = ХарактеристикиНоменклатуры.Владелец)
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
Номенклатура.Ссылка,
ХарактеристикиНоменклатуры.Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
ПО Номенклатура.ВладелецХарактеристик = ХарактеристикиНоменклатуры.ВидНоменклатуры
Запрос вывода всей номенклатуры в одном подзапросе
ВЫБРАТЬ
Номенклатура.Ссылка КАК Номенклатура,
ЕСТЬNULL(ХарактеристикиНоменклатуры.Ссылка, ЗНАЧЕНИЕ(справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)) КАК Характеристика
ИЗ
Справочник.Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
ПО (ВЫБОР
КОГДА Номенклатура.ИспользованиеХарактеристик = ЗНАЧЕНИЕ(перечисление.ВариантыИспользованияХарактеристикНоменклатуры.ИндивидуальныеДляНоменклатуры)
И ХарактеристикиНоменклатуры.Владелец ССЫЛКА Справочник.Номенклатура
ТОГДА Номенклатура.Ссылка = (ВЫРАЗИТЬ(ХарактеристикиНоменклатуры.Владелец КАК Справочник.Номенклатура))
КОГДА Номенклатура.ИспользованиеХарактеристик = ЗНАЧЕНИЕ(перечисление.ВариантыИспользованияХарактеристикНоменклатуры.ОбщиеДляВидаНоменклатуры)
ТОГДА Номенклатура.ВидНоменклатуры = ХарактеристикиНоменклатуры.ВидНоменклатуры
КОГДА Номенклатура.ИспользованиеХарактеристик = ЗНАЧЕНИЕ(перечисление.ВариантыИспользованияХарактеристикНоменклатуры.ОбщиеСДругимВидомНоменклатуры)
ТОГДА Номенклатура.ВладелецХарактеристик = ХарактеристикиНоменклатуры.ВидНоменклатуры
КОНЕЦ)
ГДЕ
НЕ Номенклатура.ЭтоГруппа
И ВЫБОР
КОГДА не Номенклатура.ИспользованиеХарактеристик = ЗНАЧЕНИЕ(перечисление.ВариантыИспользованияХарактеристикНоменклатуры.неИспользовать)
И ХарактеристикиНоменклатуры.Ссылка ЕСТЬ NULL
ТОГДА ЛОЖЬ
ИНАЧЕ ИСТИНА
КОНЕЦ
Надеюсь, что замеры и различные подходы, приведенные в данной статье, помогут Вам найти наилучшее решение для выполнения Вашей задачи.
Тестирование проводилось на УТ 11.4.13.155.
Прикладываю файл запросов, открывать Универсальные инструменты 1С