8.х Пакеты запросов

Тема в разделе "Общие вопросы "1С:Предприятие 8"", создана пользователем Tiger86, 13 окт 2011.

  1. TopicStarter Overlay
    Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    подкиньте ссылок на литературу по данному вопросу, чего-то замкнуло и не найду никак ничего, а хотелось бы понять как они работают...
  2. vartanet
    Offline

    vartanet Опытный в 1С Команда форума

    Регистрация:
    16 ноя 2010
    Сообщения:
    2.698
    Симпатии:
    15
    Баллы:
    29
  3. TopicStarter Overlay
    Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    поисковиками я уже искала (все равно спасибо), просто подумала. что наверняка в книжках каких есть... (а то мне одни статьи и заметки попадались)

    а как на практике они себя ведут по вашему? вроде народ сходится во мнении, что быстрее они...
  4. vartanet
    Offline

    vartanet Опытный в 1С Команда форума

    Регистрация:
    16 ноя 2010
    Сообщения:
    2.698
    Симпатии:
    15
    Баллы:
    29
    они очень повышают читабельность, что уменьшает вероятность ошибок => мне уже одного этого достаточно.



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

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

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

    Следует понимать, что переписав запрос таким образом, мы, возможно, внесли в него некоторое замедление за счет дополнительных накладных расходов - создания временных таблиц. Если СУБД не ошибется с выбором плана, то она, возможно, выполнит старый запрос быстрее, чем новый. Однако, это замедление всегда будет крайне незначительным. Размер замедления зависит от используемой СУБД и производительности оборудования. В типичном случае на создание одной временной таблицы может уйти несколько миллисекунд. То есть, эти замедления не могут оказать заметного влияния на производительность системы и как правило ими можно пренебречь.
  5. uza
    Offline

    uza 1С, VBA (EXCEL), VB (.NET + WEB)

    Регистрация:
    10 июл 2007
    Сообщения:
    1.845
    Симпатии:
    1
    Баллы:
    29
    Работают они точно так же, как и в других "взрослых" СУБД типа MS SQL
    Запрос состоит из частей. По сути каждая часть помещается во временную таблицу. По окончании выполнения временные таблицы уничтожаются (если запросу не был явным образом инициирован менеджер временных таблиц) и на выходе имеем только одну таблу - результата.

    Если же мы не используем временные таблицы внутри запроса, а лепим ВЫБРАТЬ тбл.четатам ИЗ (выбрать .. из ..) КАК тбл - то на уровне СУБД (или даже ядра СУБД) все равно будут инициированы временные таблицы.

    Скорость работы кучи выборок в одном запросе быстрее чем 10 запросов подряд. Потому что:
    1) Интерпретатору 1С не надо 10 раз переводить запрос в "родной" язык СУБД
    2) 1Совскому серверу не надо 10 раз подряд гонять данные от сервера (MS SQL) к клиенту (в данном случае сервер 1С для MS SQLя является клиентом)
    3) Временные таблицы размещаются на сервере СУБД. MS SQL и Oracle это дело оптимизируют, и стараются разместить их в оперативке а не на диске - что естественно быстрее.

Поделиться этой страницей