表设计, 是灵活扩展性及性能之间的一个折中。 为了达到灵活扩展以及将来不可预知的加载问题, 那么表设计就应该跟模型设计一样, 能够被演化到第三方的标准形式, 当然, 用户为了核心的业务性能需求, 可以选择性的忽略这点 。
这些技术的例子有很多, 例如storing tables pre-joined,the addition of derived columns, and aggregate values。 Oracle提供了许多方法存储aggregates and pre-joined数据通过clustering and materialized view功能。这些特性应该在一个表的简单设计中采用。
同样, 我们应该主意关注那些核心的业务表, 这样能够更有效的达到性能要求, 当然, 如果那些非核心表引起了性能瓶颈的话, 因该立刻去修改它们。
索引的设计, 是一个大的迭代过程, 它基于应用中SQL的产生。 当然, 我们首先应该对那些有主键限制, 以及肯定经常被用得的字段敏感。 比如姓名之类的。随着开发和真是数据测试的进展, 一些确定的查询语句有性能提高要求时, 建立一个更好的index是一个好的方案。 下面列出重建索引时 , 应该考虑的设计方案。
- Appending Columns to an Index or Using Index-Organized Tables
- Using a Different Index Type
- Finding the Cost of an Index
- Serializing within Indexes
- Ordering Columns in an Index
Appending Columns to an Index or Using Index-Organized Tables
从执行计划中, 提高查询速度的一个最简单的方法就是减少表的访问 (减少逻辑I/O), 这个可能通过给查询中的column加上索引。 这些columns是在select 对象column, 以及任何需要join和排序的columns. 这个方案,对那些在线及时反映的系统来说特别有用, 因为减少了 I/O的时间。 这个方案, 应该在系统有适当数据, 第一次测试时采用。
对这个技术, 非常多的一种形式是建立一个 index-organized table (IOT)。 但是, 你必须注意, 在IOT中不断增长的leaf, 并不会消弱减少I/O的目标。
Using a Different Index Type
有很多的索引类型, 不同的类型有不用的适用场景。 下面, 介绍下不同 索引的性能特点。
1. B-Tree Indexes
这是标准的索引类型, 非常适合主键和highly-selective (值分布广泛)索引,B树索引可用于获取那些被索引排序过的数据。
2. Bitmap Indexes
位图索引适合值分布小的数据 (例如性别), 通过压缩技术, 用最小的I/O可以生成大量的rowids (能够定位到数据的location). 在non-selective的column上联合位图索引, 可以有效地使用AND 和OR操作 (最小的I/O读取大量的rowid)。 对于使用count()的查询, 位图索引也能加快速度, 因为查询能够在索引中获得。
3.Function-based Indexes
这些索引, allow通过B树索引, 从数据库中经过函数获取数据。 对于使用nulls, 函数索引有一些限制, 而且需要查询优化器开启。
函数索引, 对于在composite columns上的查询, 特别有效率。比如 (销售价格 - 折扣) x 数量。 销售价格 , 折扣, 数量都是数据库中的列。 另外一个例子就是UPPER 函数。
4. Partitioned Indexes
Partitioning a global index allows partition pruning to take place within an index access, which results in reduced I/Os. By definition of good range or list partitioning, fast index scans of the correct index partitions can result in very fast query times.
5. Reverse Key Indexes
这个索引的设计是为了降低不断插入的应用中的索引污点。 对于插入的性能, 这种索引是很卓越的。但是, 它不能用于index range scans。
查找索引的Cost
创建和维护索引结构, 是会非常高价的。 它会消耗磁盘空间, CPU, 以及 I/O。 设计者必须要确定索引的好处超过缺点。
使用这么一个简单的法则去判断维护一个索引的cost:
每个维护的索引, 在insert, update, delete上的时间消耗, 差不多是实际DML语句的三倍。这个意思就是说, 如果你插入一个有三个索引的表, 它所消耗的时间, 大约是没有索引的10倍。 对于DML, 特别是插入频繁的应用, 索引的建立需要慎重。需要在查询和插入之间有个折中。
Serializing within Indexes
Use of sequences, or timestamps, to generate key values that are indexed themselves can lead to database hotspot problems, which affect response time and throughput. 这是由于,线形增长的key能导致一个right-growing index。为了避免这个问题, try to generate keys that insert over the full range of the index. This results in a well-balanced index that is more scalable and space efficient. You can achieve this by using a reverse key index or using a cycling sequence to prefix and sequence values.
Ordering Columns in an Index
在创建索引时, 设计者需要灵活的在上面创建规则。 这需要看应用环境, 可以使用下面两种方法去对索引的列排序。
使用视图
视图可以加快和简化应用设计。 一个简单的视图, 对于那些主要就是涉及查询, 显示, 收集和存储得开发人员, 可以掩饰复杂的数据模型。
但是, 在视图提供一个clean 编程接口的同时, 能够导致非优化, resource-intensive的查询。 一个worst type使用view , 就是当一个视图引用另外一个视图, 且用在查询的join中。 在大多数情况下, 开发人员之间使用数据库表查询就可以了, 因为视图的内在特性, 它是优化器很难选定一个最优的执行计划。
SQL执行效率
在任何系统开发的设计和架构中, 应该是开发人员关注SQL的执行效率。 为了实现这个, 开发环境需要支持下面的特点:
#
- 优秀的连接管理
连接数据库, 是一个expensive且 highly unscalable 操作。 因此, 应该尽可能的减少并发的数据库连接。一个简单的应用中, 用户在系统初始化时候连接是比较理想的。 但是, 在一个基于web或者多层的应用中, 设计者应该使用数据库连接池且并不为每个用户重新建立连接。
- 好的Cursor 使用和管理
SQL的执行有很多步骤, 包括语义分析, 安全检查,生成执行计划以及加载共享的结构到shared pool。 其中,解析有硬解析和软解析。
硬解析: SQL在首次提交的时候, 在shared pool中不能被匹配。 Hard parses are the most resource-intensive and unscalable, because they perform all the operations involved in a parse.
软解析: SQL 在首次提交, 但在shared pool中能被匹配。 这个匹配的(前面用户执行的结果)内容就作为结果。SQL 被共享能提高性能。 但软解析不是理想的。 因为还是需要语义和安全检查。
所以,解析应该尽可能的简化。 开发者应该设计SQL解析一次, 多次使用。 这通过cursors完成。 有经验的开发者, 应该非常首先重开和重执行cursors的概念。
开发者, 应该使SQL在共享池中。 为了达到这目的, 在查询中, 使用变量邦定可以实现这功能。例如:
Statement with bind variables:
SELECT * FROM employees
WHERE last_name LIKE :1;
分享到:
相关推荐
Oracle约束和索引是数据库设计和优化的核心概念。通过正确地应用约束,可以确保数据的准确性和一致性;而合理地创建和管理索引,则能够显著提升查询速度,提高整体系统性能。作为数据库管理员或开发者,理解和熟练...
在Oracle数据库管理系统中,创建表和唯一索引是数据库设计中的关键步骤,它们对于数据的组织、查询效率和数据完整性至关重要。以下将详细介绍如何创建学员信息表,创建唯一索引,以及如何修改表来添加主键和检查约束...
在分区表中,索引同样重要,因为正确的索引设计能进一步提升查询性能。针对分区表,Oracle 提供了分区索引,它允许索引与分区策略相结合。例如,可以创建局部索引,每个分区都有自己的索引,或者创建全局索引,覆盖...
Oracle 索引与分区索引是 Oracle 数据库中两个重要的概念,它们都是为了提高查询性能和数据存储效率而设计的。在本文中,我们将详细介绍 Oracle 索引与分区索引的概念、特点、分类、创建方法、维护操作等方面的知识...
在数据库管理中,索引是提升查询性能的关键要素。Oracle和SQL Server作为两种广泛应用的关系型数据库管理系统,都支持创建和管理...通过合理的设计和管理,索引能够极大地提升查询效率,进而优化整个系统的运行效率。
在Oracle数据库中处理亿级数据量的表时,合理的索引设计是优化查询性能的关键因素之一。索引能够加快数据检索的速度,减少I/O操作次数,但同时也可能会增加插入、更新或删除操作的成本。因此,在大规模数据表上创建...
在查询条件中避免使用`NULL`、函数表达式和范围查询,因为这些情况可能使Oracle数据库放弃使用索引,转而采用全表扫描。 ### 位图索引 #### 存储结构 位图索引适用于字段值重复度高的情况,如国家、地区、性别等...
《Oracle与MySQL数据库索引设计与优化》这本书深入探讨了两个主流关系型数据库管理系统——Oracle和MySQL中的索引设计和优化策略。索引是数据库性能的关键因素,它们能够加速数据检索,提高系统效率,尤其在大数据量...
1.2 主关键字的约束:主关键字是数据库表中的唯一标识符,索引设计应遵守主关键字的约束,确保数据的一致性和唯一性。 1.3 ORDER BY 中用索引:在 ORDER BY 语句中使用索引,可以提高查询效率和性能。 1.4 索引列...
### Oracle 分区与索引详解 #### 一、Oracle 分区概述 在Oracle数据库中,分区是一种物理数据组织技术,它将一个大的表或索引分成多...通过合理的设计和管理,可以显著提升查询效率,同时降低数据管理和维护的成本。
索引的使用是数据库性能优化的关键环节,尤其是在大型企业级应用中,对索引的合理设计和管理对于系统的运行速度至关重要。这篇博文将深入探讨Oracle中索引的基本概念、类型、创建与管理,以及如何通过索引来优化查询...
Oracle 数据库索引优化方法探析是指通过对 Oracle 数据库索引的分析和优化,以提高数据库的查询效率和性能。 Oracle 数据库索引是一种数据结构,用于快速访问数据库表的特定信息。通过索引的小 I/O 操作可以替代大的...
本文将从Oracle数据库索引的基础概念出发,深入探讨索引维护的重要性和具体方法。 #### 一、Oracle数据库索引概述 索引是数据库中一种用于快速查找数据的数据结构。在Oracle数据库中,最常用的索引类型是B树索引...
### Oracle的表空间、分区表及索引的深入解析 ...通过合理设计和有效管理这些组件,可以确保数据库系统的高效运行和数据的安全存储。理解它们的原理和使用方法,对于任何Oracle数据库管理员来说都是至关重要的技能。
Oracle数据库中的索引是优化查询性能的关键工具,它允许快速定位和访问数据。常见的索引类型包括B*树索引和位图索引,每种都有其特定的应用场景和优势。 1. **B*树索引**:这是最常见的索引类型,类似于二叉树结构...
总结,Oracle的索引是提升数据库性能的关键工具,理解索引的工作原理,合理设计和管理索引,能有效优化数据库的查询性能,但同时也要注意其带来的额外存储和维护成本。在实际应用中,需要根据业务需求和查询模式,...
### Oracle 创建索引的基本规则 ...综上所述,正确创建和维护索引是Oracle数据库性能调优的重要组成部分。通过遵循上述基本原则,可以根据具体的应用场景灵活选择和调整索引策略,从而实现最佳的查询性能和资源利用率。
总的来说,Oracle索引机制的深入理解对于数据库性能调优、查询优化和系统设计都具有重要意义。正确使用索引可以显著提高查询速度,降低响应时间,提升用户体验,但同时也需要平衡索引对写操作的影响,以确保系统的...
总的来说,Oracle表结构生成工具是一种高效、灵活的解决方案,它简化了数据库设计流程,尤其适合那些需要频繁调整和更新表结构的项目。通过利用Excel的易用性和.NET的强大功能,它为数据库管理员和开发者提供了一种...