使用varchar(max)缓慢“选择”查询

时间:2012-05-22 18:20:08

标签: sql-server sql-server-2008-r2

我有一个500行的小桌子。 该表有10列,包括一个varchar(max)列。

执行此查询时:

SELECT TOP 36 *
FROM MyTable
WHERE (Column1 = Value1)

它在3分钟内检索大约36行。 varchar(max)列每行包含3000个字符。

如果我尝试只检索一行:

SELECT TOP 35 *
FROM MyTable
WHERE (Column1 = Value1)

然后查询在0秒内检索35行。

在我的客户端统计信息中,从服务器收到的字节数,我有:

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

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

你知道它来自哪里吗?

编辑---这是我的真实代码:

select top 36 *
from Snapshots
where ExamId = 212

select top 35 *
from Snapshots
where ExamId = 212

编辑---有关客户统计的更多信息

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

从服务器收到的字节数:66 038 Vs超过2 000 000

从服务器30 Vs 11000

接收的TDS数据包

6 个答案:

答案 0 :(得分:0)

Index使用ExamId也使用select field1,field2,etc代替select * ...

答案 1 :(得分:0)

我不确定但是试试这个:

  

从快照中选择*,其中ExamId =(从快照中选择前36个ExamId,其中ExamId = 212)

答案 2 :(得分:0)

如何尝试排名前50位,然后排名前75位,然后排名前100位,看看是否会再次出现更大幅度的增长,因为看起来它只是这一行,或者只是表格中的特定行。

答案 3 :(得分:0)

您的执行时间应该非常短,而获取则要长得多。 从SELECT TOP语句中删除varchar(max),仅在您特别需要它们时才检索这些值。

答案 4 :(得分:0)

在运行 SET STATISTICS IO ON 查询之前包含 SELECT 并提供输出。此外,您能否发布来自 2 个不同查询的查询计划,因为这将对解释差异有很大帮助。您可以使用 https://www.brentozar.com/pastetheplan/ 上传它并提供链接。

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

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

答案 5 :(得分:0)

没有完整的表描述作为 DDL 语句(CREATE TABLE...)和索引,很难回答。

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