Запросы к системным таблицам EXTENDED_PROPERTIES намного медленнее в SQL Server 2016, чем в SQL Server 2008 - PullRequest
1 голос
/ 26 сентября 2019

У нас есть приложение, которое использует расширенные свойства для хранения метаданных столбцов.Столбцы имеют расширенные свойства для хранения описания поля, значений параметров, положения на экране и т. Д. Существует представление, которое запрашивает эти расширенные свойства, которое запрашивается один раз при запуске приложения.

Недавно мы обновились с SQL Server.2008 до SQL Server 2016, и проблема в том, что это представление теперь намного медленнее, что приводит к зависанию приложения при запуске.

CREATE VIEW dbo.VW_FIELD_METADATA
AS
    SELECT
        CAST(UPPER(o.NAME) AS VARCHAR) AS TABLE_NAME, 
        CAST(UPPER(c.name) AS VARCHAR) AS COLUMN_NAME, 
        CONVERT(VARCHAR(250), VarLabel.Value) AS ColDescr,
        ValLabel.Name AS ValueName,
        CONVERT(VARCHAR(250), ValLabel.Value) AS ValueLabel
    FROM
        SYSOBJECTS O
    JOIN 
        SYSCOLUMNS C ON O.id = C.id 
    JOIN 
        SYS.EXTENDED_PROPERTIES VarLabel ON c.id = VarLabel.major_id  
                                         AND c.colid = VarLabel.minor_id 
                                         AND VarLabel.Name = 'VarLabel'
    LEFT JOIN 
        (SELECT MAJOR_ID, MINOR_ID, NAME, VALUE 
         FROM SYS.EXTENDED_PROPERTIES 
         WHERE Name LIKE 'ValLabel%') ValLabel ON c.id = ValLabel.major_id 
                                               AND c.colid = ValLabel.minor_id
    LEFT JOIN 
        SYS.EXTENDED_PROPERTIES Groep ON c.id = Groep.major_id 
                                      AND c.colid = Groep.minor_id 
                                      AND Groep.Name = 'Groep'
    --LEFT JOIN 
    --    SYS.EXTENDED_PROPERTIES Minimum ON c.id = Minimum.major_id AND c.colid = Minimum.minor_id AND Minimum.Name = 'Minimum'
    --LEFT JOIN 
    --    SYS.EXTENDED_PROPERTIES Maximum ON c.id = Maximum.major_id AND c.colid = Maximum.minor_id AND Maximum.Name = 'Maximum'
    --etc there are 8 more JOINS
WHERE
    (o.xtype = 'U' OR o.xtype = 'V')
GO

Существует много таблиц, столбцов и расширенных свойств, поэтому это приводит к>17000 строк

TABLE_NAME  |COLUMN_NAME   |ColDescr            |ValueName   |ValueLabel
------------+--------------+--------------------+------------+----------
PATIENT     |PATNR         |Registration number |NULL        |NULL
PATIENT     |FIRSTNAME     |First name          |NULL        |NULL
PATIENT     |SEX           |Patient sex         |ValLabel001 |1 = Male
PATIENT     |SEX           |Patient sex         |ValLabel002 |2 = Female
etc.

На старом SQL Server 2008 это занимает менее одной секунды, на новом SQL Server 2016 это занимает до двух минут, что приводит к превышению времени ожидания приложения.

  • SQL Server 2008 - 00:00:00 - 17371 строк
  • SQL Server 2016 - 00:01:46 - 17371 строк

Кстати, фактический запрос дляview еще длиннее, с примерно 8 дополнительными левыми соединениями, но затем, похоже, запрос вообще заходит в тупик и никогда не завершается, поэтому я сократил его для тестирования purposes.

В любом случае, я знаю, что мы можем решить эту проблему, установив для базы данных более старый уровень совместимости, поэтому Properties -> Options -> Compatibility level и установите для него «SQL Server 2008 (100)», но это полностью отменяет обновление сервера.и блокирует новые функции.

Мой вопрос: есть ли способ заставить этот запрос работать, сохраняя базу данных на уровне совместимости "SQL Server 2016 (130)"?Почему запрос этих системных таблиц занимает намного больше времени по сравнению с более ранней версией SQL Server?

(Кстати, новый сервер находится в «группах доступности всегда», но я не знаю, относится ли это кэта проблема)

...