具有 20 行的简单小巧 select 查询(大多数列为 nvarchar(max))花费的时间太长 - 15 秒或更多

Simple dapper select query with 20 rows(most of columns are nvarchar(max)) taking too long- 15 seconds and more

我的精巧代码在下面给出了 select 查询:

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

我的table设计如下:

[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 中 运行 这个 select 查询时,它会在 0 毫秒内返回。但是来自 dapper 的相同查询(上面的代码)花费的时间太长了。

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

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

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

它在 SQL Server Management Studio 中运行得很快的原因是它实际上 return 不是完整的列,它 return 只是前 X 个字符,所以不是正在处理所有 6+MB。当您 运行 通过代码(在本例中是精巧的)时,所有 6+MB 都被 returned.

如果您正在将文件存储在数据库中,则需要停止这样做并将它们存储在文件系统中,并使用数据库来存储文件的位置和元数据。

我不反对将 JSON/XML 存储在数据库中,但它确实会给 return 非常 大块数据,这有时需要return 的时间 - 比 SSMS 中的时间要长,SSMS 通常不会 return 向您提供完整信息。

但是 - 当您 return 处理这么多数据时,过滤很重要。我怀疑您的应用程序是否真的需要所有字段或所有记录来完成它要执行的操作;如果您过滤到查询中实际需要的内容,您应该会更快地获得结果。