Closed Sirruf82 closed 1 year ago
Покажи тексты наиболее долгих запросов БД (желательно вместе с планами) операции НайтиПоСсылкам(), переведенные в термины метаданных (например конвертором текста БД ИР).
Сообщи длительность поиска одинакового набора ссылок в инструменте "Удаление объектов с контролем ссылок (ИР)" в двух режимах:
Покажи тексты наиболее долгих запросов БД (желательно вместе с планами) операции НайтиПоСсылкам(), переведенные в термины метаданных конвертором ИР.
'SELECT T1._Fld24724_TYPE, T1._Fld24724_L, T1._Fld24724_RTRef, РегистрСведений.ЗначенияПоказателейОтчетов5_T1.Аналитика1, T1._Fld24725_TYPE, T1._Fld24725_L, T1._Fld24725_RTRef, РегистрСведений.ЗначенияПоказателейОтчетов5_T1.Аналитика2, T1._Fld24726_TYPE, T1._Fld24726_L, T1._Fld24726_RTRef, РегистрСведений.ЗначенияПоказателейОтчетов5_T1.Аналитика3, T1._Fld24727_TYPE, T1._Fld24727_L, T1._Fld24727_RTRef, РегистрСведений.ЗначенияПоказателейОтчетов5_T1.Аналитика4, РегистрСведений.ЗначенияПоказателейОтчетов5_T1.Версия, РегистрСведений.ЗначенияПоказателейОтчетов5_T1.Версия, РегистрСведений.ЗначенияПоказателейОтчетов5_T1.Показатель, T1._Fld24724_TYPE, T1._Fld24724_L, T1._Fld24724_RTRef, РегистрСведений.ЗначенияПоказателейОтчетов5_T1.Аналитика1, T1._Fld24725_TYPE, T1._Fld24725_L, T1._Fld24725_RTRef, РегистрСведений.ЗначенияПоказателейОтчетов5_T1.Аналитика2, T1._Fld24726_TYPE, T1._Fld24726_L, T1._Fld24726_RTRef, РегистрСведений.ЗначенияПоказателейОтчетов5_T1.Аналитика3, T1._Fld24727_TYPE, T1._Fld24727_L, T1._Fld24727_RTRef, РегистрСведений.ЗначенияПоказателейОтчетов5_T1.Аналитика4, РегистрСведений.ЗначенияПоказателейОтчетов5_T1.Аналитика5, РегистрСведений.ЗначенияПоказателейОтчетов5_T1.АналитикаВалюта, T1._Fld51239RRef FROM dbo.РегистрСведений.ЗначенияПоказателейОтчетов5 T1 WHERE ((РегистрСведений.ЗначенияПоказателейОтчетов5_T1.ОбластьДанныхОсновныеДанные = ?)) AND (((T1._Fld24724_TYPE = 0x08 AND T1._Fld24724_RTRef = 0x00000059 AND РегистрСведений.ЗначенияПоказателейОтчетов5_T1.Аналитика1 IN (?))) OR ((T1._Fld24725_TYPE = 0x08 AND T1._Fld24725_RTRef = 0x00000059 AND РегистрСведений.ЗначенияПоказателейОтчетов5_T1.Аналитика2 IN (?))) OR ((T1._Fld24726_TYPE = 0x08 AND T1._Fld24726_RTRef = 0x00000059 AND РегистрСведений.ЗначенияПоказателейОтчетов5_T1.Аналитика3 IN (?))) OR ((T1._Fld24727_TYPE = 0x08 AND T1._Fld24727_RTRef = 0x00000059 AND РегистрСведений.ЗначенияПоказателейОтчетов5_T1.Аналитика4 IN (?))))
Запрос выполняется около 5 минут и ничего не возвращает, так как в этом регистре в принципе нет ссылок на справочник с дублями. Тип значения полей Аналитика1, 2, 3, 4 - ПВХ.ВидыСубконтоКоммерческие. То есть нужна настройка позволяющая гибко ограничить поиск ссылок...
В функции НайтиПоСсылкам есть возможность исключения из поиска объектов метаданных, но нет возможности исключения из поиска отдельных реквизитов объектов метаданных. Например, мы точно знаем, что в реквизитах с типом ПВХ.ВидыСубконто искать дубли не нужно.
Кстати, интересно в функции НайтиПоСсылкам есть параметр <ИсключитьОбъекты> (необязательный) Тип: [Массив] В качестве элементов массива могут выступать: Объект метаданных, Строка – полное имя объекта метаданных.
Можно ли в этом параметре указать, например, реквизит табличной части документа, по идее это же тоже объект метаданных?
Создал задачу https://www.hostedredmine.com/issues/964567
Можешь пояснить почему нужно именно колонки, а не таблицы исключать из поиска? Покажи структуру регистра РегистрСведений.ЗначенияПоказателейОтчетов1 чтобы были видны типы колонок.
Например, вот запрос поиска дублей в документе ЗаявкаНаРасход:
'INSERT INTO #tt1 WITH(TABLOCK) (_C_1RRef, _C_2RRef, _TTC_1, _TTC_1_0, _TTC_2, _TTC_3, _TTC_4RRef) SELECT TOP 25000 Документ.ЗаявкаНаРасход_T1.Ссылка, Документ.ЗаявкаНаРасход_T1.АЛП_Склад, Документ.ЗаявкаНаРасход_T1.Ссылка, Документ.ЗаявкаНаРасход_T1.ОбластьДанныхОсновныеДанные, CASE WHEN ((Документ.ЗаявкаНаРасход_T1.ОбластьДанныхОсновныеДанные = ?)) THEN 0x01 ELSE 0x00 END AS T9, CASE WHEN ((Документ.ЗаявкаНаРасход_T1.АЛП_Склад IN (?))) THEN 0x01 ELSE 0x00 END AS T10, Документ.ЗаявкаНаРасход_T1.Ссылка AS T11 FROM dbo.Документ.ЗаявкаНаРасход T1 WHERE ((Документ.ЗаявкаНаРасход_T1.ОбластьДанныхОсновныеДанные = ?)) AND ((((Документ.ЗаявкаНаРасход_T1.АЛП_Склад IN (?))) OR EXISTS( SELECT 1 FROM dbo.Документ.ЗаявкаНаРасход_VT7099 T2 WHERE Документ.ЗаявкаНаРасход_T1.ОбластьДанныхОсновныеДанные = T2._Fld2256 AND Документ.ЗаявкаНаРасход_T1.Ссылка = T2.Документ.ЗаявкаНаРасход_IDRRef AND (((T2._Fld7103_TYPE = 0x08 AND T2._Fld7103_RTRef = 0x00000059 AND T2._Fld7103_RRRef IN (?))))) OR EXISTS( SELECT 1 FROM dbo.Документ.ЗаявкаНаРасход_VT7099 T3 WHERE Документ.ЗаявкаНаРасход_T1.ОбластьДанныхОсновныеДанные = T3._Fld2256 AND Документ.ЗаявкаНаРасход_T1.Ссылка = T3.Документ.ЗаявкаНаРасход_IDRRef AND (((T3._Fld7104_TYPE = 0x08 AND T3._Fld7104_RTRef = 0x00000059 AND T3._Fld7104_RRRef IN (?))))) OR EXISTS( SELECT 1 FROM dbo.Документ.ЗаявкаНаРасход_VT7099 T4 WHERE Документ.ЗаявкаНаРасход_T1.ОбластьДанныхОсновныеДанные = T4._Fld2256 AND Документ.ЗаявкаНаРасход_T1.Ссылка = T4.Документ.ЗаявкаНаРасход_IDRRef AND (((T4._Fld7105_TYPE = 0x08 AND T4._Fld7105_RTRef = 0x00000059 AND T4._Fld7105_RRRef IN (?))))) OR EXISTS( SELECT 1 FROM dbo.Документ.ЗаявкаНаРасход_VT7099 T5 WHERE Документ.ЗаявкаНаРасход_T1.ОбластьДанныхОсновныеДанные = T5._Fld2256 AND Документ.ЗаявкаНаРасход_T1.Ссылка = T5.Документ.ЗаявкаНаРасход_IDRRef AND (((T5._Fld50182RRef IN (?))))) OR EXISTS( SELECT 1 FROM dbo.Документ.ЗаявкаНаРасход_VT7112 T6 WHERE Документ.ЗаявкаНаРасход_T1.ОбластьДанныхОсновныеДанные = T6._Fld2256 AND Документ.ЗаявкаНаРасход_T1.Ссылка = T6.Документ.ЗаявкаНаРасход_IDRRef AND (((T6._Fld7117_TYPE = 0x08 AND T6._Fld7117_RTRef = 0x00000059 AND T6._Fld7117_RRRef IN (?))))) OR EXISTS( SELECT 1 FROM dbo.Документ.ЗаявкаНаРасход_VT7112 T7 WHERE Документ.ЗаявкаНаРасход_T1.ОбластьДанныхОсновныеДанные = T7._Fld2256 AND Документ.ЗаявкаНаРасход_T1.Ссылка = T7.Документ.ЗаявкаНаРасход_IDRRef AND (((T7._Fld7118_TYPE = 0x08 AND T7._Fld7118_RTRef = 0x00000059 AND T7._Fld7118_RRRef IN (?))))) OR EXISTS( SELECT 1 FROM dbo.Документ.ЗаявкаНаРасход_VT7112 T8 WHERE Документ.ЗаявкаНаРасход_T1.ОбластьДанныхОсновныеДанные = T8._Fld2256 AND Документ.ЗаявкаНаРасход_T1.Ссылка = T8.Документ.ЗаявкаНаРасход_IDRRef AND (((T8._Fld7119_TYPE = 0x08 AND T8._Fld7119_RTRef = 0x00000059 AND T8._Fld7119_RRRef IN (?))))))) ORDER BY Документ.ЗаявкаНаРасход_T1.Ссылка
Он ищет дубли по реквизитам АналитикаБДР1, АналитикаБДР2, АналитикаБДР3, Аналитика1, Аналитика2, Аналитика3 табличных частей ДвиженияОперации, РезультатыКонтроля. Из-за чего собственно запрос поиска выполняется в данном случае около 5 минут. На самом деле искать по этим реквизитам не нужно, так как в этом документе данные реквизиты в принципе не заполнены. То есть необходима возможность исключить из поиска дублей определенные реквизиты документа. Прикладываю скриншот с типами реквизитов.
Теперь понятно, что такие реквизиты находятся на поддержке для упрощения обновления конфигурации поставщика. Иначе был плохо понятен смысл их существования. Было бы неплохо еще и общую техническую информацию получить (из окна "О подсистеме").
Реализовано в 6.78
Реализовано в 6.78
Спасибо! Посмотрю
В связи с неприемлемо низкой скоростью работы функции НайтиПоСсылкам() было бы полезно разработать альтернативный механизм поиска ссылок на объекты (используется в подсистеме "Поиск дублей и замена ссылок"). Альтернативный алгоритм: