性能调优是大多数初级dba面临的难以解决的问题之一。这种问题需要对概念有深刻的理解,然后才能指出系统中哪里出了问题。我们将在一系列的文章中介绍性能调优领域的基础知识。这是本系列的第一篇文章,在这篇文章中,我们将专注于理解选择性和基数。
选择性:
- 它表示由操作过滤的行的分数,因此您可以说它是唯一性的度量。
- 取值范围为0 ~ 1
- 如果你的查询返回100行,然后你放一个过滤器(例如“where”条件),使最终结果只有10,那么你的选择性是0.1(10/100),或者你也可以说你的选择性是10%
- 在另一个例子中,如果您的查询返回200行,甚至在放入过滤器后,最终结果也是200,那么您的选择性是1或100%。这就是所谓的坏选择性。它是“坏的”,因为所有的记录都来了。
- 如果SQL返回少量重复行,则列是高度选择性的。这就是所谓的良好选择性。
- 如果SQL返回所有或大量行,则列是最不具选择性的。这就是所谓的坏选择性。
- 当您运行SELECT * FROM EMP并且不提供任何过滤器时,选择性将自动为1,因为将返回所有行。
- 添加复合索引是使坏选择性变成好的选择性的最好方法。使用多个列使索引更加唯一,从而提高了索引的选择性。
基数:
操作返回的行数是基数。选择性和基数之间的关系如下:
基数 = 选择性 × 输入行数
因此,假设您的查询从数据库中获得200条记录,并通过放置一些过滤器等,您使最终的行数为50,因此您的选择性为0.25(50/200),而您的基数为50(200 * 0.25)。
有时,Oracle优化器无法预测给定操作符将返回的行数(由于缺少表统计信息等原因)。这可能会阻止Oracle正确估计查询计划的成本,从而导致选择次优计划。基数估计错误可能导致查询运行缓慢。
现在让我们来看一些例子:
- 假设您有一个名为EMP的表,它有10条记录。您想知道该表中最大的EMP_NUMBER。
SELECT MAX(EMP_NUMBER) from EMP;
选择性 = 访问的行数/总行数= 10/10 = 1 (100%的行被访问)
基数 = 访问的行数 = 10
- 现在假设您在SQL查询的LAST_NAME列上放置了过滤器
SELECT MAX(EMP_NUMBER) from EMP where LAST_NAME='SMITH';
假设只有4名姓“SMITH”的员工
选择性 = 访问的行数/总行数 = 4/10 = 0.4 (访问了40%的行)
基数 = 访问的行数 = 4
原文链接: Performance Tuning Basics 1 : Selectivity and Cardinality