Вопрос по фильтрации виртуальных таблиц #452429


#0 by дущ
Собственно имеем следующий запрос:    ВзаиморасчетыСКонтрагентамиОстатки.ДоговорКонтрагента    ИЗ    РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки( вопрос к знатокам внутренностей механизма запросов. Как видите в виртуальную таблицу остатков регистра накопления я передаю вторым параметром условие построения этой самой виртуальной таблицы. Внимание вопрос: Как эффективнее: налагать максимум условий на все измерения регистра, или оставить только самое "узкое" условие? Т.е. в данном случае СписокКонтрагентов является подмножеством СписокДоговоров.Владелец, ясно что ДоговорКонтрагента будет всегда подчинен Контрагенту, поэтому может если у нас уже есть Контрагента может не имеет смысл предлагать интерпретатору фильтровать так же по контрагентам? Логика подсказывает что лучше всего оставить самое "узкое" условие, но вдруг не так?
#1 by дущ
*уже есть Контрагента может* = *уже есть ДоговорКонтрагента может* Офф: Когда ж тут редактирование сообщений появится или хотя бы предпросмотр? Сапожники без сапог, ей-богу :(
#2 by Abracadabra
Если это УТ то там будет индекс [ДоговорКонтрагента]+[Сделка]+[Организация]+[Контрагент]. Если использовать условие "Контрагент В (&СписокКонтрагентов) И ДоговорКонтрагента В (&СписокДоговоров)" то индекс будет использоваться неэффективно. Лучше сделать запрос:    Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов    ВзаиморасчетыСКонтрагентамиОстатки.ДоговорКонтрагента ИЗ    РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки( Будет намного быстрее работать.
#3 by AndOne
Необходимо смотреть порядок следования изменений в регистре. Для таблицы остатков сервер БД создает составной индекс в порядке следования изменений. Если накладывать условие только договора, то такой запрос не сможет выполниться оптимально. Для его выполнения серверу СУБД придется перебирать (сканировать) все записи таблицы. Время выполнения этой операции напрямую зависит от количества записей в таблице остатков регистра и может быть очень большим (и будет увеличиваться с ростом количества данных). Если наложить условие на Контрагенты и Договора (при усвлоии что порядок следования в измерений: Контрагент, Договор), то  при выполнении запроса СУБД выполнит поиск по первому полю индекса, и затем просканирует оставшуюся его часть.
#4 by дущ
Спасибо. То-то я смотрю в типовых всегда первое измерение ДоговорКонтрагента. А для файлового варианта БД это справделиво?
#5 by Axel2009
ахаха, лол.. простите не удержался. почему это не эффективно? =) это если выбирать только договор и порядок следования измерений - контрагент, договор, то да. не эффективно, да и то только в одной из 2х таблиц. в таблице движений изначально все не "эффективно", если поле не индексировано.
#6 by Abracadabra
Потомо, что индекс будет эффективно использоваться только при наложениях условий вида: ПоДоговору ПоДоговору И ПоСделке ПоДоговору И ПоСделке И ПоОрганизации ПоДоговору И ПоСделке И ПоОрганизации И ПоКонтрагенту Как я уже написал, согласно расположения измерений индекс будет {ДоговорКонтрагента}+{Сделка}+{Организация}+{Контрагент}. Даже применение условий вида: ПоСделке И ПоДоговору ПоДоговору И ПоОрганизации ПоКонтрагенту ПоОрганизации И ПоКонтрагенту уже будут не такими эффективными ;)
#8 by Axel2009
по договору и по контрагенту - будет фиалетово. скана не будет. будет просмотрен индекс по договору, и потом перескочит 2 колонки и будет искать в 4ой нужного контрагента.
#10 by Abracadabra
но если будет условие "ПоКонтрагенту И ПоДоговору" то нужно будет "лезть" сначала через 3 поля индекса, а потом по-новой суваться в тот же индекс для проверки первого поля. Тоже дополнительное время...
#12 by Axel2009
т.е. вы думаете, что от порядка указания условий в запросе будет зависеть, какой порядок поиска будет? =)
#13 by NcSteel
А интерпритатор запросов из 1с в sql разве оптимизирует их ? . Всегда думал что , да !
#14 by Abracadabra
есть рекомендации от фирмы 1С, так вот я их и придерживаюсь ;) В них и написано про отборы в запросах "по порядку полей", и про то, как они влияют на скорость выполнения запроса.
#15 by Киборг
Методы применяющиеся для улучшения времени выполнения запроса могут различаться для файловой и для скульной версии. Также может быть важно на каком уровне подзапросов выполняется конструкция, в соединении или нет, и другие нюансы. Берешь тормозной запрос в реальных условиях и начинаешь его крутить по всякому, много думаешь... :)
#16 by H A D G E H O G s
Условие по СпискуКонтрагентов - недостаточно. Мало ли что там автор сказал, ты код не видел    Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов    ВзаиморасчетыСКонтрагентамиОстатки.ДоговорКонтрагента ИЗ    РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки(
#17 by H A D G E H O G s
А вообще - респект, вариант - идеален.
#18 by Abracadabra
спасибо :) про второе условие я как-то и не подумал.
#19 by Axel2009
я не знаю как работает отбор по их файловой версии. может так и работает, от порядка указания полей. а SQL разрабатывали люди другого машстаба. не идеален.
#20 by H A D G E H O G s
Приведи пример лучше
#21 by Axel2009
ВЫБРАТЬ    ВзаиморасчетыСКонтрагентамиОстатки.СуммаВзаиморасчетовОстаток,    ВзаиморасчетыСКонтрагентамиОстатки.ДоговорКонтрагента ИЗ    РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки(    Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов ГДЕ    ДоговорыКонтрагентов.Владелец В(&СписокКонтрагентов))) КАК ВзаиморасчетыСКонтрагентамиОстатки
#22 by Axel2009
ЗЫ я говорю с точки зрения базы на SQL Server.
#23 by Abracadabra
Вы чего? Мериться я и не собирался :) Насчет порядка следования полей, вы ведь знаете в каком виде хранятся индексы в БД? Посмотрите внимательно в типовых, как там структура измерений в регистрах спроэктирована, и изучите запросы, которые их юзают.
#24 by Abracadabra
+ общих "правильных" способов не бывает, есть только общие рекомендации, которых стоит придерживаться.
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям