我有一个程序,它使用旧的Linq到SQL将ASP.NET应用程序连接到Server。ASP.NET应用程序和Server实例位于同一台计算机上,两个“环境”都被更新(IIS10、NETFramework4.8和SQLServer2019)。
在软件中,我必须使用客户订单来处理虚拟购物车。Cart有许多字段,其中一个字段是nvarchar,包含"cart文档“,提示为很少KB,但有时可能达到几MB (不超过10 MB)。
当我在2-3MB的范围内卸载一个文档字符串,然后更新包含它的单行时,udpate操作非常非常慢(2-2,5s)。在这里,更新代码:
protected void Upsert(CartDto cart, bool isValidationUpsert = false )
{
lock (_sync)
{
if ((cart?.Id ?? 0) <= 0)
throw new ExtendedArgumentException("cartId");
using (var dbContext = ServiceLocator.ConnectionProvider.Instace<CartDataContext>())
{
var repository = new CartRepository(dbContext);
var existingCart = repository.Read(crt => crt.ID == cart.Id).FirstOrDefault();
if (existingCart == null)
{
existingCart = new tbl_set_Cart();
existingCart.Feed(cart);
repository.Create(existingCart);
}
else
{
existingCart.Feed(cart);
repository.Update(existingCart);
}
dbContext.SubmitChanges(); //<<--- This speecifi operation will take 2-2,5s previous instructions take a neglectable time
}
}
}我不知道为什么,也不知道如何在这个场景中提高性能。
-编辑:正如建议的那样,如果我将SQL代码直接运行到Server上(使用SSMS连接和执行代码),我已经对DB上的oepration进行了描述,并经历了相同的延迟(~2,5)事件。
在这里,SQL代码和性能统计:
DECLARE @p0 AS INT = [cart_id];
DECLARE @p1 AS INT = [entry_count];
DECLARE @p2 AS NVARCHAR(MAX) = '..document..';
UPDATE [dbo].[tbl_set_Cart]
SET [ITEMS_COUNT] = @p1, [ITEMS] = @p2
WHERE [ID] = @p0

这里是我的表模式,因为您看不到任何东西--它非常简单:
/****** Object: Table [dbo].[tbl_set_Cart] Script Date: 02/12/2021 15:44:07 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[tbl_set_Cart](
[ID] [int] NOT NULL,
[AS400_CUSTOMER_COD] [nvarchar](50) NOT NULL,
[AS400_LISTIN] [int] NOT NULL,
[VALUE] [nvarchar](max) NOT NULL,
[DELIVERY_COSTS] [nvarchar](max) NOT NULL,
[ITEMS_COUNT] [int] NOT NULL,
[ITEMS] [nvarchar](max) NOT NULL,
[KIND] [int] NOT NULL,
[CHECKOUT_INFO] [nvarchar](max) NOT NULL,
[ISSUES] [nvarchar](max) NOT NULL,
[LAST_CHECK] [datetime] NOT NULL,
[USER_ID] [int] NOT NULL,
[IMPERSONATED_USER_ID] [int] NOT NULL,
[OVERRIDE_PRICES] [bit] NOT NULL,
[HAS_ISSUE] [bit] NOT NULL,
[IS_CONFIRMED] [bit] NOT NULL,
[IS_COLLECTED] [bit] NOT NULL,
[_METADATA] [nvarchar](max) NOT NULL,
CONSTRAINT [PK_tbl_set_Cart] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO发布于 2021-12-02 17:33:26
经过深入研究,在DBA溢出用户的帮助下,DB分析(在这里讨论https://dba.stackexchange.com/questions/303400/sql-server-how-to-upload-big-json-into-column-performance-issue/303409#303409)可能是一个与磁盘相关的问题。
由于一些生产系统遇到了与我的开发机器相同的问题,所以我询问如何提高性能,并重新使用存储压缩版本数据的漂亮技巧。在运行时压缩/解压时,对于内存中的内存来说,数据不是太大(在我的scanrio中),而且这样可以戏剧性地减少时间(使用LZMA)。从2,5s到0,3是一个很好的改进。
感谢所有宝贵的帮助和建议。
https://stackoverflow.com/questions/70200267
复制相似问题