性能调优基础1:选择性和基数

性能调优基础1:选择性和基数


  性能调优是大多数初级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正确估计查询计划的成本,从而导致选择次优计划。基数估计错误可能导致查询运行缓慢

现在让我们来看一些例子:

  1. 假设您有一个名为EMP的表,它有10条记录。您想知道该表中最大的EMP_NUMBER。
SELECT MAX(EMP_NUMBER) from EMP;

选择性 = 访问的行数/总行数= 10/10 = 1 (100%的行被访问)
基数 = 访问的行数 = 10

  1. 现在假设您在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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值