Курс по Оптимизации 1С — Занятие №6

В рамках этого занятия необходимо изучить следующие темы Главы 8.

Модуль 3. Анализ причин медленной работы и оптимизация системы

    Глава 8. Причины медленной работы

    • Обзор основных причин неоптимальной работы запроса
    • Невыполнение регламентных операций СУБД
    • Неоптимальные соединения таблиц
    • Основные сведения о индексах. Когда индекс не может быть использован

Практическое задание

Скачивайте практические задания в формате PDF:

К сожалению, у Вас недостаточно прав для дальнейшего просмотра.

Если Вы приобрели курс, но еще не активировали токен — пожалуйста, активируйте доступ по инструкциям, высланным на Ваш email после покупки.

Если Вы не залогинены на сайте — залогиньтесь, вернитесь на эту страницу и обновите ее.

Если Вы залогинены, у Вас активирован токен доступа, но Вы все равно видите эту запись — напишите нам на e-mail поддержки.

Комментарии / обсуждение (229):

  1. egori

    Выполняю следующий запрос:

    ВЫБРАТЬ
    ТоварныеЗапасыОстатки.Товар,
    ТоварныеЗапасыОстатки.Склад,
    ТоварныеЗапасыОстатки.КоличествоОстаток
    ИЗ
    РегистрНакопления.ТоварныеЗапасы.Остатки(, Склад = &Склад) КАК ТоварныеЗапасыОстатки

    В конфигурации в регистра измерения стоят в следующем порядке: Товар, потом склад. Поэтому для того, чтобы индекс использовался, по складу добавлен индекс.

    Таблица: РегистрНакопления.ТоварныеЗапасы, Имя таблицы хранения: AccumRgT85, Назначение: Итоги
    — поля:
    (Period)
    Товар (Fld82)
    Склад (Fld83)
    Количество (Fld84)
    (Splitter)
    — индексы:
    ByDims
    Period + Товар + Склад + Splitter (Period + Fld82 + Fld83 + Splitter)
    ByDims271
    Period + Склад (Period + Fld83)

    Но в плане запроса все равно частичное сканирование. Почему так происходит?

    49b64ec2453934d5d4cadfeb1c5023ab.PNG

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

    • imagik

      Чем Predicate отличается от Seek Predicates? И как видно, что идет частичное сканирование, по наличию «Предиката»?
      Что означает «частичное сканирование»?

      • Андрей Бурмистров


        (текст комментария доступен только участникам Мастер-группы)

        • imagik

          Если не сложно, подскажите, в каком уроке?

          • Андрей Бурмистров


            (текст комментария доступен только участникам Мастер-группы)

  2. imagik

    В каких случаях используется RPC:Completed, а в каких SQL:BatchCompleted ?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  3. imagik

    Index Scan и Index Seek.
    В первом случае идет сканирование всей таблицы подряд. А во втором? Там же тоже сканирование?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

        • Андрей Бурмистров


          (текст комментария доступен только участникам Мастер-группы)

  4. imagik

    Чем отличаются созданные индексы:
    — у которого два поля находятся на закладке «ключ индекса столбцы» (т.е., когда мы создаем индекс через запятую, а не через include)
    — от индекса, у которого одно поле на закладке Ключ индекса столбцы, а другое на закладке «Включено столбцы»), т.е. когда создаем индекс через include.

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  5. imagik

    Поиск в индексе идет по всем полям индекса, или только по одному? Например, индекс «код+ссылка», поля в запросе «код» и «ссылка», а условие только по коду. И все равно идет поиск в этом инлексе. Получается, условие для Index Seek не главное, а главное поля выборки?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  6. imagik

    Пересматриваю курс, хочется еще раз уточнить:
    1. Кластерный индекс — это реальная таблица, отсортированная по какой-то колонке, которая является ключом? Как я понимаю, при создании кластерного индекса таблица становится листьями и к ней длстраивается корневой и другой узлы?
    2. Индекс вообще — это отдельная таблица, состоящая из столбцов с данными индекса и столбца с указанием ссылки на строку в реальной таблице?
    3. Если выборка данных содержит только поля, совпадающие с полями условия, то будет операция Index Seek ?
    4. Поиск по индексу для документа Номер+Ссылка дает все равно Index Scan, а не Index Seek, статистика обновлена, почему?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  7. imagik

    Вопрос: в индексе участвует поле NumberPrefix. Этого реквизита нет ни в реквизитах документа, ни в общих реквизитах. Могу догадаться, что это префикс, но как точно узнавать, что за поле и почему система его включает в индекс?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  8. ilyay

    Есть какие-либо особенности в случае использования общих реквизитов 8.3?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  9. Елена Москаленко

    Урок 48. Признаки неоптимального плана Scan. Пример.

    В уроке говорится что Index Scan был использован так как в запросе было добавлено условие по полю по которому нет индекса. Почему поиска по индексу нет, это понятно. Но почему тогда, если по полю нет индекса, используется Index Scan, а не Тable Scan или Clustered Index Scan? Индекса по полю нет, а что же тогда сканируется, какой индекс ? Почему не вся таблица?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  10. imagik

    Не очень понятно все же, что такое Предикат ?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  11. imagik

    Что все же возвращает (Clustered) Index Seek ? какие конкретно поля?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  12. Дмитрий

    Возник вопрос по пониманию строк плана запроса. В плане запроса «Обращение к полю составного типа.q1c» есть такие строки

    |—Filter
    | |—Clustered Index Seek

    Первая выполняемая строка подробнее
    Clustered Index Seek(OBJECT:([TestExpert].[dbo].[_Reference7].[PK___Referen__AC8ED0C436FD9F6C] AS [T2]), SEEK:([T2].[_IDRRef]=[TestExpert].[dbo].[_InfoRg750].[_Fld777_RRRef] as [T1].[_Fld777_RRRef]) ORDERED FORWARD)

    т.е как я понимаю в этой строке идет поиск по кластерному индексу где ссылка в таблице номенклатуры должна равняться ссылке из регистра сведений

    Вторая выполняемая строка подробнее:
    Filter(WHERE:(STARTUP EXPR([TestExpert].[dbo].[_InfoRg750].[_Fld777_TYPE] as [T1].[_Fld777_TYPE]=0x08 AND [TestExpert].[dbo].[_InfoRg750].[_Fld777_RTRef] as [T1].[_Fld777_RTRef]=0x00000007)))

    В этой строке как я понимаю идет фильтрация результатов первой строке по параметрам. Но вот эти параметны мне и не понятны, ведь этих полей нет в результате первой строки, в параметрах присутствуют только поля регистра а не поля кластерного индекса справочника товары. Могли бы вы объяснить это момент, как именно идет фильтрация?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

      • Дмитрий

        Но ведь таких полей нет в кластерном индексе справочника товаров. Вот этот момент я не могу понять. Да и зачем фильтровать по типу если это и так индекс справочника товаров. Или это фильтрация регистра сведений? Тогда почему она идет от кластерного индекса спр. товаров?

        • Андрей Бурмистров


          (текст комментария доступен только участникам Мастер-группы)

  13. Дмитрий

    В процессе тестирования и изучения возник вопрос по поводу индексации временных таблиц, есть ли случаи когда эта индексация увеличивает быстродействие? Например тестировал при соединении, выигрыша от индексации практически нет. Решил может выигрыш будет при операторе В, но в итоге тоже выигрыша не получилось.

    НЕ ИНДЕКСИРОВАННЫЙ ЗАПРОС, Общее Duration 7690:
    ВЫБРАТЬ
    РС_Тест2.Число2 КАК Число2
    ПОМЕСТИТЬ ВТ
    ИЗ
    РегистрСведений.РС_Тест2 КАК РС_Тест2
    //ИНДЕКСИРОВАТЬ ПО
    // Число2
    ;

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    РС_Тест2.Число3
    ПОМЕСТИТЬ виу
    ИЗ
    РегистрСведений.РС_Тест2 КАК РС_Тест2
    ГДЕ
    РС_Тест2.Число3 В
    (ВЫБРАТЬ
    ВТ.Число2
    ИЗ
    ВТ КАК ВТ)

    План по первой временной таблице: Duration 1450
    Table Insert
    |—Index Scan

    План по второй временной таблице: Duration 6240
    Table Insert
    |—Top
    |—Hash Match
    |—Table Scan
    |—Index Scan

    ИНДЕКСИРОВАННЫЙ ЗАПРОС, общее duration 10905:

    План по первой временной таблице: Duration 7897
    Clustered Index Insert
    |—Sort
    |—Index Scan

    План по второй временной таблице: Duration 3008
    Table Insert
    |—Top
    |—Merge Join
    |—Stream Aggregate
    |—Clustered Index Scan
    |—Index Scan

    В итоге выходит что на создание индекса тратится не мало времени, которое в будущем не окупится.

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

      • Дмитрий

        Все равно не выходит прирост.
        Вот запрос выполняемый с индексированием временной таблицы и без

        ВЫБРАТЬ
        РС_Тест2.Число2 КАК Число2
        ПОМЕСТИТЬ вт
        ИЗ
        РегистрСведений.РС_Тест2 КАК РС_Тест2

        ;

        ////////////////////////////////////////////////////////////////////////////////
        ВЫБРАТЬ
        вт.Число2
        ИЗ
        вт КАК вт
        ГДЕ
        вт.Число2 = 2

        При индексации только первой таблицы Duration = 8224 Общий Duration без индексации выходит не более 4000

        1cc0a1827ee96cbf8c360f0fb62c4c3f.png

        • Андрей Бурмистров


          (текст комментария доступен только участникам Мастер-группы)

  14. Dementij

    Добрый день. Подскажите пожалуйста, при установке индексирования для измерения регистра накопления индекс создается только для таблицы движения? Для таблицы итогов возможен только кластерный индекс создаваемый по умолчанию?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  15. Simol

    Добрый день, Андрей!
    Хотел бы вернуться к своему вопросу.
    Смотрите задание 9 занятия 8 план запроса 1 строка 5.
    Вот текст оператора http://screencast.com/t/kXrvkuJZE59
    В OBJECT используется индекс _InfoRg6376_ByPeriod_TR, а в WHERE уже берется поле основной таблицы [_InfoRg6376].[_Fld6382_TYPE]

    Вопросов два:
    1) Как из индекса получается доступ к строкам основной таблицы? Нет оператора соединения, а уже сразу соединено
    2) Если в этом операторе может уже соединяться, то зачем тогда оператор Поиск по ключу, который как бы и должен это делать.

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  16. Kluch

    Андрей, добрый день.
    Вопрос про покрывающий индекс и Key Lookup.
    Есть регистр сведений с измерениями и ресурсами. В нем миллионы записей. Выбираем из него данные по условию на первое измерение. Если выбирать только все измерения, то используется поиск в индексе, т.е. индекс получается покрывающим. Но если выбирать еще ресурс, то для поиска значения этого ресурса используется Key Lookup, который занимает большую часть времени и большое количество операций логического чтения.
    Можно ли проиндексировать еще и ресурсы регистра и нормальная ли это практика? И почему в курсе говорится, что нельзя создать покрывающий индекс средствами 1С, ведь если проиндексировать ресурсы, то будет индекс, включающий период, все измерения и ресурсы?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  17. Alexey1983

    Андрей, здравствуйте. Вопросы по индексам:
    1. В описании структуры индекса упоминается сбалансированное B дерево, т.е. на каждом уровне по два узла, как я понял. В последующих примерах используется дерево с другой структурой (3 узла на одном уровне в частности). Почему?
    2. В описании кластерного индекса вы говорите, что это совмещение таблицы и индекса — по сути таблица упорядочена по полям, входящим в индекс. Но в примере опять же приводится структура с деревом, т.е. вроде как помимо собственно таблицы используется все же сторонние данные. Что же конкретно представляет собой кластерный индекс?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  18. leonidol

    В платформе 8.2 при создании непериодического регистра сведений создается уникальный кластерный индекс по всем измерениям. Но при этом еще добавляется служебно поле «_SimpleKey» и по этому полю строится уникальный индекс.
    Зачем это поле и индекс по нему? Ведь уникальность поддерживается кластерным индексом.
    Создал точно такой же регистр сведений под платформой 8.3.5.1146, там создался только уникальный индекс по всем измерениям.

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  19. Константин Гаевский

    Здравствуйте.

    По уроку 39. Условия, не позволяющие использовать индекс.
    Воспроизвел оба(НЕ В и LEFT JOIN + ЕСТЬ NULL) примера. В обоих случаях планы очень схожи. MS SQL Server 2008 (10.0.6000.29, SP4, Enterprise Edition (64-bit)), 1c 8.2.19.90.

    Что-то не так делаю?

    441cf465f43b40e07e937e6c1e9dcc9b.gifecbded624067ce0a9d1a75e9409a2a2b.gif

  20. mmch

    Андрей, правильно ли я читаю план запроса (см. вложение)…

    Выбираю товар по списку.

    Первым делом SQL определяет мои параметры и собирает их в список значений
    потом по перебору списка значений (Nested Loops) ищет в индексе каждое значение из полученного списка?

    Если да — то вопросы:
    Если он ищет в индексе по условию больше- меншье (, т.е. как и в случае «или»)
    то почему он ставит интервал между значениями Expr1011 и Expr1012, а не между Expr1011 и Expr1013

    И не будет ли условие «В» в запросах лучше заменить на «ОБЪЕДИНИТЬ ВСЕ» с условием «=»
    или система это делает автоматом?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  21. mmch

    Всю жизнь думал, что оператор
    МЕЖДУ Дата1 и Дата2 — Это больше Дата1 и меньше Дата2
    Поэтому использовал всегда конструкцию больше или равно Дата1 и меньше или равно Дата2

    Построил план запроса для двух вариантов, планы оказались идентичными. МЕЖДУ действительно ровно двойному условию и по скорости выполнения тоже?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  22. Константин Гаевский

    Здравствуйте.
    1. Я правильно понимаю, что вместо key lookup можно было бы использовать index/table scan, но lookup быстрее ищет и время доступа к найденной строке наименьшее (индекс кластеризованный)?

    2. В уроке «20. Покрывающий индекс отсутствует» в текстовом плане в операторе clustered index seek с lookup указано условие соединения
    SEEK:([T1].[_IDRef]=[TestBase_8_2].[dbo].[_Reference7].[_IDRRef] as [T1].[_IDRRef]). Для более глубокого понимания операторов поясните как читается данный предикат?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

      • Simol

        Добрый день, Андрей!
        Все же хочу допонять один момент на уровне SQL. Логично предположить, что SQLю все равно прикладное применение запроса.
        В прикрепленном фале находится
        1) Индекс в SQL
        2) Ветка плана запроса, с оператором, использующим этот индекс
        3) Текст оператора, использующего этот индекс

        Вопрос не в том, почему 1с добавило отбор по периоду.
        А про текст оператора. В индексе, как я показал, нет поля Period ни в ключе индекса ни во включенных полях. Согласно текста оператора [T5] это мой индекс. Если смотреть текст оператора, то SQL каким-то образом в моем индексе находит поле Period. Также обращу внимание, что поиска по ключу рядом нет.

        Откуда оператор получается в индексе Period?

        • Андрей Бурмистров


          (текст комментария доступен только участникам Мастер-группы)

          • Simol

            Это индекс созданный руками.
            Вот крупнее http://screencast.com/t/myBtEB5l
            Так вопрос как бы не относится к 1с. Интересует оператор плана запросов, в нем указан в качестве объекта мой индекс из которого, согласно этому оператору, каким-то чудом берется поле Period, которого в индексе нет.
            То есть как бы происходит неявное соединение с кластерным индексом? Если это так, то почему таким образом доступно поле Period, а остальные остальные добавляются с помощью оператора поиск по Ключу? Для SQL поле Period ни чем же не отличается от других полей.

            • Андрей Бурмистров


              (текст комментария доступен только участникам Мастер-группы)

              • Simol

                Андрей, я гарантирую, что там ни в ключе ни во включенных столбцах нет периода. Индекс создан руками, 1с его не знает. Сами понимаете, что подготовить базу я быстро не могу. Да и не понимаю как база поможет в ответ на вопрос.
                Значит есть какая-то особенность SQL, о которой я не знаю. И есть уверенность, что 1с тут не причем, потому, что мы в вопросе разбираем представление данных в плане запроса.
                Давайте Вы по teamview подключитесь и я покажу и индекс и план запроса в живую?

                P.S. Кстати, например, в задании 8 видео 91 на 2 минуте 51 секунде Вы показывает «долгий» оператор, а в нем используются предикаты из двух таблиц, хотя в качестве объекта указана только одна таблица. Так и в моем случае периода в индексе нет, а он используется.

                • Андрей Бурмистров


                  (текст комментария доступен только участникам Мастер-группы)

  23. Simol

    Добрый день!
    Анализирую как хранит 1c таблицы на сервере. Вижу, что для каждого индекса, созданного 1с, также создается таблица статистики http://screencast.com/t/uQOHP2Bri5y . В тоже время у индекса, созданного руками NonClusteredIndex-20141123-121242, таблицы статистики нет.
    Таблица статистики создалась после команды UPDATE STATISTICS [Corporate].[dbo].[_AccumRg20004] WITH FULLSCAN
    Получается после добавления индекса необходимо не забывать проконтролировать, что создалась таблица статистики?

    P.S. Ниже разобрался с поколоночной статистикой. Она создается при явном обращении к данным этих колонок. А вот статистика по индексу просто обращением не создается, только после обновления статистики, причем полном, а не только требующей обновление.

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  24. Simol

    Добрый день!
    У меня на тестовом сервере (недавно перезагружен и активно в 1с на нем не работают, только я опыты по этому курсу провожу) в графическом плане запроса на значках операций желтый треугольник с предупреждением, что столбцы без статистики. Таблицы эти не пустые. Обновление статистики выполнил для всех баз.
    Почему нет статистики?
    На сколько можно оптимизировать запросы в такой ситуации, не будет ли иная ситуация при переносе запроса на рабочий сервер?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

      • Simol

        Выполнил
        1) UPDATE STATISTICS [Corporate2].[dbo].[_AccumRg20004] WITH FULLSCAN
        2) DBCC FREEPROCCACHE
        3) DBCC DROPCLEANBUFFERS

        Все равно наблюдаю:
        NO STATS:([_AccumRg20004].[_LineNo])

        Причем это не только на этом регистре. На рабочем сервере такой проблемы нет.
        В чем еще может быть проблема?

        P.S.
        Посмотрел на рабочем сервере — статистика по _LineNo есть: http://screencast.com/t/QAfTBMEfyC9
        На тестовом нет: http://screencast.com/t/VLz2Ezu3Qg

        P.P.S.
        Реструктуризация через конфигуратор этого регистра привела к тому, что осталась статистика только по индексам, по колонкам таблицы удалилась. UPDATE STATISTICS [Corporate2].[dbo].[_AccumRg20004] WITH FULLSCAN по колонкам не создает.

        P.P.P.S. Разобрался. Поколоночная статистика создается при первом обращении к колонкам этой таблицы. У меня еще не было запросов, явно использующих LineNo из основной таблицы, потому и статистики не было. При явном запросе с отбором по номеру строки статистика создалась.

  25. Simol

    Добрый день!
    Правильно ли я понимаю, что на MSSQL 2012 после обновления статистики (варианты ответа:)
    1) уже не нужно очищать процедурный кеш (DBCC FREEPROCCACHE)
    2) желательно очищать процедурный кеш
    3) все равно, так как очистке кеша после обновления статистики уже нечего очищать и операция не занимает ресурсы.

    Какой вариант верный?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  26. Simol

    Добрый день!
    Повторные вызовы того же запроса начиная со второго раза выполняются быстрее. Понимаю что это кеширование то ли результата, то ли плана запроса, то ли еще чего.
    Но при отладке интересно, чтобы повторные вызовы были «как в первый раз». Кроме очистки глобально процедурного кеша можно как-то более точечно очистить кеши касательно этого запроса?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

      • Simol

        Да, это я знаю. А более щадящий способ есть, чтобы не в ущерб другим запросам, как ни как рабочий сервер?

        • Андрей Бурмистров


          (текст комментария доступен только участникам Мастер-группы)

  27. Simol

    Добрый день!
    Вопрос про временные таблицы.
    Смотрю в MSSQL базу TempDB. Есть мысль перенести ее на SSD винт для ускорения, но посмотрев ее размер — ужаснулся. Около Терабайта. Я знаю, что она при перезапуске MSSQL пересоздается. Интересно почему она большая. Посмотрел в ней раздел Временные таблицы — их куча:
    Часть вида [dbo].[#BD863B34], другая часть вида [dbo].[#tt11_______________________________________________________________________________________________________________ 000000072D8E]
    Предполагаю, что вторые это от 1с. Почету они не удаляются? Получается нужно обязательно в запросе явно удалять таблицы, а иначе даже закрытие клиента 1с не удаляет созданные в нем таблицы?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  28. Alex_grem

    Где посмотреть в плане запроса для какого поля/полей использовался lookup? Т.е. какое поле виновато в использовании этого оператора?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

      • Alex_grem

        Извиняюсь. Столько много информации, что не все запоминается.

  29. ilyay

    Не понятна ситуация с lookup.
    У нас есть индекс, в котором мы нашли записи с соответствующим значением поля код. Далее нам надо просто выдать в результат наименование, никаких больше отборов. Сам индекс уже содержит ссылки на строки таблицы откуда надо значение поля «наименование» взять. Зачем еще задействовать кластерный индекс?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  30. Marinellka

    Добрый утро.
    Андрей, у меня вопрос по соединению с вложенными запросами (подзапросами). Я работаю с УПП около 8 лет, львиная доля запросов в этой конфигурации — это тяжелые запросы, в каждом из которых используется не одно соединение, а несколько соединений с подзапросами (особенно в производственном блоке). Где-то через 2 года выполнение таких запросов начинает тормозить. Если конфигурация измененная, то есть возможность оптимизировать запросы и учитывать их при обновлении релиза. А как быть с конфигурацией, находящейся на полной поддержке?? Что в данном случае посоветуете?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

      • lexbond

        Заинтересовала обработка по шифрованию базы. А где ее можно найти?

        • Андрей Бурмистров


          (текст комментария доступен только участникам Мастер-группы)

  31. Eugeeny

    Здравствуйте, Андрей.
    1) Во всех видео уроках, просмотренных мной на данный момент, примеры, в которых разбираются индексы, представлены на измерениях регистра с типом «число». Справедливы ли все выводы, сделанные в уроках и для др. типов: ссылки, даты, булево и т.д.?
    2) В уроке «Условия, не позволяющие использовать индекс. НЕ В» показаны два запроса: 1 — неоптимальный и 2- оптимальный. Во втором (оптимальном) запросе в условии где Остатки.Товар ЕСТЬ NULL и при этом по полю товар мы соединяемся со справочником товары. Как работает этот запрос?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  32. andreyka

    Андрей, а можно еще вопрос по поводу Key Lookup. Хотел уточнить, правильно ли я понял принцип работы данного механизма. Предположим у нас есть запрос:

    ВЫБРАТЬ
    Товары.Код,
    Товары.Наименование
    ИЗ
    Справочник.Товары КАК Товары

    где Товары.Наименование = «Стул»

    Индекс Наименование + Код у нас отсутствует, соответсвенно в плане запроса мы увидим Key Lookup. Так вот вопрос, сначала идет поиск по индексу (в котором присутствует наименование) согласно наложенному условию (Файл 1.png), затем берется кластерный индекс из найденной строки и уже ищется в таблице по ссылке (ключу) (Файл 2)?

    P.S. во втором файле не правильно подчеркнул, хотел подчеркнуть нижнюю строчку (Clustered Index Seek)

    5ef2f283dffffa249b83ed57cfb69042.pnge0564508ae3a1f06fde057fd9957ea30.png

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  33. Павел Королев

    Добрый день, Андрей!

    Может быть я запутался, буду благодарен если поправите.
    Видео 27 «Минусы индексов».
    В нем говорится, что платформа автоматически создает индекс по первому измерению.
    Видео 30 «В индексе не должно быть зазоров. Схема».
    Говорится о том, что платформа автоматически создает индекс по всем измерениям.

    Верно ли я понимаю, что в видео 27 говорится о новом индексе, который будет по первому измерению, а в видео 30 будет индекс как по первому измерению, так и индекс по всем измерениям?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  34. gosn1ck

    Добрый день, Андрей. помогите, пожалуйста объяснить природу того, ожидаемое количество строк в моем плане отличается от фактического? я понимаю, что нестед лупс выполняется слишком большое количество раз… статистику я обновил, но это не помогает

  35. SSkripagan

    Здравствуйте.

    Хотелось бы разобрать вопрос оптимальности запросов к табличным частям документов.

    1. В частности. Что быстрее будет работать ?

    Запрос к табличной части документов или к основной таблице регистров сведений.

    При одинаковых индексах по ключевым полям, одинаковых объемах данных таблиц и прочих равных условиях.

    2. В процессе анализа проблемных запросов столкнулся с особенностью.

    Есть индекс по всем полям выборки данных из табличных частей документов ( отбор по ссылке не указывается).

    sql все равно строит план запроса через index scan.

    С чем это м.б. связано, есть ли какие то особенности запросов к табличным частям документов ?

    Спасибо. Прошу прощения за некий сумбур в вопросе, просто всегда на всех курсах слышал тезис, что запрос к ТЧ документов — плохо.

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  36. adelpieroff10

    Здравствуйте! В разборе запроса из жизни вы говорите, что конструкция «счет в иерархии» и «кор счет в иерархии счет1 или кор счет в иерархии счет2» в параметрах виртуальных таблиц бухгалтерских регистров — это плохо, почему?

    • adelpieroff10

      И еще один вопрос: в уроке про индексы (где представлена таблица индексов, создаваемых платформой) для таблиц остатков РН и РБ в индексе нет разделителя (только Период + (Счет) + Измерения). Я правильно понимаю, что разделитель нужен?

      • Андрей Бурмистров


        (текст комментария доступен только участникам Мастер-группы)

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  37. Антон Познянский

    Андрей, а почему бы не использовать например такое условие в параметрах:
    ВЫБРАТЬ ПЕРВЫЕ 100
    ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры,
    ТоварыНаСкладахОстатки.Склад,
    ТоварыНаСкладахОстатки.Номенклатура
    ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки(
    ,
    ХарактеристикаНоменклатуры = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)
    И Склад = &Склад) КАК ТоварыНаСкладахОстатки
    Тогда в плане получается поиск по индексу без промежутка:
    336 1 |—Clustered Index Seek(OBJECT:([IMPL_KP_UPP_DEV_ANDREEV].[dbo].[_AccumRgT28554].[_Accum28554_ByDims_TRRRRRN] AS [T2]), SEEK:([T2].[_Period]=[@P1] AND [T2].[_Fld28549RRef]=[@P2] AND [T2].[_Fld28546RRef]=[@P3]) ORDERED FORWARD)

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  38. andreyka

    Андрей, здравствуйте. Хотел уточнить на счет свойства «индексировать с доп. упорядочиванием». Насколько я понял, используя его, мы выиграем только в том случае, если нам нужно получать данные отсортированные по основному представлению (код, наименование) и отсортированные только в прямом порядке. Во всех остальных случаях, использовать «индексировать с доп. упорядочиванием» не оптимально?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  39. Шутееев Никита

    Здравствуйте! Вопрос такой: можно ли как-то индексировать с упорядочиванием по стандартным полям Код и Наименование?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

      • Шутееев Никита

        Я имею ввиду опцию «Индексация с доп. упорядочиванием», эти поля индексируются, но упорядочивания не происходит

        • Андрей Бурмистров


          (текст комментария доступен только участникам Мастер-группы)

  40. bas

    Добрый день!
    1. Обратил внимание, что в таблице итогов по счетам для регистра бухгалтерии используется порядок полей: Счет + Период + Измерение1 + … + ИзмерениеN. В видеоуроке в таблице основных индексов приводилась последовательность: Период + Счет + Измерение1 + … ИзмерениеN.
    2. Также обратил внимание, что при индексировании временных таблиц создается кластерный индекс, в видеоуроке написано, что некластерный.

    Платформа 8.3.5.1248, поведение такое же при режиме совместимости с 8.2.16

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  41. Sunhare

    Добрый день!
    Вопрос по уроку «32 В индексе не должно быть зазоров. Схема решения». Как первый способ решения указано «Установить свойство «индексировать» для поля «Склад»» , «часть данных будет найдена по одному индексу, часть по другому индексу» — В моей тестовой базе план запроса не меняется при установке «индексировать» для поля «Склад» и я не могу понять как дополнительный индекс «Period + Склад (Period + Fld19)» нам может помочь искать в индексе «Period + Товар + Характеристика + Склад (Period + Fld20 + Fld404 + Fld19)» если у нас условие на Товар + Склад.

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  42. Василий Левковский

    Добрый день

    Вопрос по использованию индексов в регистре сведений. Допустим, у нас есть простейший регистр с измерениями Номенклатура и характеристика, и ресурсом цена. При выборе всех полей с отбором по номенклатуре в плане запроса видно, что используется Index seek. А вот если отбор делать по характеристике, то используется Index scan, даже если проиндексировать измерение характеристика. Правильно ли я понимаю, что в случае с характеристикой так происходит, потому что поле цена в индекс не входит и поэтому индекс не может быть использован? И если это так, то каким образом используется индекс при отборе по номенклатуре? Ведь там тоже цены в явном виде нет

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

      • Василий Левковский

        В приложении пример базы и запросы.
        В первом запросе с отбором по номенклатуре получается Clustered Index Seek
        Во втором с отбором по характеристике Clustered Index Scan.
        И в третьем также с отбором по характеристике, но без выбора цены — Index Seek

        • Андрей Бурмистров


          (текст комментария доступен только участникам Мастер-группы)

  43. Василий Левковский

    Добрый день.

    Пробую заниматься анализов планов запросов и текстов SQL запросов в рабочей базе. Но пока не хватает опыта, много непонятных ситуаций. И есть вот такая распространенная. Не могу понять, почему вроде бы простой запрос вида:

    ВЫБРАТЬ
    ЦеныНоменклатурыСрезПоследних.ТипЦен,
    ЦеныНоменклатурыСрезПоследних.Номенклатура,
    ЦеныНоменклатурыСрезПоследних.Цена
    ПОМЕСТИТЬ ЦеныНоменклатуры
    ИЗ
    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
    &НаДату,
    ТипЦен = &ТипЦенОсновной
    И Номенклатура В
    (ВЫБРАТЬ
    Изменения.Номенклатура
    ИЗ
    ИзмененияЦенМаячковКредитов КАК Изменения)) КАК ЦеныНоменклатурыСрезПоследних

    ИНДЕКСИРОВАТЬ ПО
    ТипЦен,
    Номенклатура

    На языке SQL превращается аж в несколько вложенных запросов да еще и с внутренними соединениями таблицы регистра с самой собой:

    INSERT INTO ВременнаяТаблица4 WITH(TABLOCK) (_Q_001_F_000RRef, _Q_001_F_001RRef, _Q_001_F_002) SELECT
    T1.Fld5522RRef,
    T1.Fld5523RRef,
    T1.Fld5526_
    FROM (SELECT
    T8.Цена AS Fld5526_,
    T8.Номенклатура AS Fld5523RRef,
    T8.ТипЦен AS Fld5522RRef
    FROM (SELECT
    T3.Fld5522RRef AS Fld5522RRef,
    T3.Fld5523RRef AS Fld5523RRef,
    T3.Fld5524RRef AS Fld5524RRef,
    T3.MAXPERIOD_ AS MAXPERIOD_,
    SUBSTRING(MAX(T6.Регистратор + T6.Регистратор),1,4) AS MAXRECORDERTRef,
    SUBSTRING(MAX(T6.Регистратор + T6.Регистратор),5,16) AS MAXRECORDERRRef
    FROM (SELECT
    T4.ТипЦен AS Fld5522RRef,
    T4.Номенклатура AS Fld5523RRef,
    T4.ХарактеристикаНоменклатуры AS Fld5524RRef,
    MAX(T4.Период) AS MAXPERIOD_
    FROM РегистрСведений.ЦеныНоменклатуры T4 WITH(NOLOCK)
    WHERE T4.Период <= ? AND T4.Активность = 0x01 AND (((T4.ТипЦен = ?) AND T4.Номенклатура IN
    (SELECT
    T5._Q_001_F_000RRef AS Q_001_F_000RRef
    FROM ВременнаяТаблица2 T5 WITH(NOLOCK))))
    GROUP BY T4.ТипЦен,
    T4.Номенклатура,
    T4.ХарактеристикаНоменклатуры) T3
    INNER JOIN РегистрСведений.ЦеныНоменклатуры T6 WITH(NOLOCK)
    ON T3.Fld5522RRef = T6.ТипЦен AND T3.Fld5523RRef = T6.Номенклатура AND T3.Fld5524RRef = T6.ХарактеристикаНоменклатуры AND T3.MAXPERIOD_ = T6.Период
    WHERE T6.Активность = 0x01 AND (((T6.ТипЦен = ?) AND T6.Номенклатура IN
    (SELECT
    T7._Q_001_F_000RRef AS Q_001_F_000RRef
    FROM ВременнаяТаблица2 T7 WITH(NOLOCK))))
    GROUP BY T3.Fld5522RRef,
    T3.Fld5523RRef,
    T3.Fld5524RRef,
    T3.MAXPERIOD_) T2
    INNER JOIN РегистрСведений.ЦеныНоменклатуры T8 WITH(NOLOCK)
    ON T2.Fld5522RRef = T8.ТипЦен AND T2.Fld5523RRef = T8.Номенклатура AND T2.Fld5524RRef = T8.ХарактеристикаНоменклатуры AND T2.MAXPERIOD_ = T8.Период AND T2.MAXRECORDERTRef = T8.Регистратор AND T2.MAXRECORDERRRef = T8.Регистратор) T1
    p_0: 40141114000000
    p_1: 0xB575001E68B8E02411DE2862DA4C45AC
    p_2: 0xB575001E68B8E02411DE2862DA4C45AC

    Регистр ЦеныНоменклатуры подчинен регистратору составного типа. Изменения: ТипЦен, Номенклатура, ХарактеристикаНоменклатуры. Цена — ресурс.

    Думал, что это происходит из-за того, что регистратор составного типа. Но в регистраторах 10 документов, а в запросе 2 внутренних соединения. Может, подскажете, в чем дело? Запросы к таблицам среза последних вызывают недоумение

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  44. hekpoh

    Андрей, здравствуйте!
    В ролике «27. Минусы индексов» Вы говорите, что не имеет большого смысла создавать индекс по первому измерению регистра сведений, потому что платформа сама создала индекс. И если мы создадим все-таки его на первое измерение, то индекс будет дублировать существующий. На новый индекс будет тратиться время и использоваться он не будет.
    Хотел бы Вас немного поправить вот в какой части (проверял на непериодическом регистре сведений в 8.3.5.1119): Да, действительно, платформа сама создает кластерный составной индекс по всем измерениям регистра (в порядке их следования в дереве метаданных). Но если на стороне 1С создать индекс у первого измерения данного регистра (чего делать, естественно, не надо), то можно было бы предположить, что создастся некластерный индекс, состоящий из всех измерений. К счастью, 1С отрабатывает эту ситуацию, и в SQL-таблице новый индекс не появится. Почему 1С? Да потому, что сиквел позволил создать такой индекс :)

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  45. gosn1ck

    Андрей, добрый день.
    по этой ссылке http://nastroy-ka.ru/mgeneral/25-indexesinthe1c.html (прошу прощения, если публиковать ссылки нельзя) написано про свойство «Ведущее», которое влияет на индексы регистра. так ли это? в курсе ничего не было это влияние

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  46. gosn1ck

    Андрей, в видео о невыполнении регл операций вы говорите о статистике и о ее влиянии на производительность. для демонстрации вы используете скрипт. скажем, есть определенный процесс которым изменяет\добавляет, например, миллион или сто тыс строк в таблице, а затем происходит чтение этих записей. можно ли каким-то образом запустить обновление статистики только этой таблицы сразу после этого процесса и как? или в целом эта идея «провальна» и надо искать другие пути решения?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  47. Kir

    Добрый день.
    Разделю вопросы на отдельные сообщения. думаю так будет удобнее.

    Не подскажите нужно ли создавать индексы для последующей группировки или подведения итогов таблицы? Или данные операции всегда выполняются перебором всей таблицы, поэтому в индексах нет необходимости?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

  48. Kir

    Добрый день!
    Не подскажите древовидная структура индекса это именно физическая организация индексов? Или это только алгоритм поиска?
    Немного не сложилась у меня общая картина. Я предполагал, что индексы это дополнительная таблица БД, отсторированная по полям состава индекса. В случае с кластерным индексом получается, что упорядочивается сама таблица данных.

    если индекс имеет все-таки древовидную структуру, то получается для кластерного индекса две дополнительные таблицы, для некластерного три (ствол, ветви, листья)? Ведь в базе данных же только табличная структура хранения данных?

    • Андрей Бурмистров


      (текст комментария доступен только участникам Мастер-группы)

Комментарии закрыты