9

我有一张 500 行的小桌子。该表有 10 列,包括 1 个 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

从服务器接收的 TDS 数据包 30 Vs 11000

4

7 回答 7

0

我不确定,但试试这个:

select * from Snapshots where ExamId = (select top 36 ExamId from Snapshots where ExamId = 212)

于 2012-05-22T19:09:26.490 回答
0

使用IndexforExamId也使用select field1,field2,etc而不是 select * ....

于 2012-05-22T18:42:56.693 回答
0

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

于 2020-02-19T19:58:46.590 回答
0

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

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

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

于 2021-02-09T12:59:37.077 回答
0

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

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

于 2021-06-17T13:34:25.757 回答
0

正如其他人所说,你应该扔schema (datatype+existing index)桌子Snapshot

snapshot表中我相信examid是非聚集索引,它不是唯一的。一个examid有很多记录。快照表必须有任何 PK 列。

Top子句应始终与Order by 子句一起使用。Top没有Order by子句的子句是Non Determinstic。它会根据什么来选择Top N。所以知道快照的模式然后决定正确的索引。

使用Order by子句也可以Non Determinstic,但这是另一个讨论。

你可以试试这个

create  table #temp(PKID int)

insert into #temp(pkid)
select top 36 pkid
from dbo.Snapshots
where ExamId = 212

然后你可以这样做,

select col1,col2,col3,col4
from dbo.Snapshots S
where exists(select 1 from #temp t where t.pkid=s.pkid)

现在你的主要问题和问题,

为什么 0 秒检索 35 行,3 分钟检索 36 行。

我很快就会写到这里。同时我正在等待快照表的完整结构。

于 2021-11-17T11:25:31.713 回答
0

Varchar(max) 不能成为索引键的一部分,除了这个其他主要缺点之外,它不能作为连续的内存区域在内部存储,因为它们可能会增长到 2Gb。因此,为了提高性能,您需要避免它。

于 2021-09-04T15:15:37.840 回答