gpt4 book ai didi

sql-server - 包含来自SQL Azure的具有较大NVARCHAR值的列的查询速度很慢

转载 作者:行者123 更新时间:2023-12-03 00:44:13 24 4
gpt4 key购买 nike

我在Azure数据库中有一个表,该表已开始缓慢响应查询。
查询看起来像:

SELECT [Id] --nvarchar(128), PrimaryKey
,[Name] --nvarchar(max)
,[Description] --nvarchar(max)
,[Modified] --datetime2(7)
,[LastModifiedBy] --nvarchar(max)
,[Opened] --datetime2(7)
,[Editor] --nvarchar(max)
,[Json] --nvarchar(max) <--THIS IS GIVING ME PROBLEMS
,[IsActive] --bit
FROM [dbo].[TableName]

具体来说,当我在查询中包含[Json]列时,SQL查询性能从不到一秒变为几分钟。当包含[Json]列时,即使仅请求一条记录也可能需要几分钟。此列包含json格式的长字符串(〜500000个字符)。仅当包含此列时,性能才会下降-包含较小字符串的其他NVARCHAR(max)列不是问题。

我通过使用Entity Framework linq-to-entities查询的MVC5应用程序的性能问题发现了此问题:
var model=await db.TableName.FirstOrDefaultAsync(s => s.Id == id);

这产生了一个类似于上面的sql查询。在本地开发计算机上运行没有问题的单个案例的Edit方法要花几分钟的时间才能加载到服务器上。然后,我调查了直接的数据库查询,以查看问题所在,并发现查询时间很长。

在不同的查询方法中,此性能问题不一致。

我的以下查询的周转时间为3分钟:
SELECT Json FROM [dbo].[TableName] WHERE [Id]=<id>

周转时间与返回的字符串长度成指数比例。例如,此查询大约需要10秒钟:
SELECT SUBSTRING(Json,1,50000) FROM [dbo].[TableName] WHERE [Id]=<id>

如下所示,服务器上的查询将花费不到一秒钟的时间:
DECLARE @variable nvarchar(max);
SELECT @variable=Json FROM [dbo].[TableName] where Id='<id>';
SELECT LENGTH(@variable);

但是实际上按照以下方式检索数据需要我花费几分钟的时间:
DECLARE @variable nvarchar(max);
SELECT @variable=Json FROM [dbo].[TableName] where Id='<id>';
SELECT @variable;

我的最终目标是弄清楚如何使Entity Framework的linq-to-entities查询以合理的速度执行,以便我可以使用C#中的数据,而且我认为不能强制EF动态地生成这样的查询。

我以前从未与其他存储大字符串的表遇到过这种困难。是否存在我错误设置的设置,还是在这种情况下构建EF linq-to-sql语句的最佳实践?

为了进行比较,在具有相同数据库副本的SQL Server本地实例上运行查询时,没有性能问题。所有查询都将在不到一秒钟的时间内返回。

-UPDATE-

我一直在监视,并且这个问题在没有任何代码更改的情况下消失了。所有查询响应时间都恢复到不到一秒。但是,也没有来自Azure的服务中断通知。实际上,在整个问题期间,数据库是完全可访问的,唯一的问题是慢查询涉及到返回大字符串值的字段。

不利的一面是,我无法再重现该问题。

对于在Azure上出现此问题的其他人(似乎是不规则的),此行为的诊断症状是:
  • 没有Azure-SQL Server中断
  • 不返回大字符串值的查询的
  • 健康响应时间
  • 对于任何查询,即使它们返回大字符串值,Azure-SQL Server的
  • 正常资源使用情况
  • 在从属应用程序中,连接应用程序会引发两种类型的错误:a)连接超时错误,以及b)关闭连接错误。没有上下文信息可以区分何时抛出任何一种错误。
  • 涉及长字符串的查询的响应时间与返回的字符串的长度成指数关系。例如,瞬时有10个字符,50000需要10秒,500000需要几分钟,等等。但是,响应时间不一致。
  • 完全在服务器上执行的字符串处理(即使是很长的字符串),不需要返回长字符串值,这需要花费正常的时间。

  • 万一有人有实际答案,我将保留这个问题,但是看来解决方案是仅等待Azure解决他们正在修改的有关其请求处理的所有内容。看来,此问题与从Azure DB传输数据有关,而不是与服务器上的处理有关。
    我的最高建议是,如果问题是由上述症状所表征的,则不要拆开在开发箱上可以正常工作的代码。

    最佳答案

    这听起来像是返回nvarchar(max)的通用问题,所以也许最好联系Azure支持团队:

  • 将此报告为Azure Sql Db反馈网站上的错误:
    https://feedback.azure.com/forums/217321-sql-database/category/129652-bugs
  • 在推特上联系@AzureSupport
  • 通过Azure门户发送支持请求:数据库/诊断和解决问题
  • 通过Azure门户
  • 检查服务运行状况

    由于无法重现此问题,并且代码中没有任何修复程序,因此我看不到Azure支持团队以外的其他人可以如何提供帮助。

    关于sql-server - 包含来自SQL Azure的具有较大NVARCHAR值的列的查询速度很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39091093/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com