Oracle数据库sql优化基本概念:基数与选择性

基数(Cardinality)与选择性(Selectivity)是数据库理论和SQL优化领域中的两个重要概念,特别是在关系型数据库管理系统(如Oracle、MySQL等)中用于评估查询效率和索引效果的关键指标。

1、基数(Cardinality)

  • 在数据库中,某列的基数指的是该列中不重复值的数量,即唯一键(Distinct Values)的数量。例如,假设一个表中有1000行数据,其中一列包含性别信息,只有“男”和“女”两种值,那么这一列的基数就是2。
  • 对于索引而言,基数则指该索引所覆盖列组合的唯一键数量。索引基数越大,意味着通过索引区分的数据行更多,这有助于缩小查询范围。

2、选择性(Selectivity)

  • 选择性是衡量一个列或一组列对于过滤数据的有效程度,它是基于基数与表中总行数的比例计算得出的,公式为:选择性 = (基数 / 总行数) * 100%。
  • 如果一个列的选择性较高,表示该列的值在整个表中分布得比较均匀,也就是说,通过该列筛选数据能有效地减少检索的数据量,这对于索引的设计和查询性能至关重要。
  • 当选择性超过一定阈值(如20%),通常认为在这个列上创建索引对提高查询性能有利,因为它能帮助优化器更准确地估计查询的代价,引导其选择更快的执行计划。
    3、计算基数与选择性
    在Oracle数据库中,获取某一列基数(Distinct Count)和选择性可以通过以下方式实现,但请注意,Oracle并没有直接提供查询选择性的内置函数,我们需要手动计算选择性。

首先,我们先查询列的基数,假设我们有一个名为employees的表,我们要查看department_id列的基数:

SELECT COUNT(DISTINCT department_id) as cardinality
FROM employees;

然后,我们可以计算department_id列的选择性,先获取表的总行数:

SELECT COUNT(*) as total_rows
FROM employees;

接着,将这两个查询结合起来,计算选择性:

WITH 
cardinality_data AS (
  SELECT COUNT(DISTINCT department_id) as distinct_count
  FROM employees
),
total_rows_data AS (
  SELECT COUNT(*) as total_rows
  FROM employees
)
SELECT 
  (distinct_count / total_rows) * 100.0 as selectivity
FROM 
  cardinality_data,
  total_rows_data;

上述脚本首先分别计算了department_id列的不重复值数量(基数)和表的总行数,然后计算出选择性百分比。在实际应用中,你可能需要根据你的数据库实际情况调整表名和列名。同时,由于Oracle并不直接支持在一个查询中直接计算列的选择性,所以这里采用了一个临时结果集(CTE)的方式来分步计算。

在数据库性能优化的过程中,理解并正确估计基数和选择性对于数据库管理员来说十分重要,它们直接影响到索引的创建和维护、查询计划的选择以及整个系统的性能表现。例如,如果表的数据发生变化而基数统计信息没有及时更新,可能导致优化器做出错误的执行计划选择,影响查询效率。因此,定期更新统计信息并让优化器获得准确的基数信息是优化工作的一部分。

  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
SQLServer数据库设计 数据库设计 ⼀、数据库设计的必要性 在实际的软件项⽬中,如果系统中需要存储的数据量⽐较⼤,需要设计的⽐较多,之间的关系⽐较复杂,那我们就需要进⾏规 范的数据库设置。如果不经过数据库的设计,我们构建的数据库不合理、不恰当,那么数据库的维护、运⾏效率会有很⼤的问题。这将直接 影响到项⽬的运⾏性和可靠性。 ⼆、什么是数据库设计 数据库设计实际上就是规划和结构化数据库中的数据对象以及这些数据对象之间的关系过程。 三、数据库设计的重要性 Ø 不经过设计的数据库或是设计糟糕的数据库很可能导致 1、 数据库运⾏效率地下 2、 更新、删除、添加数据出现问题 Ø 良好设计的数据库 1、 执⾏效率⾼ 2、 使应⽤程序更便于开发 3、 扩展性好 4、 维护性好 四、数据模型 数据模型就像是数据间联系的⼀个轮廓图,整个模型就像⼀个框架。 如果按照记录间联系的⽰⽅式,对数据模型进⾏分类,可以分为:层次模型、⽹状模型、关系模型。前两种⼜称为格式化数据模型。 数据模型的好坏直接影响到数据库的性能,所以数据模型的选择是数据库设计的⾸要任务。 Ø 实体-关系(E-R)数据模型 E-R数据模型(Entity-Relationship data model),即实体-关系数据模型。E-R数据模型不同于传统的关系数据模型,它不是⾯向实 现,⽽是⾯向现实物体的。 Ø 实体(Entity) 数据是⽤来描述现实中的物体的,⽽描述的对象都是形形⾊⾊的,有具体的、也有抽象的;有物理上存在的、也有概念性的。凡是 可以互相区别⽽且可以被⼈们认识的事、物、概念等统统抽象为实体。多个相同的类型的实体可以称为实体集(Entity set)。因此,在E-R 数据模型中,也有型与值之分;实体可以作为型来定义,每个实体可以是它的实例和值。 Ø 属性(Attribute) 实体⼀般具体若⼲特征,这些特征称为实体的属性。⽽每个属性都有⾃⼰的取值范围,在E-R数据模型中称为值集(value set)。在 同⼀实体集中,每个实体的属性及其值集都是相同的,但可能取不同的值。属性对应数据库的列。 Ø 关系(Relationship) 实体之间会有各种关系,这些关系抽象为联系。不但实体可以有属性,关系也可以有属性。 五、数据库设计步骤 Ø 数据库设计可以分为以下⼏个阶段 1、 需求分析阶段:分析客户的业务需求,特别是数据⽅⾯的需求 2、 概要设计阶段:绘制数据库的E-R图,并确认需求⽂档的正确性和完整性,E-R图是项⽬的设计⼈员、开发⼈员、测试⼈员,以 及和客户进⾏沟通的重要凭据 3、 详细设计阶段:将概要设计阶段的E-R图转换为数据库,进⾏逻辑设计,确定各个之间的主外键关系,运⽤数据库的三范式 进⾏审核,并进⾏技术评审。最后决定选哪种数据库OracleSQLServer、MySQL)来建库、建。 Ø 需求分析阶段:数据库系统分析 秀⽓分析阶段的重点是调查、收集、分析客户的业务数据需求以及数据的安全性、完整性需求等。 需求分析步骤: 1、 确认业务需求 2、 标识关系实体 3、 标识每个实体的具有的属性 4、 确认实体之间的关系 Ø 概要设计阶段:绘制E-R图 作为数据库设计者,你需要和项⽬组内其他成员分享你的设计思路,共同研讨数据库设计的合理性、安全性、完整性,并确认是否 符合客户的业务需求。那么使⽤E-R图,这种图形化的⽰⽅式最为直观。 * E-R图中的实体、属性和关系 上⾯的简单E-R图可以看出⽤户和收⽀之间的关系。在上图中可以看出:⽤矩形⽰实体,实体是⼀般名词;椭圆⽰属性,⼀般也 是名词;菱形⽰关系,⼀般是动词。 * 映射基数 映射基数⽰可以通过关系与该实体的个数。对于实体集A和B之间的⼆元关系,可能的映射基数有: 1、 ⼀对⼀:也就是A实体中最多只有⼀个B实体的关联,⽽B实体的最多只有⼀个A实体的关联。⽤E-R图⽰: 2、 ⼀对多:A实体可以与B实体任意数量的进⾏关联,B中的实体最多与A中的⼀个实体关联。E-R图⽰: 3、 多对⼀:A实体最多与⼀个B实体进⾏关联,⽽B实体可以和任意多个A实体进⾏关联。E-R图⽰: 4、 多对多:A实体可以有多个B实体,⽽B实体也可以有任意多个A实体。E-R图⽰: * E-R图 E-R图可以以图形化的⽅式将数据库的整个逻辑结构⽰出来,组成部分有: 1、 矩形⽰实体集 2、 椭圆⽰属性 3、 菱形⽰关系、 4、 直线⽤来连接实体集与属性、实体集和关系 5、 直线箭头⽰实体集之间映射基数 Ø 详细设计阶段:将E-R图转换为 步骤如下: 1、 将各个实体转换为对应的,将各属性转换为对应的列 2、 标识每张的主键 3、 将实体之间的关系转换为之间的主外键关系 六、数据库设计规范化
SQL Server 数据库设计 一、数据库设计的必要性 在实际的软件项目中,如果系统中需要存储的数据量比较大,需要设计的比较多,之间的关系比较复杂,那我们就需要进行规范的数据库设置。如果不经过数据库的 设计,我们构建的数据库不合理、不恰当,那么数据库的维护、运行效率会有很大的问 题。这将直接影响到项目的运行性和可靠性。 二、什么是数据库设计 数据库设计实际上就是规划和结构化数据库中的数据对象以及这些数据对象之间的关系 过程。 三、数据库设计的重要性 Ø 不经过设计的数据库或是设计糟糕的数据库很可能导致 1、 数据库运行效率地下 2、 更新、删除、添加数据出现问题 Ø 良好设计的数据库 1、 执行效率高 2、 使应用程序更便于开发 3、 扩展性好 4、 维护性好 四、数据模型 数据模型就像是数据间联系的一个轮廓图,整个模型就像一个框架。 如果按照记录间联系的示方式,对数据模型进行分类,可以分为:层次模型、网状模 型、关系模型。前两种又称为格式化数据模型。数据模型的好坏直接影响到数据库的性 能,所以数据模型的选择是数据库设计的首要任务。 Ø 实体-关系(E-R)数据模型 E-R数据模型(Entity-Relationship data model),即实体- 关系数据模型。E- R数据模型不同于传统的关系数据模型,它不是面向实现,而是面向现实物体的。 Ø 实体(Entity) 数据是用来描述现实中的物体的,而描述的对象都是形形色色的,有具体的、也有抽象 的;有物理上存在的、也有概念性的。凡是可以互相区别而且可以被人们认识的事、物 、概念等统统抽象为实体。多个相同的类型的实体可以称为实体集(Entity set)。因此,在E- R数据模型中,也有型与值之分;实体可以作为型来定义,每个实体可以是它的实例和值 。 Ø 属性(Attribute) 实体一般具体若干特征,这些特征称为实体的属性。而每个属性都有自己的取值范围, 在E-R数据模型中称为值集(value set)。在同一实体集中,每个实体的属性及其值集都是相同的,但可能取不同的值。属 性对应数据库的列。 Ø 关系(Relationship) 实体之间会有各种关系,这些关系抽象为联系。不但实体可以有属性,关系也可以有属 性。 五、数据库设计步骤 Ø 数据库设计可以分为以下几个阶段 1、 需求分析阶段:分析客户的业务需求,特别是数据方面的需求 2、 概要设计阶段:绘制数据库的E- R图,并确认需求文档的正确性和完整性,E- R图是项目的设计人员、开发人员、测试人员,以及和客户进行沟通的重要凭据 3、 详细设计阶段:将概要设计阶段的E- R图转换为数据库,进行逻辑设计,确定各个之间的主外键关系,运用数据库的三范 式进行审核,并进行技术评审。最后决定选哪种数据库OracleSQLServer、MySQL) 来建库、建。 Ø 需求分析阶段:数据库系统分析 秀气分析阶段的重点是调查、收集、分析客户的业务数据需求以及数据的安全性、完整 性需求等。 需求分析步骤: 1、 确认业务需求 2、 标识关系实体 3、 标识每个实体的具有的属性 4、 确认实体之间的关系 Ø 概要设计阶段:绘制E-R图 作为数据库设计者,你需要和项目组内其他成员分享你的设计思路,共同研讨数据库设 计的合理性、安全性、完整性,并确认是否符合客户的业务需求。那么使用E- R图,这种图形化的示方式最为直观。 * E-R图中的实体、属性和关系 上面的简单E- R图可以看出用户和收支之间的关系。在上图中可以看出:用矩形示实体,实体是一般 名词;椭圆示属性,一般也是名词;菱形示关系,一般是动词。 * 映射基数 映射基数示可以通过关系与该实体的个数。对于实体集A和B之间的二元关系,可能的 映射基数有: 1、 一对一:也就是A实体中最多只有一个B实体的关联,而B实体的最多只有一个A实体的关 联。用E-R图示: 2、 一对多:A实体可以与B实体任意数量的进行关联,B中的实体最多与A中的一个实体关联 。E-R图示: 3、 多对一:A实体最多与一个B实体进行关联,而B实体可以和任意多个A实体进行关联。E- R图示: 4、 多对多:A实体可以有多个B实体,而B实体也可以有任意多个A实体。E-R图示: * E-R图 E- R图可以以图形化的方式将数据库的整个逻辑结构示出来,组成部分有: 1、 矩形示实体集 2、 椭圆示属性 3、 菱形示关系、 4、 直线用来连接实体集与属性、实体集和关系 5、 直线箭头示实体集之间映射基数 Ø 详细设计阶段:将E-R图转换为 步骤如下: 1、 将各个实体转换为对应的,将各属性转换为对应的列 2、 标识每张的主键 3、 将实体之间的关系转换为之间的主外
Oracle数据库SQL优化是提高查询性能和优化数据库响应时间的关键步骤。下面是一些常见的Oracle数据库SQL优化技巧: 1. 使用合适的索引:根据查询需求创建合适的索引索引可以加速数据检索操作。确保索引的选择和创建是基于查询的列、大小和查询频率等因素综合考虑的结果。 2. 优化查询语句:分析查询语句的执行计划,使用EXPLAIN PLAN工具或者使用Oracle提供的SQL调优工具,如SQL Tuning Advisor等来查看和优化查询计划。可以考虑重写查询语句,使用更有效的查询方式,避免不必要的连接、子查询和函数等。 3. 避免全扫描:尽量使用索引访问数据,避免全扫描。确保有适当的索引,并且查询语句中使用索引列作为过滤条件。 4. 优化连接和子查询:对于连接操作,使用合适的连接方式,如INNER JOIN、LEFT JOIN等,并根据数据分布情况考虑连接顺序。对于子查询,可以考虑使用内联子查询或者存在性子查询来优化性能。 5. 使用合适的数据类型和大小:选择合适的数据类型和长度,避免过大或者不必要的列长度,减少存储和查询开销。 6. 统计信息更新:定期收集和更新索引的统计信息,保持统计信息的准确性,以便Oracle优化器能够进行更好的执行计划选择。 7. 优化物理存储结构:考虑使用分区索引组织等物理存储结构来提高查询性能。合理设置空间和数据文件大小,避免性能瓶颈。 8. 避免使用数据库隐式转换:在查询语句中避免使用隐式转换,确保查询语句中的数据类型一致,以避免性能损耗。 9. 避免过多的重复查询:对于重复查询的结果,可以考虑使用缓存或者临时来避免重复计算。 10. 避免不必要的排序和聚合操作:尽量避免不必要的排序和聚合操作,不仅可以减少查询时间,还可以减轻服务器负载。 综上所述,通过合理的索引设计、优化查询语句、更新统计信息等手段,可以有效地提高Oracle数据库SQL查询性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值