C# Linq To SQL 插入单个大行性能问题

C# Linq To SQL insert a single big row performance issue

我有一个程序使用旧的 Linq To SQL 将 ASP.NET 应用程序连接到 SQL 服务器数据库。 ASP.NET 应用程序和 SQL 服务器实例在同一台机器上,并且两个“环境”都已更新(IIS 10、NET Framework 4.8 和 SQL Server 2019)。

在软件中,我必须处理包含客户订单的虚拟购物车。 Cart 有很多字段,其中一个是 nvarchar 并包含“购物车文档”,通常只有几 KB,但有时可能达到几 MB(永远不会超过 10MB)

当我更新 2-3MB 范围内的文档字符串,然后更新包含它的单个行时,更新操作真的非常慢(2-2,5 秒)。 这里更新代码:

    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 代码直接到 SQL 服务器(使用 SSMS 连接并执行代码)。

此处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

这是我的 table 架构,因为您什么也看不到,它非常简单:

/****** 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

在 DBA Stack Overflow 用户的帮助下更深入地调查数据库分析(此处讨论 https://dba.stackexchange.com/questions/303400/sql-server-how-to-upload-big-json-into-column-performance-issue/303409#303409)后发现问题可能与磁盘有关。

因为某些生产系统遇到了与我的开发机器相同的问题,我询问了如何提高性能并收到了存储压缩版本数据的漂亮提示。 数据不是很大(在我的 scanrio 中)对于运行时的内存来说太慢 compression/decompression,并且大大减少了时间(使用 LZMA)。 从 2,5s 到 ~0,3 是一个非常好的改进。

感谢大家的宝贵帮助和提示。