逻辑读和LOB逻辑读

Mat*_*ino 3 sql-server database-internals sql-server-2017

我有一个查询应用程序使用文本字段扫描整个表格。

该查询正在执行以下多次读取:

扫描计数 1、逻辑读取 170586、物理读取 3、预读读取 174716、lob 逻辑读取 7902578、lob 物理读取 8743、lob 预读读取 0。

具有 lob 逻辑读取的查询计划

如果我从选择中删除文本字段,则读数将变为以下内容:

扫描计数 1、逻辑读取 170588、物理读取 0、预读读取 0、lob 逻辑读取 0、lob 物理读取 0、lob 预读读取 0。

没有 lob 逻辑读取的查询计划

我不明白的是 lob 读取是如何工作的:

如果我用 lob 逻辑读取来总结逻辑读取,我总共得到8.073.164 逻辑读取,如果我是正确的,大约是 64GB

但整个数据库只有7GB!

我可能遗漏了一些有关添加逻辑读取和 lob 逻辑读取的信息。

lob 逻辑读取数实际代表什么?

Tib*_*szi 5

这是我的理论,

这些是逻辑读取,而不是物理读取。想象一下两行,其中这些行的 LOB 数据位于同一页上(是的,LOB 数据的页可以跨行共享)。

也许每次读取只读取 100 个字节。每次读取仍然是逻辑读取。

此外,您说这些是文本数据类型,默认情况下没有内 LOB 数据。如果类型为 varbinary(max),则默认情况下LOB 数据置于行内(只要它适合页面)。这可能会产生很大的影响,什么最好取决于您是否经常需要 LOB 数据。您可以使用 sp_tableoption 重新配置它(对于两种类型)。