Сидишь такой на своем хорошем компьютере, в офисе, с быстрым каналом, с полными правами и работаешь в программе, и все у тебя хорошо, и не знаешь, что где то сейчас плачет менеджер, который сидит на удаленке, через vpn, и открывает программу через браузер) еще и RLS добавляется.
И как же помочь, чтоб ему жилось чуточку лучше.
Как известно в большинстве своем причиной медленной работы 1с являются запросы, их и решено было проанализировать, для этого был использован инструмент из арсенала Гилева, не рекламы ради пара хвалебных слов:
- Из коробки с минимум настроек получаем готовый инструмент для анализа запросов, не нужно вдаваться в подробности настройки технологического журнала, и искать инструменты визуализации ТЖ.
- Для моей задачи вполне хватило бесплатного режима.
Достаточно было отслеживать запросы которые дольше 3 сек пару дней, чтоб явно увидеть проблемное место, так что же мы имеем на входе
За явным преимуществом выигрывает запрос, указанный на скрине, вес которого значительно больше остальных, длительность запроса доходила до 30 сек. Приложу текст запроса, который в итоге идет к базе для наглядности, там просто мнооооого букв).
"INSERT INTO pg_temp.tt79 (_Q_000_F_000RRef, _Q_000_F_001, _Q_000_F_002, _Q_000_F_003) (SELECT
T1._IDRRef,
CAST(T1._Description AS MVARCHAR(203)),
"::mvarchar,
CAST(1 AS NUMERIC)
FROM _Reference132 T1
WHERE (((T1._Fld878 = CAST(0 AS NUMERIC))) AND (EXISTS(SELECT
TRUE AS Q_001_F_000_
FROM _Reference106 T2
INNER JOIN _Reference75 T3
ON (T2._Fld13794 = 'Справочник.Контрагенты'::mvarchar) AND EXISTS(SELECT
TRUE AS Q_002_F_000_
FROM _InfoRg10986 T4
WHERE ((T4._Fld878 = CAST(0 AS NUMERIC))) AND ((T4._Fld10987_TYPE = '\\010'::bytea AND T4._Fld10987_RTRef = '\\000\\000\\000j'::bytea AND T4._Fld10987_RRRef = T2._IDRRef) AND (T4._Fld10988RRef = T3._IDRRef))) AND T3._IDRRef IN ('\\200\\312\\000\\340R\\201\\261\\321\\021\\351F\\355\\2102\\307\\204'::bytea, '\\234\\033RT\\000{\\005g\\021\\350\\342\\211\\277\\333\\330r'::bytea, '\\253\\223t\\3245\\013\\030\\255\\021\\350\\242!}\\006\\270\\037'::bytea, '\\253\\223t\\3245\\013\\030\\255\\021\\350\\242!}\\006\\270""'::bytea, '\\253\\223t\\3245\\013\\030\\255\\021\\350\\242!}\\006\\270%'::bytea, '\\253\\223t\\3245\\013\\030\\255\\021\\350\\244a\\024\\030G+'::bytea, '\\257_RT\\000{\\005g\\021\\350\\266lP36\\260'::bytea)
WHERE ((T3._Fld878 = CAST(0 AS NUMERIC))) AND ((T1._Folder = FALSE) OR (1=1))))) AND (((T1._Description)::mvarchar LIKE '%ан%'::mvarchar) AND (T1._Fld14125 = FALSE) AND T1._Fld14131 = TRUE AND (T1._Marked = FALSE) AND (T1._Folder) = TRUE) LIMIT 10)
UNION (SELECT
T8._IDRRef,
CAST(((((((T8._Fld14119 || ' ('::mvarchar)) || T8._Description)) || ')'::mvarchar)) AS MVARCHAR(203)),
"::mvarchar,
CAST(1 AS NUMERIC)
FROM _Reference132 T8
WHERE (((T8._Fld878 = CAST(0 AS NUMERIC))) AND (EXISTS(SELECT
TRUE AS Q_001_F_000_
FROM _Reference106 T9
INNER JOIN _Reference75 T10
ON (T9._Fld13794 = 'Справочник.Контрагенты'::mvarchar) AND EXISTS(SELECT
TRUE AS Q_002_F_000_
FROM _InfoRg10986 T11
WHERE ((T11._Fld878 = CAST(0 AS NUMERIC))) AND ((T11._Fld10987_TYPE = '\\010'::bytea AND T11._Fld10987_RTRef = '\\000\\000\\000j'::bytea AND T11._Fld10987_RRRef = T9._IDRRef) AND (T11._Fld10988RRef = T10._IDRRef))) AND T10._IDRRef IN ('\\200\\312\\000\\340R\\201\\261\\321\\021\\351F\\355\\2102\\307\\204'::bytea, '\\234\\033RT\\000{\\005g\\021\\350\\342\\211\\277\\333\\330r'::bytea, '\\253\\223t\\3245\\013\\030\\255\\021\\350\\242!}\\006\\270\\037'::bytea, '\\253\\223t\\3245\\013\\030\\255\\021\\350\\242!}\\006\\270""'::bytea, '\\253\\223t\\3245\\013\\030\\255\\021\\350\\242!}\\006\\270%'::bytea, '\\253\\223t\\3245\\013\\030\\255\\021\\350\\244a\\024\\030G+'::bytea, '\\257_RT\\000{\\005g\\021\\350\\266lP36\\260'::bytea)
WHERE ((T10._Fld878 = CAST(0 AS NUMERIC))) AND ((T8._Folder = FALSE) OR (1=1))))) AND (((T8._Fld14119)::mvarchar LIKE '%ан%'::mvarchar) AND (T8._Fld14125 = FALSE) AND T8._Fld14131 = TRUE AND (T8._Marked = FALSE) AND (T8._Folder) = TRUE) LIMIT 10)
UNION (SELECT
T14._IDRRef,
CAST(((((((T14._Code || ' ('::mvarchar)) || T14._Description)) || ')'::mvarchar)) AS MVARCHAR(203)),
"::mvarchar,
CAST(1 AS NUMERIC)
FROM _Reference132 T14
WHERE (((T14._Fld878 = CAST(0 AS NUMERIC))) AND (EXISTS(SELECT
TRUE AS Q_001_F_000_
FROM _Reference106 T15
INNER JOIN _Reference75 T16
ON (T15._Fld13794 = 'Справочник.Контрагенты'::mvarchar) AND EXISTS(SELECT
TRUE AS Q_002_F_000_
FROM _InfoRg10986 T17
WHERE ((T17._Fld878 = CAST(0 AS NUMERIC))) AND ((T17._Fld10987_TYPE = '\\010'::bytea AND T17._Fld10987_RTRef = '\\000\\000\\000j'::bytea AND T17._Fld10987_RRRef = T15._IDRRef) AND (T17._Fld10988RRef = T16._IDRRef))) AND T16._IDRRef IN ('\\200\\312\\000\\340R\\201\\261\\321\\021\\351F\\355\\2102\\307\\204'::bytea, '\\234\\033RT\\000{\\005g\\021\\350\\342\\211\\277\\333\\330r'::bytea, '\\253\\223t\\3245\\013\\030\\255\\021\\350\\242!}\\006\\270\\037'::bytea, '\\253\\223t\\3245\\013\\030\\255\\021\\350\\242!}\\006\\270""'::bytea, '\\253\\223t\\3245\\013\\030\\255\\021\\350\\242!}\\006\\270%'::bytea, '\\253\\223t\\3245\\013\\030\\255\\021\\350\\244a\\024\\030G+'::bytea, '\\257_RT\\000{\\005g\\021\\350\\266lP36\\260'::bytea)
WHERE ((T16._Fld878 = CAST(0 AS NUMERIC))) AND ((T14._Folder = FALSE) OR (1=1))))) AND (((T14._Code)::mvarchar LIKE '%ан%'::mvarchar) AND (T14._Fld14125 = FALSE) AND T14._Fld14131 = TRUE AND (T14._Marked = FALSE) AND (T14._Folder) = TRUE) LIMIT 10)
UNION (SELECT
T20._IDRRef,
((((((T20._Fld28090 || ' ('::mvarchar)) || T20._Description)) || ')'::mvarchar)),
"::mvarchar,
CAST(1 AS NUMERIC)
FROM _Reference132 T20
WHERE (((T20._Fld878 = CAST(0 AS NUMERIC))) AND (EXISTS(SELECT
TRUE AS Q_001_F_000_
FROM _Reference106 T21
INNER JOIN _Reference75 T22
ON (T21._Fld13794 = 'Справочник.Контрагенты'::mvarchar) AND EXISTS(SELECT
TRUE AS Q_002_F_000_
FROM _InfoRg10986 T23
WHERE ((T23._Fld878 = CAST(0 AS NUMERIC))) AND ((T23._Fld10987_TYPE = '\\010'::bytea AND T23._Fld10987_RTRef = '\\000\\000\\000j'::bytea AND T23._Fld10987_RRRef = T21._IDRRef) AND (T23._Fld10988RRef = T22._IDRRef))) AND T22._IDRRef IN ('\\200\\312\\000\\340R\\201\\261\\321\\021\\351F\\355\\2102\\307\\204'::bytea, '\\234\\033RT\\000{\\005g\\021\\350\\342\\211\\277\\333\\330r'::bytea, '\\253\\223t\\3245\\013\\030\\255\\021\\350\\242!}\\006\\270\\037'::bytea, '\\253\\223t\\3245\\013\\030\\255\\021\\350\\242!}\\006\\270""'::bytea, '\\253\\223t\\3245\\013\\030\\255\\021\\350\\242!}\\006\\270%'::bytea, '\\253\\223t\\3245\\013\\030\\255\\021\\350\\244a\\024\\030G+'::bytea, '\\257_RT\\000{\\005g\\021\\350\\266lP36\\260'::bytea)
WHERE ((T22._Fld878 = CAST(0 AS NUMERIC))) AND ((T20._Folder = FALSE) OR (1=1))))) AND (((T20._Fld28090)::mvarchar LIKE '%ан%'::mvarchar) AND (T20._Fld14125 = FALSE) AND T20._Fld14131 = TRUE AND (T20._Marked = FALSE) AND (T20._Folder) = TRUE) LIMIT 10)
UNION (SELECT
T26._IDRRef,
((((((T26._Fld28091 || ' ('::mvarchar)) || T26._Description)) || ')'::mvarchar)),
"::mvarchar,
CAST(1 AS NUMERIC)
FROM _Reference132 T26
WHERE (((T26._Fld878 = CAST(0 AS NUMERIC))) AND (EXISTS(SELECT
TRUE AS Q_001_F_000_
FROM _Reference106 T27
INNER JOIN _Reference75 T28
ON (T27._Fld13794 = 'Справочник.Контрагенты'::mvarchar) AND EXISTS(SELECT
TRUE AS Q_002_F_000_
FROM _InfoRg10986 T29
WHERE ((T29._Fld878 = CAST(0 AS NUMERIC))) AND ((T29._Fld10987_TYPE = '\\010'::bytea AND T29._Fld10987_RTRef = '\\000\\000\\000j'::bytea AND T29._Fld10987_RRRef = T27._IDRRef) AND (T29._Fld10988RRef = T28._IDRRef))) AND T28._IDRRef IN ('\\200\\312\\000\\340R\\201\\261\\321\\021\\351F\\355\\2102\\307\\204'::bytea, '\\234\\033RT\\000{\\005g\\021\\350\\342\\211\\277\\333\\330r'::bytea, '\\253\\223t\\3245\\013\\030\\255\\021\\350\\242!}\\006\\270\\037'::bytea, '\\253\\223t\\3245\\013\\030\\255\\021\\350\\242!}\\006\\270""'::bytea, '\\253\\223t\\3245\\013\\030\\255\\021\\350\\242!}\\006\\270%'::bytea, '\\253\\223t\\3245\\013\\030\\255\\021\\350\\244a\\024\\030G+'::bytea, '\\257_RT\\000{\\005g\\021\\350\\266lP36\\260'::bytea)
WHERE ((T28._Fld878 = CAST(0 AS NUMERIC))) AND ((T26._Folder = FALSE) OR (1=1))))) AND (((T26._Fld28091)::mvarchar LIKE '%ан%'::mvarchar) AND (T26._Fld14125 = FALSE) AND T26._Fld14131 = TRUE AND (T26._Marked = FALSE) AND (T26._Folder) = TRUE) LIMIT 10)
UNION (SELECT DISTINCT
T32.Fld19114RRef,
CASE WHEN ((T36.Fld28089_)::mvarchar LIKE '%ан%'::mvarchar) OR ((T36.Fld28089_)::mvarchar LIKE 'ан'::mvarchar) THEN ((((((T36.Fld28089_ || ' ('::mvarchar)) || T43.Description_)) || ')'::mvarchar)) ELSE ((((((T43.Fld28091_ || ' ('::mvarchar)) || T43.Description_)) || ')'::mvarchar)) END,
"::mvarchar,
CAST(1 AS NUMERIC)
FROM (SELECT
T35._Fld19117 AS Fld19117_,
T35._Fld19115RRef AS Fld19115RRef,
T35._Fld19114RRef AS Fld19114RRef
FROM (SELECT
T34._Fld19114RRef AS Fld19114RRef,
T34._Fld19115RRef AS Fld19115RRef,
MAX(T34._Period) AS MAXPERIOD_
FROM _InfoRg19113 T34
WHERE (T34._Fld878 = CAST(0 AS NUMERIC))
GROUP BY T34._Fld19114RRef,
T34._Fld19115RRef) T33
INNER JOIN _InfoRg19113 T35
ON T33.Fld19114RRef = T35._Fld19114RRef AND T33.Fld19115RRef = T35._Fld19115RRef AND T33.MAXPERIOD_ = T35._Period
WHERE (T35._Fld878 = CAST(0 AS NUMERIC))) T32
LEFT OUTER JOIN (SELECT
T37._IDRRef AS IDRRef,
T37._Folder AS Folder_,
T37._Fld878 AS Fld878_,
T37._Fld28089 AS Fld28089_,
T37._Fld14075 AS Fld14075_
FROM _Reference131 T37
WHERE ((EXISTS(SELECT
TRUE AS Q_001_F_000_
FROM _Reference106 T38
INNER JOIN _Reference75 T39
ON (T38._Fld13794 = 'Справочник.КонтактныеЛица'::mvarchar) AND EXISTS(SELECT
TRUE AS Q_002_F_000_
FROM _InfoRg10986 T40
WHERE ((T40._Fld878 = CAST(0 AS NUMERIC))) AND ((T40._Fld10987_TYPE = '\\010'::bytea AND T40._Fld10987_RTRef = '\\000\\000\\000j'::bytea AND T40._Fld10987_RRRef = T38._IDRRef) AND (T40._Fld10988RRef = T39._IDRRef))) AND T39._IDRRef IN ('\\200\\312\\000\\340R\\201\\261\\321\\021\\351F\\355\\2102\\307\\204'::bytea, '\\234\\033RT\\000{\\005g\\021\\350\\342\\211\\277\\333\\330r'::bytea, '\\253\\223t\\3245\\013\\030\\255\\021\\350\\242!}\\006\\270\\037'::bytea, '\\253\\223t\\3245\\013\\030\\255\\021\\350\\242!}\\006\\270""'::bytea, '\\253\\223t\\3245\\013\\030\\255\\021\\350\\242!}\\006\\270%'::bytea, '\\253\\223t\\3245\\013\\030\\255\\021\\350\\244a\\024\\030G+'::bytea, '\\257_RT\\000{\\005g\\021\\350\\266lP36\\260'::bytea)
WHERE ((T39._Fld878 = CAST(0 AS NUMERIC))) AND ((T37._Folder = FALSE) OR (1=1))))) AND (T37._Fld878 = CAST(0 AS NUMERIC))) T36
ON (T32.Fld19115RRef = T36.IDRRef)
LEFT OUTER JOIN (SELECT
T44._IDRRef AS IDRRef,
T44._Folder AS Folder_,
T44._Fld878 AS Fld878_,
T44._Fld28091 AS Fld28091_,
T44._Description AS Description_
FROM _Reference132 T44
WHERE ((EXISTS(SELECT
TRUE AS Q_001_F_000_
FROM _Reference106 T45
INNER JOIN _Reference75 T46
ON (T45._Fld13794 = 'Справочник.Контрагенты'::mvarchar) AND EXISTS(SELECT
TRUE AS Q_002_F_000_
FROM _InfoRg10986 T47
WHERE ((T47._Fld878 = CAST(0 AS NUMERIC))) AND ((T47._Fld10987_TYPE = '\\010'::bytea AND T47._Fld10987_RTRef = '\\000\\000\\000j'::bytea AND T47._Fld10987_RRRef = T45._IDRRef) AND (T47._Fld10988RRef = T46._IDRRef))) AND T46._IDRRef IN ('\\200\\312\\000\\340R\\201\\261\\321\\021\\351F\\355\\2102\\307\\204'::bytea, '\\234\\033RT\\000{\\005g\\021\\350\\342\\211\\277\\333\\330r'::bytea, '\\253\\223t\\3245\\013\\030\\255\\021\\350\\242!}\\006\\270\\037'::bytea, '\\253\\223t\\3245\\013\\030\\255\\021\\350\\242!}\\006\\270""'::bytea, '\\253\\223t\\3245\\013\\030\\255\\021\\350\\242!}\\006\\270%'::bytea, '\\253\\223t\\3245\\013\\030\\255\\021\\350\\244a\\024\\030G+'::bytea, '\\257_RT\\000{\\005g\\021\\350\\266lP36\\260'::bytea)
WHERE ((T46._Fld878 = CAST(0 AS NUMERIC))) AND ((T44._Folder = FALSE) OR (1=1))))) AND (T44._Fld878 = CAST(0 AS NUMERIC))) T43
ON (T32.Fld19114RRef = T43.IDRRef)
WHERE (((T36.Fld28089_)::mvarchar LIKE '%ан%'::mvarchar) OR ((T36.Fld28089_)::mvarchar LIKE 'ан'::mvarchar) OR ((T43.Fld28091_)::mvarchar LIKE 'ан'::mvarchar)) AND (T32.Fld19117_ = FALSE) AND (T36.Fld14075_ = FALSE) LIMIT 10)
UNION (SELECT DISTINCT
T50.Fld19114RRef,
CASE WHEN ((T54.Fld28088_)::mvarchar LIKE '%ан%'::mvarchar) THEN ((((((T54.Fld28088_ || ' ('::mvarchar)) || T61.Description_)) || ')'::mvarchar)) ELSE ((((((T61.Fld28090_ || ' ('::mvarchar)) || T61.Description_)) || ')'::mvarchar)) END,
"::mvarchar,
CAST(1 AS NUMERIC)
FROM (SELECT
T53._Fld19117 AS Fld19117_,
T53._Fld19115RRef AS Fld19115RRef,
T53._Fld19114RRef AS Fld19114RRef
FROM (SELECT
T52._Fld19114RRef AS Fld19114RRef,
T52._Fld19115RRef AS Fld19115RRef,
MAX(T52._Period) AS MAXPERIOD_
FROM _InfoRg19113 T52
WHERE (T52._Fld878 = CAST(0 AS NUMERIC))
GROUP BY T52._Fld19114RRef,
T52._Fld19115RRef) T51
INNER JOIN _InfoRg19113 T53
ON T51.Fld19114RRef = T53._Fld19114RRef AND T51.Fld19115RRef = T53._Fld19115RRef AND T51.MAXPERIOD_ = T53._Period
WHERE (T53._Fld878 = CAST(0 AS NUMERIC))) T50
LEFT OUTER JOIN (SELECT
T55._IDRRef AS IDRRef,
T55._Folder AS Folder_,
T55._Fld878 AS Fld878_,
T55._Fld28088 AS Fld28088_,
T55._Fld14075 AS Fld14075_
FROM _Reference131 T55
WHERE ((EXISTS(SELECT
TRUE AS Q_001_F_000_
FROM _Reference106 T56
INNER JOIN _Reference75 T57
ON (T56._Fld13794 = 'Справочник.КонтактныеЛица'::mvarchar) AND EXISTS(SELECT
TRUE AS Q_002_F_000_
FROM _InfoRg10986 T58
WHERE ((T58._Fld878 = CAST(0 AS NUMERIC))) AND ((T58._Fld10987_TYPE = '\\010'::bytea AND T58._Fld10987_RTRef = '\\000\\000\\000j'::bytea AND T58._Fld10987_RRRef = T56._IDRRef) AND (T58._Fld10988RRef = T57._IDRRef))) AND T57._IDRRef IN ('\\200\\312\\000\\340R\\201\\261\\321\\021\\351F\\355\\2102\\307\\204'::bytea, '\\234\\033RT\\000{\\005g\\021\\350\\342\\211\\277\\333\\330r'::bytea, '\\253\\223t\\3245\\013\\030\\255\\021\\350\\242!}\\006\\270\\037'::bytea, '\\253\\223t\\3245\\013\\030\\255\\021\\350\\242!}\\006\\270""'::bytea, '\\253\\223t\\3245\\013\\030\\255\\021\\350\\242!}\\006\\270%'::bytea, '\\253\\223t\\3245\\013\\030\\255\\021\\350\\244a\\024\\030G+'::bytea, '\\257_RT\\000{\\005g\\021\\350\\266lP36\\260'::bytea)
WHERE ((T57._Fld878 = CAST(0 AS NUMERIC))) AND ((T55._Folder = FALSE) OR (1=1))))) AND (T55._Fld878 = CAST(0 AS NUMERIC))) T54
ON (T50.Fld19115RRef = T54.IDRRef)
LEFT OUTER JOIN (SELECT
T62._IDRRef AS IDRRef,
T62._Folder AS Folder_,
T62._Fld878 AS Fld878_,
T62._Fld28090 AS Fld28090_,
T62._Description AS Description_
FROM _Reference132 T62
WHERE ((EXISTS(SELECT
TRUE AS Q_001_F_000_
FROM _Reference106 T63
INNER JOIN _Reference75 T64
ON (T63._Fld13794 = 'Справочник.Контрагенты'::mvarchar) AND EXISTS(SELECT
TRUE AS Q_002_F_000_
FROM _InfoRg10986 T65
WHERE ((T65._Fld878 = CAST(0 AS NUMERIC))) AND ((T65._Fld10987_TYPE = '\\010'::bytea AND T65._Fld10987_RTRef = '\\000\\000\\000j'::bytea AND T65._Fld10987_RRRef = T63._IDRRef) AND (T65._Fld10988RRef = T64._IDRRef))) AND T64._IDRRef IN ('\\200\\312\\000\\340R\\201\\261\\321\\021\\351F\\355\\2102\\307\\204'::bytea, '\\234\\033RT\\000{\\005g\\021\\350\\342\\211\\277\\333\\330r'::bytea, '\\253\\223t\\3245\\013\\030\\255\\021\\350\\242!}\\006\\270\\037'::bytea, '\\253\\223t\\3245\\013\\030\\255\\021\\350\\242!}\\006\\270""'::bytea, '\\253\\223t\\3245\\013\\030\\255\\021\\350\\242!}\\006\\270%'::bytea, '\\253\\223t\\3245\\013\\030\\255\\021\\350\\244a\\024\\030G+'::bytea, '\\257_RT\\000{\\005g\\021\\350\\266lP36\\260'::bytea)
WHERE ((T64._Fld878 = CAST(0 AS NUMERIC))) AND ((T62._Folder = FALSE) OR (1=1))))) AND (T62._Fld878 = CAST(0 AS NUMERIC))) T61
ON (T50.Fld19114RRef = T61.IDRRef)
WHERE ((T54.Fld28088_)::mvarchar LIKE '%ан%'::mvarchar) AND (T50.Fld19117_ = FALSE) AND (T54.Fld14075_ = FALSE) LIMIT 10)"
Как оказалось это запрос автоподбора контрагента по строке в документах, одна из самых часто используемых операций и вроде бы простоя и понятная, от нее я не ожидал подвоха.
Пройдя всю цепочку вызовов на выходе получил следующий запрос 1с, там тоже много букв
ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 10
ЭлементыСправочника.Ссылка КАК Ссылка,
ЭлементыСправочника.Наименование КАК Представление,
"" КАК Организация,
1 КАК Порядок
ПОМЕСТИТЬ Существующие
ИЗ
Справочник.Контрагенты КАК ЭлементыСправочника
ГДЕ
ЭлементыСправочника.Наименование ПОДОБНО &СтрокаПоиска
И НЕ ЭлементыСправочника.Недействителен
И ЭлементыСправочника.Поставщик = &ПараметрПоставщик
И НЕ ЭлементыСправочника.ПометкаУдаления
И НЕ ЭлементыСправочника.ЭтоГруппа
ОБЪЕДИНИТЬ
ВЫБРАТЬ ПЕРВЫЕ 10
ЭлементыСправочника.Ссылка КАК Ссылка,
ЭлементыСправочника.ИНН + " (" + ЭлементыСправочника.Наименование + ")" КАК Представление,
"" КАК Организация,
1 КАК Порядок
ИЗ
Справочник.Контрагенты КАК ЭлементыСправочника
ГДЕ
ЭлементыСправочника.ИНН ПОДОБНО &СтрокаПоиска
И НЕ ЭлементыСправочника.Недействителен
И ЭлементыСправочника.Поставщик = &ПараметрПоставщик
И НЕ ЭлементыСправочника.ПометкаУдаления
И НЕ ЭлементыСправочника.ЭтоГруппа
ОБЪЕДИНИТЬ
ВЫБРАТЬ ПЕРВЫЕ 10
ЭлементыСправочника.Ссылка КАК Ссылка,
ЭлементыСправочника.Код + " (" + ЭлементыСправочника.Наименование + ")" КАК Представление,
"" КАК Организация,
1 КАК Порядок
ИЗ
Справочник.Контрагенты КАК ЭлементыСправочника
ГДЕ
ЭлементыСправочника.Код ПОДОБНО &СтрокаПоиска
И НЕ ЭлементыСправочника.Недействителен
И ЭлементыСправочника.Поставщик = &ПараметрПоставщик
И НЕ ЭлементыСправочника.ПометкаУдаления
И НЕ ЭлементыСправочника.ЭтоГруппа
ОБЪЕДИНИТЬ
ВЫБРАТЬ ПЕРВЫЕ 10
ЭлементыСправочника.Ссылка КАК Ссылка,
ЭлементыСправочника.АдресЭПДляПоиска + " (" + ЭлементыСправочника.Наименование + ")" КАК Представление,
"" КАК Организация,
1 КАК Порядок
ИЗ
Справочник.Контрагенты КАК ЭлементыСправочника
ГДЕ
ЭлементыСправочника.АдресЭПДляПоиска ПОДОБНО &СтрокаПоиска
И НЕ ЭлементыСправочника.Недействителен
И ЭлементыСправочника.Поставщик = &ПараметрПоставщик
И НЕ ЭлементыСправочника.ПометкаУдаления
И НЕ ЭлементыСправочника.ЭтоГруппа
ОБЪЕДИНИТЬ
ВЫБРАТЬ ПЕРВЫЕ 10
ЭлементыСправочника.Ссылка КАК Ссылка,
ЭлементыСправочника.НомерТелефонаДляПоиска + " (" + ЭлементыСправочника.Наименование + ")" КАК Представление,
"" КАК Организация,
1 КАК Порядок
ИЗ
Справочник.Контрагенты КАК ЭлементыСправочника
ГДЕ
ЭлементыСправочника.НомерТелефонаДляПоиска ПОДОБНО &СтрокаПоиска
И НЕ ЭлементыСправочника.Недействителен
И ЭлементыСправочника.Поставщик = &ПараметрПоставщик
И НЕ ЭлементыСправочника.ПометкаУдаления
И НЕ ЭлементыСправочника.ЭтоГруппа
ОБЪЕДИНИТЬ
ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 10
СвязиКонтрагентКонтакт.Контрагент КАК Ссылка,
ВЫБОР
КОГДА КонтактныеЛица.НомерТелефонаДляПоиска ПОДОБНО &СтрокаПоиска
ИЛИ КонтактныеЛица.НомерТелефонаДляПоиска ПОДОБНО &НомерТелефонаДляПоиска
ТОГДА КонтактныеЛица.НомерТелефонаДляПоиска + " (" + Контрагенты.Наименование + ")"
ИНАЧЕ Контрагенты.НомерТелефонаДляПоиска + " (" + Контрагенты.Наименование + ")"
КОНЕЦ КАК Представление,
"" КАК Организация,
1 КАК Порядок
ИЗ
РегистрСведений.СвязиКонтрагентКонтакт.СрезПоследних КАК СвязиКонтрагентКонтакт
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.КонтактныеЛица КАК КонтактныеЛица
ПО СвязиКонтрагентКонтакт.Контакт = КонтактныеЛица.Ссылка
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
ПО СвязиКонтрагентКонтакт.Контрагент = Контрагенты.Ссылка
ГДЕ
(КонтактныеЛица.НомерТелефонаДляПоиска ПОДОБНО &СтрокаПоиска
ИЛИ КонтактныеЛица.НомерТелефонаДляПоиска ПОДОБНО &НомерТелефонаДляПоиска
ИЛИ Контрагенты.НомерТелефонаДляПоиска ПОДОБНО &НомерТелефонаДляПоиска)
И СвязиКонтрагентКонтакт.СвязьНедействительна = ЛОЖЬ
И КонтактныеЛица.Недействителен = ЛОЖЬ
ОБЪЕДИНИТЬ
ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 10
СвязиКонтрагентКонтакт.Контрагент КАК Ссылка,
ВЫБОР
КОГДА КонтактныеЛица.АдресЭПДляПоиска ПОДОБНО &СтрокаПоиска
ТОГДА КонтактныеЛица.АдресЭПДляПоиска + " (" + Контрагенты.Наименование + ")"
ИНАЧЕ Контрагенты.АдресЭПДляПоиска + " (" + Контрагенты.Наименование + ")"
КОНЕЦ КАК Представление,
"" КАК Организация,
1 КАК Порядок
ИЗ
РегистрСведений.СвязиКонтрагентКонтакт.СрезПоследних КАК СвязиКонтрагентКонтакт
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.КонтактныеЛица КАК КонтактныеЛица
ПО СвязиКонтрагентКонтакт.Контакт = КонтактныеЛица.Ссылка
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
ПО СвязиКонтрагентКонтакт.Контрагент = Контрагенты.Ссылка
ГДЕ
КонтактныеЛица.АдресЭПДляПоиска ПОДОБНО &СтрокаПоиска
И СвязиКонтрагентКонтакт.СвязьНедействительна = ЛОЖЬ
И КонтактныеЛица.Недействителен = ЛОЖЬ;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 10
Существующие.Ссылка,
Существующие.Представление,
Существующие.Организация,
NULL КАК Идентификатор,
NULL КАК СозданПоСобытию,
Существующие.Порядок
ИЗ
Существующие КАК Существующие
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ ПЕРВЫЕ 10
КлассификаторКонтактов.Ссылка,
КлассификаторКонтактов.Title,
КлассификаторКонтактов.Organization,
КлассификаторКонтактов.Id,
КлассификаторКонтактов.СозданПоСобытию,
2
ИЗ
Справочник.КлассификаторКонтактов КАК КлассификаторКонтактов
ГДЕ
КлассификаторКонтактов.Пользователь = &Пользователь
И (КлассификаторКонтактов.Title ПОДОБНО &СтрокаПоиска
ИЛИ КлассификаторКонтактов.Organization ПОДОБНО &СтрокаПоиска
ИЛИ ВЫБОР
КОГДА КлассификаторКонтактов.СозданПоСобытию
ТОГДА КлассификаторКонтактов.Id ПОДОБНО &СтрокаПоиска
ИНАЧЕ ЛОЖЬ
КОНЕЦ)
И НЕ КлассификаторКонтактов.ПометкаУдаления
И НЕ КлассификаторКонтактов.Title В
(ВЫБРАТЬ
Существующие.Представление
ИЗ
Существующие)
УПОРЯДОЧИТЬ ПО
Существующие.Порядок,
Существующие.Представление
Если ознакомиться с запросом мы увидим широкие возможности по поиску контрагента, вот тебе стандартные наименование или ИНН, а также код, различные контактные данные, но на сколько часто вам нужны все варианты поиска в таком месте?
Для нас в 99% случаев поиск контрагента идет по наименованию или ИНН, и если и надо изредка найти контрагента по другим полям не поленимся откроем форму выбора контрагента.
Исходя из этого для оптимизации было сделано 2 шага:
1. Задана минимальная длинна строки в 4 символа при котором начинается поиск.
2. Максимально обрезан запрос, оставлено только необходимое для нас, вот что осталось
ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 10
ЭлементыСправочника.Ссылка КАК Ссылка,
ЭлементыСправочника.Наименование КАК Представление,
"" КАК Организация,
1 КАК Порядок
ИЗ
Справочник.Контрагенты КАК ЭлементыСправочника
ГДЕ
ЭлементыСправочника.Наименование ПОДОБНО &СтрокаПоиска
И НЕ ЭлементыСправочника.Недействителен
И НЕ ЭлементыСправочника.ПометкаУдаления
И НЕ ЭлементыСправочника.ЭтоГруппа
ОБЪЕДИНИТЬ
ВЫБРАТЬ ПЕРВЫЕ 10
ЭлементыСправочника.Ссылка,
ЭлементыСправочника.ИНН + " (" + ЭлементыСправочника.Наименование + ")",
"",
1
ИЗ
Справочник.Контрагенты КАК ЭлементыСправочника
ГДЕ
ЭлементыСправочника.ИНН ПОДОБНО &СтрокаПоиска
И НЕ ЭлементыСправочника.Недействителен
И НЕ ЭлементыСправочника.ПометкаУдаления
И НЕ ЭлементыСправочника.ЭтоГруппа
В итоге данная операция стала занимать меньше 3 секунд, в трассировке он больше не всплывает.
Данное поведение было выявлено в конфигурации УНФ 1.6.24.92, БД Postgre.
Во вложении расширение, которое реализует описанные исправления, если вдруг кому тоже доставляет неудобства данная операция
P.S
Повторю вопрос в заголовке, где баланс между производительностью и возможностями программы?
За себя скажу, что порой желание автоматизировать затуманивает глаза, вроде думаешь какую классную штуку сделал, здесь тебе и спецэффекты, и блэк джэк тоже присутствует, а о бизнесе забываешь, и автоматизация превращается в автоматизацию ради автоматизации.