具有 20 行的简单 dapper 选择查询(大多数列是 nvarchar(max))需要太长 - 15 秒甚至更长时间

本文关键字:长时间 max nvarchar 简单 dapper 选择 查询 数列 具有 | 更新日期: 2024-10-30 08:22:41

下面给出了我的dapper代码和一个选择查询:

const string Sql = @"SELECT  [id]
                              ,[groupName]
                              ,[reqCap]
                              ,[impCap]
                              ,[player]
                              ,[resumeDate]
                              ,[whitelist]
                              ,[blacklist]
                              ,[Macros]
                              FROM [VideoServer].[dbo].[TagGroup]";
return await dc.Connection.QueryAsync<TagGroup>(Sql);

我的桌子设计如下:

[id] [int] IDENTITY(1,1) NOT NULL,
[groupName] [varchar](500) NOT NULL,
[reqCap] [int] NULL CONSTRAINT [DF_TagGroup_reqCap]  DEFAULT ((0)),
[impCap] [int] NULL CONSTRAINT [DF_TagGroup_impCap]  DEFAULT ((0)),
[player] [varchar](500) NULL,
[resumeDate] [date] NULL,
[whitelist] [nvarchar](max) NULL,
[blacklist] [nvarchar](max) NULL,
[Macros] [nvarchar](max) NULL

当我在SQL Server Management Studio中运行此选择查询时,它会在0毫秒内返回。但是来自dapper(上面的代码)的相同查询花费的时间太长。

有什么想法吗?这是因为nvarchar(max)吗?

如果我清除nvarchar(max)字段中的数据,它会非常快速地返回数据。

具有 20 行的简单 dapper 选择查询(大多数列是 nvarchar(max))需要太长 - 15 秒甚至更长时间

您正在尝试从数据库中为每条记录提取 600+Kb。 20 行使每个查询至少接近 6Mb。

它在 SQL Server Management Studio 中快速运行的原因是它实际上并不返回完整列,它只返回前 X 个字符,因此并非所有 6+MB 都在处理中。当您运行代码(在本例中为 dapper)时,将返回所有 6+MB。

如果要将文件存储在数据库中,则需要停止执行此操作并将它们存储在文件系统中,并使用数据库来存储文件的位置和元数据。

我不反对在数据库中存储 JSON/XML,但它有时会返回非常大的数据块,这需要时间才能返回 - 并且比 SSMS 中更多,后者通常不会向您返回完整信息。

但是 - 当您返回如此多的数据时,过滤很重要。我怀疑您的应用程序真的需要所有字段或所有记录来尝试执行的操作;如果筛选到查询中实际需要的内容,则应获得更快的结果。