最近在研究 Christian Antognini 关于 Troubleshooting Oracle Performance 这本书, 当翻阅到后面时, 感觉到对前面的部分概念又模糊了。谈到优化,如果你概念都摸棱两可的话,就是一件很悲哀的事情了,或许你认为在真实环境中实战几次就可以理解概念了。我个人认为, 实战是加深概念理解的最直接的方法,作为一个经验尚浅的DBA,我决定在概念理解上多下工夫,因此有必要对概念作一个小小的记录 (古人云:最淡的墨水胜过最强的记忆!!)
(1) 选择性 (selectivity ) : 一个操作过滤的记录的比例, 是一个介于 0 和 1 之间的数值。
(2) 基数 (cardinality) : 一个操作所返回的记录的条数。
以num_rows 表示被处理的记录数, 这 cardinality 与 selectivity 之间存在以下关系
cardinality = selectivity × num_rows
对于一般的操作, 其选择性是通过 查询语句返回的记录数 除以 表中存储的记录数 得到, 但是在实际生产环境中,一般的操作是完全不能满足我们的需求的, 如果我们在语句中 使用了 group by 和 聚合函数(eg: sum max min avg), 我们返回的记录数肯定就不是我们过滤的记录数了, for example :
以下是我的一个测试表,表中的记录数为6 如下:
SQL> select count(*) from book_test;
COUNT(*)
----------
6
通过 sum 聚合函数对测试表进行操作:
SQL> select sum(price) from book_test;
SUM(PRICE)
----------
316
以上操作 我们返回行为1 其实我们的选择性应该为 6/6 = 1 而不是我们的一般算法 1/6
谈了这么多,可能你认为,选择性是干什么的? 有用吗? 其实一个操作对应的选择性能够帮助你确定那条访问路径是最优的访问路径。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/8117479/viewspace-671321/ ,如需转载,请注明出处,否则将追究法律责任。