Производительность SQL Server снижается, когда текст запроса содержит определенное количество символов - PullRequest
1 голос
/ 28 мая 2019

Я настраиваю веб-сайт на новых серверах приложений и баз данных. Данные сервера:

  • Windows 2016 Standard
  • SQL Server 2017 (окончательная первоначальная версия) - 14.0.1000.169 (X64)
  • 16 ГБ ОЗУ на SQL и 8 ГБ на сервере приложений
  • 4 виртуальных процессора на SQL и 1 на сервере приложений
  • ВМ, работающие на локальных серверах (т.е. не в облаке)
  • Протокол TCP / IP настроен для SQL Server, именованные каналы отключены

Веб-страницы работают медленно, поэтому я попытался найти причину. То, что я в итоге нашел и не могу объяснить, это то, что если у меня есть простой запрос, например, (у этого запроса есть проблема, но я не запускаю его на веб-сайте):

SELECT 1

Сам по себе запрос не имеет проблем, но если я дополню его пробелами, чтобы текст запроса составлял 676 символов или более (до 675 работает нормально), выполнение магическим образом получит 500 мс. Если я продолжу добавлять пробелы примерно к 1500 символам, производительность будет в основном медленной со случайным увеличением здесь и там. Добавляя больше пробелов примерно к 2000 символам, запрос снова становится последовательно быстрым.

Выполнение запроса на самом сервере SQL не вызывает проблем, только при удаленном запуске. Я пробовал простой сценарий PowerShell, используя SqlCommand на сервере приложений, и я пробовал SQL Server Management Studio на другом компьютере, оба они работают медленно. SQL Profiler показывает, что запросы выполняются мгновенно, длительность равна 0 (процессор, чтение и запись также 0).

Вот некоторые примеры прогонов, полученные из статистики клиента SQL Management Studio с более медленными экземплярами, где размер запроса выше 675, и более быстрым экземпляром ниже 676.

Client processing time      0       0       0       15      0
Total execution time        15      62      531     546     531
Wait time on server replies 15      62      531     531     531


Возвращаясь к сайту, я не запускаю "SELECT 1" или дополняю запросы пробелами в коде сайта. Фактические запросы, выполняемые с веб-сайта, в основном из Entity Framework, и из-за того, как эти запросы построены, столбцы перечислены в предложении select, некоторые запросы имеют объединения, а предложения where - все эти значения приводят к тому, что длина текста запроса достигает это волшебное ограничение в 676 символов, и запрос выполняется медленно. Вот актуальный запрос с сайта:

exec sp_executesql N'SELECT 
[Extent1].[Id] AS [Id], 
[Extent1].[ID] AS [Id1], 
[Extent1].[Name] AS [Name], 
[Extent1].[Code] AS [Code], 
[Extent1].[DisplayOrder] AS [DisplayOrder], 
[Extent1].[ScreenTypeId] AS [ScreenTypeId], 
[Extent1].[Exclude] AS [Exclude], 
[Extent1].[Author] AS [Author], 
[Extent1].[Editor] AS [Editor], 
[Extent1].[Created] AS [Created], 
[Extent1].[Modified] AS [Modified], 
[Extent2].[Id] AS [Id2], 
[Extent2].[Name] AS [Name1], 
[Extent2].[ScreenUrl] AS [ScreenUrl], 
[Extent2].[Author] AS [Author1], 
[Extent2].[Editor] AS [Editor1], 
[Extent2].[Created] AS [Created1], 
[Extent2].[Modified] AS [Modified1]
FROM  [dbo].[ProfitCentre] AS [Extent1]
INNER JOIN [dbo].[ScreenType] AS [Extent2] ON [Extent1].[ScreenTypeId] = [Extent2].[Id]
WHERE [Extent1].[ScreenTypeId] = @p__linq__0',N'@p__linq__0 int',@p__linq__0=16


Почему запросы занимают столько времени, когда изменяется длина текста запроса, и как я могу это исправить?

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