8.х Есть ли смысл в этом запросе делать индексирование

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Robix, 19 май 2015.

  1. TopicStarter Overlay
    Robix
    Offline

    Robix Опытный в 1С

    Регистрация:
    1 апр 2012
    Сообщения:
    133
    Симпатии:
    1
    Баллы:
    29
    Здравствуйте, подскажите, есть ли смысл в этом запросе делать индексирование и если есть, то по каким полям и почему вы считаете, что нужно делать индексирование?

    Код:
    ВЫБРАТЬ
        ТребованиеНакладнаяМатериалы.Номенклатура КАК Номенклатура,
        ТребованиеНакладнаяМатериалы.Количество КАК Количество,
        ТребованиеНакладнаяМатериалы.Ссылка КАК Документ
    ПОМЕСТИТЬ ТаблицаТребованийНакладных
    ИЗ
        Документ.ТребованиеНакладная.Материалы КАК ТребованиеНакладнаяМатериалы
    ГДЕ
        ТребованиеНакладнаяМатериалы.Ссылка.Проведен
        И ТребованиеНакладнаяМатериалы.Количество > 0
     
    ;
     
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ПередачаМатериаловВЭксплуатациюСпецодежда.Номенклатура КАК Номенклатура,
        ПередачаМатериаловВЭксплуатациюСпецодежда.Количество КАК Количество,
        ПередачаМатериаловВЭксплуатациюСпецодежда.Ссылка КАК Документ
    ПОМЕСТИТЬ ТаблицаПередачМатериаловВЭксплуатацию
    ИЗ
        Документ.ПередачаМатериаловВЭксплуатацию.Спецодежда КАК ПередачаМатериаловВЭксплуатациюСпецодежда
    ГДЕ
        ПередачаМатериаловВЭксплуатациюСпецодежда.Ссылка.Проведен
        И ПередачаМатериаловВЭксплуатациюСпецодежда.Количество > 0
       
    ;
     
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ХозрасчетныйОборотыДтКт.СубконтоКт1 КАК Номенклатура,
        ХозрасчетныйОборотыДтКт.КоличествоОборотКт КАК Количество,
        ХозрасчетныйОборотыДтКт.Регистратор КАК Регистратор
    ПОМЕСТИТЬ ТаблицаОборотов
    ИЗ
        РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт(&НачалоПериода, &ОкончаниеПериода, Регистратор, СчетДт = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ОбщепроизводственныеРасходы), , СчетКт В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Материалы)), , Организация = &Организация) КАК ХозрасчетныйОборотыДтКт
    ГДЕ
        ХозрасчетныйОборотыДтКт.КоличествоОборотКт > 0
        И (ХозрасчетныйОборотыДтКт.Регистратор ССЫЛКА Документ.ТребованиеНакладная
                ИЛИ ХозрасчетныйОборотыДтКт.Регистратор ССЫЛКА Документ.ПередачаМатериаловВЭксплуатацию)
    ;
     
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ТаблицаТребованийНакладных.Документ.Дата КАК Дата,
        ТаблицаТребованийНакладных.Документ КАК Документ,
        ТаблицаТребованийНакладных.Номенклатура КАК Номенклатура
    ПОМЕСТИТЬ ТаблицаТребованийНакладныхСРасхождениями
    ИЗ
        ТаблицаОборотов КАК ТаблицаОборотов
            ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаТребованийНакладных КАК ТаблицаТребованийНакладных
            ПО ТаблицаОборотов.Регистратор = ТаблицаТребованийНакладных.Документ
                И ТаблицаОборотов.Номенклатура = ТаблицаТребованийНакладных.Номенклатура
                И ТаблицаОборотов.Количество <> ТаблицаТребованийНакладных.Количество
    ;
     
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ТаблицаПередачМатериаловВЭксплуатацию.Документ.Дата КАК Дата,
        ТаблицаПередачМатериаловВЭксплуатацию.Документ КАК Документ,
        ТаблицаПередачМатериаловВЭксплуатацию.Номенклатура КАК Номенклатура
    ПОМЕСТИТЬ ТаблицаПередачМатериаловВЭксплуатациюСРасхождениями
    ИЗ
        ТаблицаОборотов КАК ТаблицаОборотов
            ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаПередачМатериаловВЭксплуатацию КАК ТаблицаПередачМатериаловВЭксплуатацию
            ПО ТаблицаОборотов.Регистратор = ТаблицаПередачМатериаловВЭксплуатацию.Документ
                И ТаблицаОборотов.Номенклатура = ТаблицаПередачМатериаловВЭксплуатацию.Номенклатура
                И ТаблицаОборотов.Количество <> ТаблицаПередачМатериаловВЭксплуатацию.Количество
    ;
     
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ТаблицаТребованийНакладныхСРасхождениями.Дата КАК Дата,
        ТаблицаТребованийНакладныхСРасхождениями.Документ КАК Документ,
        ТаблицаТребованийНакладныхСРасхождениями.Номенклатура КАК Номенклатура
    ИЗ
        ТаблицаТребованийНакладныхСРасхождениями КАК ТаблицаТребованийНакладныхСРасхождениями
     
    СГРУППИРОВАТЬ ПО
        ТаблицаТребованийНакладныхСРасхождениями.Документ,
        ТаблицаТребованийНакладныхСРасхождениями.Номенклатура,
        ТаблицаТребованийНакладныхСРасхождениями.Дата
     
    ОБЪЕДИНИТЬ
     
    ВЫБРАТЬ
        ТаблицаПередачМатериаловВЭксплуатациюСРасхождениями.Дата,
        ТаблицаПередачМатериаловВЭксплуатациюСРасхождениями.Документ,
        ТаблицаПередачМатериаловВЭксплуатациюСРасхождениями.Номенклатура
    ИЗ
        ТаблицаПередачМатериаловВЭксплуатациюСРасхождениями КАК ТаблицаПередачМатериаловВЭксплуатациюСРасхождениями
     
    СГРУППИРОВАТЬ ПО
        ТаблицаПередачМатериаловВЭксплуатациюСРасхождениями.Документ,
        ТаблицаПередачМатериаловВЭксплуатациюСРасхождениями.Номенклатура,
        ТаблицаПередачМатериаловВЭксплуатациюСРасхождениями.Дата
     
    УПОРЯДОЧИТЬ ПО
        Дата,
        Документ
  2. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.547
    Симпатии:
    344
    Баллы:
    104
    Консоль запросов с замером производительности скажет надо или нет.

    Объясните смысл первых двух временных таблиц в этом запросе? Для чего собственно говоря?
    Да и четвертая пятая не нужны.
    И вообще это все без временных таблиц можно сделать одним запросом.
    Не вижу в данном случае особой необходимости в использовании временных таблиц.
    Исходя из вышесказанного - индексирование вероятно не нужно.
  3. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.722
    Симпатии:
    961
    Баллы:
    204
    Добрый день!
    Шурик не совсем с тобой согласен
    Отвечу обще, думаю Вам будет понято когда есть смысл индексировать, когда нет
    У 1С есть такое правило:
    "При написании запросов не следует использовать соединения с подзапросами"

    Т.е если у вас есть в левой части запрос и в правой то соединять их нежелательное. Надо правую часть сделать виртуальной таблицей и уже соединять
    почему?
    Существуют несколько алгоритмов соединения двух выборок. Выбор того или иного алгоритма зависит от того, сколько записей будет содержаться в одной и в другой выборке. В том случае, если вы соединяете две физические таблицы, СУБД может легко определить объем обоих выборок на основании имеющейся статистики. Если же одна из соединяемых выборок представляет собой подзапрос, то понять, какое количество записей она вернет, становится очень сложно. В этом случае СУБД может ошибиться с выбором плана, что приведет падению производительности запроса.
    Не буду углу*****ся в ято при определнных обстоятельствах (регулярном и частом сборе статистик и т.д) можно избежать потерь но все же.
    Так вот . когда же СУБД иметт две реальные таблицы с данные то она более оптимально может выбрать вариант соединения
    По этому правую часть обычно засовывают в виртуальную таблицу
    Т.е перед соединением СУБД уже знает с каким количеством соединять.
    Так вот индексировать или нет - это уже зависит от Ваших объемов правой таблицы
    Если у Вас там данных очень много то есть смысл индексировать т.к Это уже талица и в ней будет осущетвляться поиск.
    Ну пример. если в правой стороне вы выгрузили и у вас там справочник номенклатура с 15 0000 пзиций то есть смысл индексировать для быстрого поиска и соединения. если справочник подразделения где максимум 25 позиций то не стоит.
  4. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.547
    Симпатии:
    344
    Баллы:
    104
    Андрей так то оно так.
    Только по факту: на построение индекса + последующее соединение система тратит больше времени, чем на просто соединение без индексирования.
    Смотри, накидал пример (абсолютно не важно что он возвращает, бессмысленный):
    Код:
    ВЫБРАТЬ
        Контрагенты.Ссылка
    ПОМЕСТИТЬ ВТ_Контр
    ИЗ
        Справочник.Контрагенты КАК Контрагенты
    ГДЕ
        НЕ Контрагенты.ЭтоГруппа
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ВозвратТоваровОтПокупателя.Ссылка,
        ВозвратТоваровОтПокупателя.Контрагент КАК Контрагент
    ПОМЕСТИТЬ ВТ_Возвраты
    ИЗ
        Документ.ВозвратТоваровОтПокупателя КАК ВозвратТоваровОтПокупателя
    
    ИНДЕКСИРОВАТЬ ПО
        Контрагент
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ВТ_Контр.Ссылка,
        ВТ_Возвраты.Ссылка КАК Ссылка1
    ИЗ
        ВТ_Контр КАК ВТ_Контр
            ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Возвраты КАК ВТ_Возвраты
            ПО ВТ_Контр.Ссылка = ВТ_Возвраты.Контрагент
    
    Если убрать Индексирование из второй временной таблицы, то он будет работать быстрее.
  5. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.722
    Симпатии:
    961
    Баллы:
    204
    Шурик. это ясно, я же написал что надо понимать какие объемы данных , я же не думаю что возратов там больше чем реализация и они по 100 штук на день.
    Просто представь какой нить АШАН или КАМАЗ с его списком запчастей и при том что эта Временная таблица может сразу не уничтозатся а использоваться в нескольких запросах и т.д тогда есть смысл проиндексировать
  6. TopicStarter Overlay
    Robix
    Offline

    Robix Опытный в 1С

    Регистрация:
    1 апр 2012
    Сообщения:
    133
    Симпатии:
    1
    Баллы:
    29
    Спасибо, теперь намного яснее стало про индексирование.