Закажите бесплатный расчет стоимости вашей задачи по 1С!
Перезвоним за 10 минут! (в рабочие часы)

Индексирование временных таблиц в запросе 1С 8.3 (8.2)

Разработчики 1С очень часто игнорируют использование конструкции «ИНДЕКСИРОВАТЬ ПО» в запросе.

Зачем нужно индексировать поля в запросе 1С 8.3, я расскажу ниже.

Использование в запросе

Как работает ИНДЕКСИРОВАТЬ ПО?

Индексация в запросе нужна для более быстрого формирования результате запроса. Как это работает? Система строит индекс для временной таблицы, чтобы быстрее найти нужное значение.

Т.е. система работает точно так же, как и обычные индексы 1С, только для временной таблицы.

Где и как нужно использовать ИНДЕКСИРОВАТЬ ПО ?

Конструкцию рекомендуется использовать по полям временных таблиц, по которым эта временная таблица будет соединяться с другими таблицами баз данных. Это существенно повышает скорость выполнения соединения таблиц.

Однако следует учесть один момент. Построение индекса временной таблицы также требует времени на выполнение. Поэтому целесообразно использовать конструкцию «ИНДЕКСИРОВАТЬ ПО», только если Вы знаете, что во временной таблице будет не 1-2 записи. В противном случае эффект может быть обратным — быстродействие от индексированных полей не компенсирует времени построения индекса.

К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.

Остались вопросы?

СПРОСИТЕ в комментариях!

Комментариев: 17 на “Индексирование временных таблиц в запросе 1С 8.3 (8.2)
  1. 1. Что значит «рекомендуется использовать по полям временных таблиц, по которым эта временная таблица будет соединяться с другими таблицами баз данных»? У меня есть левое соединение где в правой части — таблица базы данных. Зачем индексировать временную таблицу если при выборке будет проводиться поиск в правой таблице? То есть индекс временной таблицы в данном случае не функционален.
    2. Если я связываю 2 временные таблицы левым соединением, какую таблицу я должен индексировать?
    3. В приведённом примере — какой смысл индексировать таблицу по единственному полю, если в индексе получается такое же количество записей как в таблице и (следовательно) обход индекса при выборке занимает примерно столько же времени?
    Такое впечатление, что писали статью «чтоб было», не думая.

    Ответить

    • 1. Вы просто индексы готовить не умеете, потому как у Вас поверхностные знания общих принципов применения и работы индексов на платформах БД. Вообще есть определенные стандарты, согласно которым проектировщики платформ БД (вменяемые) следуют, иначе спроса на их платформу не будет.
      Так вот ответ на ваш вопрос — раз у вас в левом соединении временная таблица и по ней в самом запросе не идут поиск — значит у вас данные из левой таблицы выводятся в результат запроса (иначе зачем тогда Вам вообще левое соединение). А соответственно соединение по имеющимся записям в левой таблице может идти по ее (левой таблицы) индексу или по поиску (перебору) всех записей этой левой таблицы. И так по каждой строке правой. Да, если записей мало — то результат не так заметен, а то и даже… но когда записей много… Поймите — соединение, какое оно бы ни было — это соединение. И в данном случае можно всю таблицу перебирать, а можно по индексу сработать.
      2. Если нужно получить максимально быстро результат выборки, особенно если многократно с этими временными таблицами — то обе. При соединении (не важно каком именно) платформа БД при наличии индекса на поле таблице — работает всегда по индексу. Это всегда быстрее.
      3. Автор как раз понимает тему, это Вы не в теме и совершенно не представляете как работают индексы. Да, записей в индексе столько же будет, но принцип работы по индексу совершенно другой. Возможно, если у вас обе таблицы абсолютно аналогично отсортированы по полям соединения — то может и не такой эффект будет — но ведь это как правило не так…
      В общем вывод — статью писали думая — это Вы ответили, не подумав…

      Ответить

      • Ваш комментарий выдает не слишком грамотного новичка.
        Грамотный человек дает правильное решение, не выдавая свои эмоций, которые никого не интересуют.

        Ответить

    • 2. Судя по статье ИТС — правую
      https://its.1c.ru/db/v8std#content:2149184307:hdoc

      Ответить

  2. Отличная статья! Я например до этой статьи вообще не знал что в запросах есть команда ИНДЕКСИРОВАТЬ ПО.
    Хотя с фифо и лифо пока не понятно, но статья дала много света, открыла новое понимание некоторых вещей, по которым я был в тупике. Большое спасибо автору.

    Ответить

  3. Можно ли создать несколько индексов для одной временной таблицы ?

    Ответить

    • можно

      Ответить

    • Нет. Можно создать 1 простой или составной индекс.

      Ответить

  4. Я может, конечно, неопытный программист 1С и неправильно что-то делаю. Но сколько я не пытался использовать индексы в запросах, никакого прироста быстродействия ни разу не заметил, а наоборот чуть дольше всё выполняется. Я даже пробовал брал стандартные запросы из конфигурации (которые, казалось бы, писали опытные люди, разработчики) и сравнивал что будет если УБРАТЬ индексирование. Например процедура контроля остатков из регистра накопления «Товары организаций». Там данные выбираются из ТЧ документа, помещаются во временную таблицу, в таблице строятся индексы по «Номенклатура» и «Серия номенклатуры». Потом тоже самое с остатками по регистру накопления. А потом эти две таблицы соединяются по номенклатуре и серии. Казалось бы, и там и там есть индексы. Но если тот же запрос выполнять убрав индексирование, то он работает БЫСТРЕЕ. Тестировал на документах в 300 И в 500 строк. В реальности такие документы, кстати, встречаются редко, обычно строк гораздо меньше.

    Ответить

    • 300 и 500 строк это не то количество на котором индексирование стоило бы делать, примерно с 5-10 тысяч ощущается прирост в скорости от индесирования.
      Есть ещё один минус индекса в запросе. Временная таблица помещается в оперативной памяти, а с индексом временная таблица занимает в ней больше места.. Если же sql решит сбросить временную таблицу в служебную tempbd, то все будет ещё печальнее

      Ответить

      • Временная таблица помещается не в оперативную память, а в tempdb.

        Ответить

    • Про прирост скорости.
      Недавно обратились финансисты к нам с проблемой: «Флэш отчет формируется оч долго, помогите.»
      Данных для обработки много, в месяц измеряется количеством строк 100к+.
      Прошерстили отчет, во всех запросах проставили индексацию во всех ВТ и вуаля, вместо 3 часов отчет отрабатывает за 30 сек — минуту.

      Ответить

  5. А индекс какой — кластеризованный?

    Ответить

    • Прирост скорости от индекса скорее исключение, чем правило

      Ответить

  6. А если написать
    ИНДЕКСИРОВАТЬ ПО
    Поле1,
    Поле2
    создадутся три индекса: Поле1, Поле2, Поле1+Поле2, правильно?

    Ответить

    • Создатся 1 индекс с полями «Поле1» и «Поле2»

      Ответить

  7. пасипки. вроде на опыте , а иногда помогает вспомнить

    Ответить

Добавить комментарий:

Ваш адрес email не будет опубликован.