|
〇〇 发表于 2013-8-30 19:53 ![]()
假设没有索引,没有not null约束
SQL>explain select count(distinct c) from a;
1 #NSET2: [10, 1, 4]
2 #PRJT2: [10, 1, 4]; exp_num(1), is_atom(FALSE)
3 #AAGR2: [10, 1, 4]; grp_num(0), sfun_num(1)
4 #CSCN2: [10, 100000, 4]; INDEX33555450(A)
没有索引就只有全表扫描, 因为没有分组, 系统使用简单聚集操作符号AAGR进行计算。这两个语句的计划表面上一致,在AAGR内部有一个标记区分是否需要去重(DISTINCT), 如果有DISTINCT, 则会增加一个HASH表用于DISTINCT 计算。
上面这个例子是行表, (HUGE)列表也一样:
SQL>explain select count(distinct c) from a1;
1 #NSET2: [10, 1, 4]
2 #PRJT2: [10, 1, 4]; exp_num(1), is_atom(FALSE)
3 #AAGR2: [10, 1, 4]; grp_num(0), sfun_num(1)
4 #HFSCN: [10, 100000, 4]; INDEX33555451(A1)
只是叶子层使用HFSCN, 而不是CSCN扫描。对于HSCAN, 其实还可以优化一下,因为HUGE表的每一个节(SECTION)都记录了记录条数,对于没有DISTINCT的情况, 直接统计就可以。
|
|