在某些测试场景中我们会遇到测试数据库在不同数据扫描方式下的性能表现,例如大表的全表冷扫描,全表热扫描,索引不回表,索引回表等,本文举例说明如何在这些场景下进行测试。
1.全表冷扫描
方法1:select count(*) from 表名 where 非主键字段='值';
方法2:select count(非主键字段) from from 表名;
一般来说全表冷扫描是指,其中“冷”字主要描述数据是从哪里读取,冷表示数据从物理磁盘中读取,区别于全表热扫描,“热”字主要描述数据是从内存缓冲区中读取。数据库启动后此表还没有被查询过,即结果数据还没有被加载到系统缓冲区中,这个测试项主要考察数据库从物理磁盘中读取数据的性能。方法1 中加非主键列条件过滤才能让数据库做全表扫描,否则单纯count(*)会直接FAGR快速聚合返回结果而不是全表扫描。
2.全表热扫描
全表热扫描就很简单了,在不重启数据库服务的前提下,直接把全表冷扫描的sql再执行一次就行了。达梦设有数据缓冲区,数据缓冲区是在将数据页写入磁盘之前以及从磁盘上读取数据页之后,数据页所存储的地方,保持高的缓冲页命中率对数据库性能至关重要。
3.索引不回表
select 主键字段 from 表 where 主键字段='值';
对于有主键的表,系统会自动为表维护一个主键索引,以INDEX+索引ID来命名的。所以我们只需要查询指定主键字段对应的值即可模拟索引不回表。
4.索引回表
select 非主键字段 from 表 where 主键字段='值';
Where条件使用主键字段等值过滤可以让这个sql走索引,而查询非主键字段可以让sql进行回表操作。
下面举个例子来进行说明:
CREATE TABLE TAB(ID INT,NAME VARCHAR(50));
INSERT INTO TAB SELECT LEVEL,'A'||LEVEL FROM DUAL CONNECT BY LEVEL<200000000;
COMMIT;
alter table "TEST"."TAB" add primary key("ID");
set autotrace trace
1.全表冷扫描
可以看到执行计划中TAB表扫描方式为CSCN2,表示聚集索引扫描,即全表扫描。
或
2.全表热扫描
热扫描不在赘述,buffer设置充足的情况下,会比全表冷扫描的速度快得多。
3.索引不回表
其中SSEK2操作符表示索引定位
4.索引回表
BLKUP2表示回表操作
文章
阅读量
获赞