Я запускаю этот скрипт, чтобы получить список всех объектов, которые могут использовать таблицы из моего списка поиска, это необработанный список, который позже будет передан в sys.dm_sql_referenced_entities(Object)
.И я вижу супер низкую производительность, она никогда не заканчивается, все таблицы имеют максимум 2K строк, это потому, что возможно использование типов данных SYSNAME или что-то еще?
Я вижу проблему в том соединении FindList
, которое занимает 90% производительности.Я нахожусь на производственном уровне SQL Server 2016, где у меня никогда не было проблем.Был динамический SQL, который генерирует этот запрос, и я сейчас тестирую его как отдельный скрипт, мое первоначальное объединение для поиска таблицы было на первом этапе, теперь оно прокомментировано, я играл по-разному, результаты такие же супер медленные (никогда не завершались)).Использовал LEFT
против INNER join
тоже, чтобы попробовать, тоже самое.Ценю вас ведет.
FindList
таблица не имеет IDX, думаю, это не поможет, поскольку я использую LIKE
на JOIN
+ размер небольшой (максимум 2K).БД также небольшая имеет всего 100 объектов в sys.modules
; WITH cte AS
(
SELECT --TOP 2 -- 100 rows
mod.Definition,
o.name ObjName,
o.schema_id,
sch.Name Schema_name,
o.object_id,
o.type ObjType,
o.type_desc ObjTypeDesc
-- ,x.table_name --,
FROM
myDB.sys.sql_modules mod
-- INNER JOIN (SELECT TABLE_NAME FROM myDB.dbo.FindList WHERE rn =1) x ON mod.Definition LIKE '%'+x.TABLE_NAME+' %'
INNER JOIN
myDB.sys.all_objects o ON o.object_id = mod.object_id
INNER JOIN
myDB.sys.schemas sch ON sch.schema_id = o.schema_id
WHERE
o.name LIKE '%'+'0'+'%' -- this part from dynamic SQL
OR '0' = '0'
), cte_table AS
(
SELECT TABLE_NAME
FROM myDB.dbo.FindList
WHERE rn =1 -- 2000 rows
)
SELECT
ROW_NUMBER() OVER ( ORDER BY (SELECT 1)) rowNum,
mod.*,
x.table_name
FROM
cte mod
LEFT JOIN
cte_table x ON mod.Definition LIKE '%' + x.TABLE_NAME + ' %'
Предполагаемый план выполнения: 