Проблемы производительности TSQL с таблицами SYS - PullRequest
0 голосов
/ 14 сентября 2018

Я запускаю этот скрипт, чтобы получить список всех объектов, которые могут использовать таблицы из моего списка поиска, это необработанный список, который позже будет передан в 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 + ' %' 

Предполагаемый план выполнения: Est Plan picture

1 Ответ

0 голосов
/ 27 мая 2019

Такие выражения как убийство производительности:

mod.Definition LIKE '%' + x.TABLE_NAME + ' %' 

То, что вы пытаетесь сделать, может быть включено в:

sp_depends (Transact-SQL)

sp_depends manual

ps: для более подробных ответов вам нужно будет предоставить запрос, который можно выполнить в любой пустой системе.(включая операторы создания таблиц и т. д.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...