我有一个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数据包答案 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 存储与关系数据分开,以避免行溢出存储...