Я настраиваю веб-сайт на новых серверах приложений и баз данных. Данные сервера:
- 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
Почему запросы занимают столько времени, когда изменяется длина текста запроса, и как я могу это исправить?