Mat*_*ino 3 sql-server database-internals sql-server-2017
我有一个查询应用程序使用文本字段扫描整个表格。
该查询正在执行以下多次读取:
扫描计数 1、逻辑读取 170586、物理读取 3、预读读取 174716、lob 逻辑读取 7902578、lob 物理读取 8743、lob 预读读取 0。
如果我从选择中删除文本字段,则读数将变为以下内容:
扫描计数 1、逻辑读取 170588、物理读取 0、预读读取 0、lob 逻辑读取 0、lob 物理读取 0、lob 预读读取 0。
我不明白的是 lob 读取是如何工作的:
如果我用 lob 逻辑读取来总结逻辑读取,我总共得到8.073.164 逻辑读取,如果我是正确的,大约是 64GB。
但整个数据库只有7GB!
我可能遗漏了一些有关添加逻辑读取和 lob 逻辑读取的信息。
lob 逻辑读取数实际代表什么?
这是我的理论,
这些是逻辑读取,而不是物理读取。想象一下两行,其中这些行的 LOB 数据位于同一页上(是的,LOB 数据的页可以跨行共享)。
也许每次读取只读取 100 个字节。每次读取仍然是逻辑读取。
此外,您说这些是文本数据类型,默认情况下没有行内 LOB 数据。如果类型为 varbinary(max),则默认情况下将LOB 数据置于行内(只要它适合页面)。这可能会产生很大的影响,什么最好取决于您是否经常需要 LOB 数据。您可以使用 sp_tableoption 重新配置它(对于两种类型)。