У нас есть приложение, которое использует расширенные свойства для хранения метаданных столбцов.Столбцы имеют расширенные свойства для хранения описания поля, значений параметров, положения на экране и т. Д. Существует представление, которое запрашивает эти расширенные свойства, которое запрашивается один раз при запуске приложения.
Недавно мы обновились с 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?
(Кстати, новый сервер находится в «группах доступности всегда», но я не знаю, относится ли это кэта проблема)