Sql server 当查询文本具有特定数量的字符时,SQL Server性能会降低
我正在新的应用程序和数据库服务器上建立一个网站。服务器详细信息如下:Sql server 当查询文本具有特定数量的字符时,SQL Server性能会降低,sql-server,performance,sql-server-2017,Sql Server,Performance,Sql Server 2017,我正在新的应用程序和数据库服务器上建立一个网站。服务器详细信息如下: Windows 2016标准 SQL Server 2017(RTM)-14.0.1000.169(X64) SQL上的16GB内存和app server上的8GB内存 SQL上有4个虚拟CPU,app server上有1个 在本地服务器上运行的虚拟机(即不在云中) 已为SQL Server配置TCP/IP协议,命名管道已禁用 网页运行速度很慢,所以我一直在努力寻找原因。我最终发现,但无法解释的是,如果我有一个简单的查询,
- Windows 2016标准
- SQL Server 2017(RTM)-14.0.1000.169(X64)
- SQL上的16GB内存和app server上的8GB内存
- SQL上有4个虚拟CPU,app server上有1个
- 在本地服务器上运行的虚拟机(即不在云中)
- 已为SQL Server配置TCP/IP协议,命名管道已禁用
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
回到网站,我没有运行“选择1”或在网站代码中用空格填充查询。从网站执行的实际查询主要来自实体框架,由于这些查询的构造方式、select子句中列出的列、一些查询具有JOIN和where子句,所有这些都会导致查询文本长度达到676个字符的限制,并且查询运行缓慢。以下是来自网站的实际查询:
SELECT 1
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
当查询文本的长度发生变化时,为什么查询会花费如此长的时间?我如何修复它?本例中的问题是由于虚拟机在主机环境中的设置方式。我不涉及基础设施,因此我不确定具体细节,但基础设施人员将虚拟机转移到适当的集群中,从而解决了性能问题。本例中的问题是由于虚拟机在主机环境中的设置方式。我不涉及基础设施,因此我不确定具体细节,但基础设施人员将虚拟机转移到适当的集群中,从而解决了性能问题。可能与计划缓存有关。使用
DBCC-FREEPROCCACHE代码>用于删除所有计划更改并再次运行查询。有关mor信息,请参见,听起来您的查询对参数嗅探非常敏感。通过添加空格更改文本时,将绕过计划缓存,并为特定的参数集编译查询,因此该查询可能是该参数集的最佳查询。请尝试使用“重新编译”选项运行该语句,并查看是否仍看到该行为。通常,在后台为查询生成哈希,如果新查询的哈希与现有的不同,则生成新计划,否则如果已经存在哈希,则使用现有计划<代码>选择1选项(重新编译)
另一种方法,而不是每次重新编译查询的选项(重新编译)
是使用选项(针对未知优化)
。一些解释。我尝试清除计划缓存,我尝试清除缓存,自己运行查询,清除缓存,然后使用空格运行。同样奇怪的行为。也尝试了这两个选项,重新编译和优化未知的,仍然运行缓慢的空间和快速没有。如果没有参数,那么即使对于“选择1”这样简单的东西,参数嗅探也会起作用吗?我们将db服务器规格提升到荒谬的水平,128GB RAM和32个虚拟CPU,只是为了确保。。。不,仍然需要500毫秒。也许这与计划缓存有关。使用DBCC-FREEPROCCACHE代码>用于删除所有计划更改并再次运行查询。有关mor信息,请参见,听起来您的查询对参数嗅探非常敏感。通过添加空格更改文本时,将绕过计划缓存,并为特定的参数集编译查询,因此该查询可能是该参数集的最佳查询。请尝试使用“重新编译”选项运行该语句,并查看是否仍看到该行为。通常,在后台为查询生成哈希,如果新查询的哈希与现有的不同,则生成新计划,否则如果已经存在哈希,则使用现有计划<代码>选择1选项(重新编译)
另一种方法,而不是每次重新编译查询的选项(重新编译)
是使用选项(针对未知优化)
。一些解释。我尝试清除计划缓存,我尝试清除缓存,自己运行查询,清除缓存,然后使用空格运行。同样奇怪的行为。也尝试了这两个选项,重新编译和优化未知的,仍然运行缓慢的空间和快速没有。如果没有参数,那么即使对于“选择1”这样简单的东西,参数嗅探也会起作用吗?我们将db服务器规格提升到荒谬的水平,128GB RAM和32个虚拟CPU,只是为了确保。。。不,仍然需要500毫秒。很高兴你得到了答案。我想说的是客户端和SQLServer之间的网络数据包/数据块相关。较长的文本可能会将其翻转到边缘,因此查询需要发送2个或更多数据包。任何错误或专业