【问题标题】:Simple dapper select query with 20 rows(most of columns are nvarchar(max)) taking too long- 15 seconds and more具有 20 行的简单小巧的选择查询(大多数列是 nvarchar(max))耗时太长 - 15 秒甚至更多
【发布时间】:2016-04-20 13:47:48
【问题描述】:

我的简洁代码在下面给出了一个选择查询:

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) 字段中的数据,它会非常快地返回数据。

【问题讨论】:

  • nvarchar(max) 字段中有多少数据?未对 nvarchar(max) 字段执行索引,因此这可能是原因之一。此外,最大字段与非最大字段的存储方式不同。
  • 每个 nvarchar(max) 列中有 200KB 或更多
  • 没有 WHERE 子句,所以索引在这里帮不上忙
  • 啊,所以你想为每条记录从数据库中提取 600+Kb 吗? 20 行使得每个查询至少几乎是 6Mb。在 SQL Server Management Studio 中运行它时,它实际上并没有返回完整的列,它只返回前 X 个字符。
  • 加上用户说的,最多可以显示65535个字符(在Options -&gt; Query Results -&gt; Results to Grid可调),也就是65k。

标签: c# sql-server ssms dapper nvarchar


【解决方案1】:

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

它在 SQL Server Management Studio 中运行得很快的原因是它实际上并没有返回完整的列,它只返回前 X 个字符,因此不是所有 6+MB 都在处理。当您运行代码时(在这种情况下是小巧玲珑),则返回所有 6+MB。

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

【讨论】:

  • 是一个json字符串。当然,将 csv 转换为 json 数组。我需要这种方式,我不想将它存储为文件
  • @ManuMohanT 那么您需要弄清楚如何减少同时提取的数据量。仅提取每个查询所需的最少行/列。如果用户想要查看 CSV,那么只有在拉出该特定列。但是您需要找到一种更好的方法来存储数据,而不是在数据库中存储大量 JSON 字符串。
【解决方案2】:

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

但是 - 当您返回这么多数据时,过滤很重要。我怀疑您的应用程序是否真的需要所有字段或所有记录来完成它正在尝试做的事情;如果您在查询中过滤到您实际需要的内容,您应该会得到更快的结果。

【讨论】:

  • 没有过滤器。我想要所有行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-28
  • 2018-12-17
相关资源
最近更新 更多