Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 当查询文本具有特定数量的字符时,SQL Server性能会降低_Sql Server_Performance_Sql Server 2017 - Fatal编程技术网

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协议,命名管道已禁用
网页运行速度很慢,所以我一直在努力寻找原因。我最终发现,但无法解释的是,如果我有一个简单的查询,例如(此查询有问题,但我没有在网站上运行):

查询本身没有问题,但如果我用空格填充它,使查询文本为676个或更多字符(最多675个字符运行正常),执行时间将神奇地增加500毫秒。如果我一直在1500个字符左右添加空格,性能通常会很慢,到处都会随机增加。将更多的空格添加到大约2000个字符后,查询速度将再次保持一致

在SQL server本身上运行查询没有问题,只是在远程运行时。我在app server上尝试了使用SqlCommand的简单PowerShell脚本,在另一台机器上尝试了SQL server Management Studio,这两种脚本都很慢。SQL Profiler显示即时运行的查询,持续时间为0(CPU、读写也为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

回到网站,我没有运行“选择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个或更多数据包。任何错误或专业