Sql server 使用varchar进行慢速“选择”查询(最大值)

Sql server 使用varchar进行慢速“选择”查询(最大值),sql-server,sql-server-2008-r2,Sql Server,Sql Server 2008 R2,我有一张500行的小桌子。 此表有10列,包括一个varcharmax列 执行此查询时: SELECT TOP 36 * FROM MyTable WHERE (Column1 = Value1) 它在3分钟内检索大约36行。 varcharmax列每行包含3000个字符 如果我尝试只检索少一行: SELECT TOP 35 * FROM MyTable WHERE (Column1 = Value1) 然后查询在0秒内检索35行 在我的客户端统计数据(从服务器接收的字节数)中,我有: 95

我有一张500行的小桌子。 此表有10列,包括一个varcharmax列

执行此查询时:

SELECT TOP 36 *
FROM MyTable
WHERE (Column1 = Value1)
它在3分钟内检索大约36行。 varcharmax列每行包含3000个字符

如果我尝试只检索少一行:

SELECT TOP 35 *
FROM MyTable
WHERE (Column1 = Value1)
然后查询在0秒内检索35行

在我的客户端统计数据(从服务器接收的字节数)中,我有:

95 292用于在0秒内检索数据的查询

在3分钟内检索数据的查询超过2000000

你知道它是从哪里来的吗

编辑以下是我的真实代码:

select top 36 *
from Snapshots
where ExamId = 212

select top 35 *
from Snapshots
where ExamId = 212
编辑有关客户端统计信息的更多信息

两个差异巨大的统计数据是:

从服务器接收的字节数:66038比2000多


从服务器30对11000接收的TDS数据包使用ExamId索引也使用select field1、field2等,而不是select*。

我不确定,但请尝试以下操作:

从ExamId=212的快照中选择*从ExamId=212的快照中选择前36名ExamId


您的执行时间应该很短,而fetch要长得多。 从SELECT TOP语句中删除varcharmax,并仅在您特别需要时检索这些值。

在运行SELECT查询之前包括SET STATISTICS IO ON并提供输出。另外,您可以发布来自两个不同查询的查询计划,因为这将大大有助于解释差异是什么。您可以使用上载它并提供链接

您的TOP也没有匹配的ORDER BY,因此您无法保证返回的前35行或36行的顺序。这意味着35行可能不全部包含在36行中,并且您可能返回的数据量大不相同


最后,还可以尝试在SSMS中启用查询的客户端统计信息-这将显示在返回结果集时,延迟是在服务器端还是全部在延迟中。

没有完整的表描述作为DDL语句创建表。。。和索引,这是很难回答的


一个重要的问题是:创建表时是否使用指令TEXTIMAGE_ON?这将把LOB存储与关系数据分开,以避免行溢出存储…

尝试过了。不更改任何内容i trusted and replaced=为in,并且不更改任何内容如果问题已经存在,请发送查询计划。@Toc您是否设法解决了此问题?我遇到了完全相同的问题。只有10条记录,1列包含nvarcharmax和一些数据,但没有什么疯狂之处。做一个前1名需要3分钟。