我有一个结构如下的测试表。
CREATE TABLE [dbo].[DW_test](
[ID] [bigint] IDENTITY(1,1) NOT NULL,
[CourtCaseID] [int] NOT NULL,
[ActionID] [int] NOT NULL,
PRIMARY KEY CLUSTERED([ID] ASC)接下来,我用下面的脚本填充了大约4.7亿条记录。
insert into DW_test
--select count(*)
--from (
select top 1000000 abs(checksum(newid())) % 100000 + 1 a, abs(checksum(newid())) % 10 + 1 b
from sys.all_objects
cross join sys.all_objects a
cross join sys.all_objects b
cross join sys.all_objects c
cross join sys.all_objects d
cross join sys.all_objects e
cross join sys.all_objects f
cross join sys.all_objects g
--) t
GO该脚本执行了大约470次,以在表中生成4.7亿条记录,并在该表上创建了NCCI。
CREATE NONCLUSTERED COLUMNSTORE INDEX [IX_test1] ON [dbo].[DW_test]
(
[CourtCaseID],
[ActionID]
)接下来,我测试简单的查询来统计表中的记录。
DBCC DROPCLEANBUFFERS
GO
select COUNT_BIG(*)
from DW_test 如果我转到SET STATISTICS IO ON,就会得到以下结果
带冷缓存
表'DW_test‘扫描计数25,逻辑读取3,物理读取0,提前读取0,lob逻辑读取469697,lob物理读取1,lob预读读取1877324.表'DW_test‘段读取453,段跳过0。桌子‘工作表’扫描计数0,逻辑读取0,物理读取0,预读读取0,lob逻辑读取0,lob物理读取0,lob预读读取0.
带热缓存
表'DW_test‘扫描计数25,逻辑读取3,物理读取0,先读读取0,lob逻辑读取229248,lob物理读取0,lob预读读取0.表'DW_test‘段读取453,段跳过0。桌子‘工作表’扫描计数0,逻辑读取0,物理读取0,预读读取0,lob逻辑读取0,lob物理读取0,lob预读读取0
我知道,1逻辑读取是在查询执行期间从缓冲池读取的单个数据页,1物理读是从磁盘读取的单个数据页。读前读的红门告诉我们是:
这个数字告诉我们有多少物理读取是由SQL服务器的“预读”机制满足的。这与物理读取直接相关,所以如果没有物理读取,您将有0进行预读。
在我的例子中,我处理的是lob逻辑、物理和前面的读。我想了解这个数字在我的特殊情况下意味着什么。
如果表有大约4.7亿条记录,那么如何能够使用冷缓存只读取一个lob物理数据呢?
如何使lob页面总数从冷缓存中的230万页减少到热缓存中的大约220 K?
发布于 2019-08-30 11:23:42
如果表有大约4.7亿条记录,那么如何能够使用冷缓存只读取一个lob物理数据呢?
有一个LOB物理读和1,877,324读前读.预读仍然是一种物理读,只是预先执行(预取).来自Redgate的引用是不正确的。
如何使lob页面总数从冷缓存中的230万页减少到热缓存中的大约220 K?
逻辑读取计数内存中一个页面被触摸的次数。从469 697(冷缓存)减少到229 248(温暖)。我对此没有一个完整的解释,但部分原因可能是列存储数据被连续缓存在单独的列存储对象池中,而不是一般页面大小的缓冲池中。
读预读从b树的上层读取页面,以便在扫描之前识别要读取的页面,这也可能导致不同数量的“额外”逻辑读取,这取决于存储系统的时间和特性。列存储索引在持久存储上具有b-树结构。
另一个因素是并行性(看来您的测试是在DOP 24上运行的),因为来自不同线程的重叠请求可能导致额外的逻辑读取。如果使用OPTION (MAXDOP 1)运行,您可能会发现多余的逻辑读量有所减少。
列存储的内部存储细节没有得到详细的记录,也没有得到通常的DMV的充分支持。在这一阶段,我要说,减少冷缓存和温缓存之间的读取的最好解释是磁盘上存储和内存中存储(缓存)之间的区别。
列存储数据(字典和段)存储在磁盘上的LOB中,但由于性能原因,不能以相同的格式保存在内存中。因为它们是不同的东西,所以不能仅仅将逻辑读取添加到物理读取中以获得有意义的结果。
发布于 2019-08-30 11:21:09
“如果表有大约4.7亿条记录,那么如何才能用冷缓存读取一个lob物理数据呢?”
因为其他物理读取是由预读( LOB类型)提供的。也许RedGate的那篇文章把你搞糊涂了,但是如果你提供了一个范围(比如说)作为预读(RA),那么你就不会看到任何物理读取。收集物理读取统计信息的线程在缓存中找到了这些页面,因此它们没有被累积到物理读取计数器中。
当我们遇到这种情况时,另一种情况是经典的缓冲区缓存命中率perfmon计数器。RA读取对此值没有贡献,因此可以加载和加载物理I/O,但在BCHR中仍然接近100。
“如何使lob页面总数从冷缓存中的230万页减少到热缓存中的大约220 k?”
我猜第一个开始了自动创建统计。
https://dba.stackexchange.com/questions/246617
复制相似问题