SQL 当查询文本具有特定数量的字符时服务器性能变慢
SQL Server performance slow when query text has a particular number of characters
我正在新的应用程序和数据库服务器上建立一个网站。服务器详细信息是:
- Windows 2016 年标准
- SQL 服务器 2017 (RTM) - 14.0.1000.169 (X64)
- SQL16GB 内存,应用服务器 8GB
- 4 个虚拟 CPU 在 SQL 上,1 个在应用服务器上
- 虚拟机 运行在本地服务器上(即不在云端)
- TCP/IP 协议已为 SQL 服务器配置,命名管道已禁用
网页 运行 速度很慢,所以我深入研究以找出原因。我最终发现但无法解释的是,如果我有一个简单的查询,例如(此查询有问题,但我在网站上没有运行):
SELECT 1
查询本身没有问题,但如果我用空格填充它,使查询文本为 676 个字符或更多(最多 675 运行 秒),执行时间将神奇地增加 500 毫秒。如果我继续向大约 1500 个字符添加空格,则性能会很慢,并且会随机提升。向大约 2000 个字符添加更多空格,查询再次变得始终如一地快速。
运行在SQL服务器上的查询本身没有问题,只有在运行ning远程的时候。我已经在应用程序服务器上使用 SqlCommand 尝试了一个简单的 PowerShell 脚本,并且我已经在另一台机器上尝试了 SQL Server Management Studio,两者都很慢。 SQL Profiler 立即显示查询 运行ning,持续时间为 0(CPU,读取和写入也为 0)。
这里有一些示例 运行s,这来自 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 个字符限制和查询 运行s 慢。这是来自网站的实际查询:
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
为什么当查询文本的长度发生变化时查询会花费这么长时间,我该如何解决?
本例中的问题是由于虚拟机在主机环境中的设置方式所致。我不处理基础设施,所以我不确定具体细节,但基础设施人员将 VM 转移到适当的集群中并解决了性能问题。
我正在新的应用程序和数据库服务器上建立一个网站。服务器详细信息是:
- Windows 2016 年标准
- SQL 服务器 2017 (RTM) - 14.0.1000.169 (X64)
- SQL16GB 内存,应用服务器 8GB
- 4 个虚拟 CPU 在 SQL 上,1 个在应用服务器上
- 虚拟机 运行在本地服务器上(即不在云端)
- TCP/IP 协议已为 SQL 服务器配置,命名管道已禁用
网页 运行 速度很慢,所以我深入研究以找出原因。我最终发现但无法解释的是,如果我有一个简单的查询,例如(此查询有问题,但我在网站上没有运行):
SELECT 1
查询本身没有问题,但如果我用空格填充它,使查询文本为 676 个字符或更多(最多 675 运行 秒),执行时间将神奇地增加 500 毫秒。如果我继续向大约 1500 个字符添加空格,则性能会很慢,并且会随机提升。向大约 2000 个字符添加更多空格,查询再次变得始终如一地快速。
运行在SQL服务器上的查询本身没有问题,只有在运行ning远程的时候。我已经在应用程序服务器上使用 SqlCommand 尝试了一个简单的 PowerShell 脚本,并且我已经在另一台机器上尝试了 SQL Server Management Studio,两者都很慢。 SQL Profiler 立即显示查询 运行ning,持续时间为 0(CPU,读取和写入也为 0)。
这里有一些示例 运行s,这来自 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 个字符限制和查询 运行s 慢。这是来自网站的实际查询:
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
为什么当查询文本的长度发生变化时查询会花费这么长时间,我该如何解决?
本例中的问题是由于虚拟机在主机环境中的设置方式所致。我不处理基础设施,所以我不确定具体细节,但基础设施人员将 VM 转移到适当的集群中并解决了性能问题。