一. 设置合适的 SGA
常常有人抱怨服务器硬件很好, 但是 Oracle 就是很慢. 很可能是内存分配不合理造成的.
1) 假设内存有 512M, 这通常是小型应用. 建议 Oracle 的 SGA 大约 240M,
其中: 共享池(SHARED_POOL_SIZE)可以设置 60M 到 80M, 根据实际的用户数、查询等来定.
数据块缓冲区可以大致分配 120M-150M:
8i 下需要设置 DB_BLOCK_BUFFERS, DB_BLOCK_BUFFER * DB_BLOCK_SIZE 等于数据块缓冲区大小.
9i 下的数据缓冲区可以用 db_cache_size 来直接分配.
2) 假设内存有 1G, Oracle 的 SGA 可以考虑分配 500M: 共享池分配 100M 到 150M, 数据缓冲区分配 300M 到 400M.
3) 内存 2G, SGA 可以考虑分配 1.2G, 共享池 300M 到 500M, 剩下的给数据块缓冲区.
4) 内存 2G 以上: 共享池 300M 到 500M 就足够, 再多也没有太大帮助;
(Biti_rainy 有专述)数据缓冲区是尽可能的大, 但是一定要注意两个问题:
一是要给操作系统和其他应用留够内存,
二是对于 32 位的操作系统, Oracle 的 SGA 有 1.75G 的限制. 有的 32 位操作系统上可以突破这个限制
二. 分析表和索引, 更改优化模式
Oracle 默认优化模式是 CHOOSE, 在这种情况下, 如果表没有经过分析, 经常导致查询使用全表扫描, 而不使用索引. 这通常导致磁盘 I/O 太多, 而导致查询很慢. 如果没有使用执行计划稳定性, 则应该把表和索引都分析一下, 这样可能直接会使查询速度大幅提升. 分析表命令可以用 ANALYZE TABLE 分析索引可以用 ANALYZE INDEX 命令. 对于少于 100 万的表, 可以考虑分析整个表, 对于很大的表, 可以按百分比来分析, 但是百分比不能过低, 否则生成的统计信息可能不准确. 可以通过 DBA_TABLES 的 LAST_ANALYZED 列来查看表是否经过分析或分析时间, 索引可以通过 DBA_INDEXES 的 LAST_ANALYZED 列.
下面通过例子来说明分析前后的速度对比.(表 USER 大约有 35 万数据, 有主键)首先在 SQLPLUS 中打开自动查询执行计划功能.
(第一次要执行 \RDBMS\ADMIN\utlxplan.sql 来创建 PLAN_TABLE 这个表)
SQL> SET AUTOTRACE ON
SQL> SET TIMING ON
通过 SET AUTOTRACE ON 来查看语句的执行计划, 通过 SET TIMING ON 来查看语句运行时间.
SQL> select count(*) from USER;
COUNT(*)
----------
346639
已用时间: 00: 00: 21.38
Execution Plan
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 SORT (AGGREGATE)
2 1 TABLE ACCESS (FULL) OF 'USER'
……………………
请注意上面分析中的 TABLE ACCESS(FULL), 这说明该语句执行了全表扫描. 而且查询使用了 21.38 秒. 这时表还没有经过分析.
下面我们来对该表进行分析:
SQL> analyze table USER compute statistics;
表已分析. 已用时间: 00: 05: 357.63.
然后再来查询:
SQL> select count(*) from USER;
COUNT(*)
----------
346639
已用时间: 00: 00: 00.71
Execution Plan
0 SELECT STATEMENT Optimizer=FIRST_ROWS (Cost=351 Card=1)
1 0 SORT (AGGREGATE)
2 1 INDEX (FAST FULL SCAN) OF 'PK_USERID' (UNIQUE) (Cost=351 Card=346351)
…………………………
请注意, 这次时间仅仅用了 0.71 秒! 这要归功于 INDEX(FAST FULL SCAN). 通过分析表, 查询使用了 PK_USERID 索引, 磁盘 I/O 大幅减少, 速度也大幅提升! 下面的实用语句可以用来生成分析某个用户的所有表和索引, 假设用户是 ORA9I:
SQL> set pagesize 0
SQL> spool d:\analyze_tables.sql;
SQL> select 'analyze table '||owner||'.'||table_name||' compute statistics;' from dba_tables where owner='ORA9I';
SQL> spool off
SQL> spool spool d:\analyze_indexes.sql;
SQL> select 'analyze index '||owner||'.'||index_name||' compute statistics;' from dba_indexes where owner='ORA9I';
SQL> spool off
SQL> @d:\analyze_tables.sql
SQL> @d:\analyze_indexes.sql
解释: 上面的语句生成了两个 sql 文件, 分别分析全部的 ORA9I 的表和索引. 如果需要按照百分比来分析表, 可以修改一下脚本.
通过上面的步骤, 我们就完成了对表和索引的分析, 可以测试一下速度的改进. 建议定期运行上面的语句, 尤其是数据经过大量更新.
当然, 也可以通过 dbms_stats 来分析表和索引, 更方便一些. 但是我仍然习惯上面的方法, 因为成功与否会直接提示出来.
三. 将常用的小表、索引钉在数据缓存 KEEP 池中
内存上数据读取速度远远比硬盘中读取要快, 据称, 内存中数据读的速度是硬盘的 14000 倍! 如果资源比较丰富,
把常用的小的、而且经常进行全表扫描的表给钉内存中, 当然是再好不过了. 可以简单的通过 ALTER TABLE tablename CACHE 来实现,
在 ORACLE8i 之后可以使用 ALTER TABLE table STORAGE(BUFFER_POOL KEEP). 一般来说, 可以考虑把 200 数据块之内的表放在 keep 池中,
当然要根据内存大小等因素来定.
关于如何查出哪些表或索引符合条件, 可以使用本文提供的 access.sql 和 access_report.sql. 这两个脚本是著名的 Oracle 专家 Burleson 写的, 你也可以在读懂了的情况下根据实际情况调整一下脚本. 对于索引, 可以通过 ALTER INDEX indexname STORAGE(BUFFER_POOL KEEP)来钉在 KEEP 池中.
将表定在 KEEP 池中需要做一些准备工作. 对于 ORACLE9i 需要设置 DB_KEEP_CACHE_SIZE, 对于 8i, 需要设置 buffer_pool_keep.
在 8i 中, 还要修改 db_block_lru_latches, 该参数默认是 1, 无法使用 buffer_pool_keep. 该参数应该比 2*3*CPU 数量少,
但是要大于 1, 才能设置 DB_KEEP_CACHE_BUFFER. buffer_pool_keep 从 db_block_buffers 中分配, 因此也要小于 db_block_buffers.
设置好这些参数后, 就可以把常用对象永久钉在内存里.
四. 调整排序参数
1) SORT_AREA_SIZE: 默认的用来排序的 SORT_AREA_SIZE 大小是 32K, 通常显得有点小, 一般可以考虑设置成 1M(1048576). 这个参数不能设置过大, 因为每个连接都要分配同样的排序内存.
2) SORT_MULTIBLOCK_READ_COUNT: 增大这个参数可以提高临时表空间排序性能, 该参数默认是 2, 可以改成 32 来对比一下排序查询时间变化. 注意, 这个参数的最大值与平台有关系.
分享到:
相关推荐
《基于成本的Oracle优化法则》是数据库专家Jonathan Lewis的一部经典著作,该书深入探讨了Oracle数据库的性能优化策略,特别是在成本基础优化方面。Oracle数据库是全球广泛使用的大型企业级数据库系统,其性能优化...
Oracle 优化器介绍 Oracle 优化器是 Oracle 数据库中的一种核心组件,负责生成执行计划,以提高 SQL 语句的执行效率。 Oracle 优化器可以分为两大类:基于规则的优化器(RBO)和基于成本的优化器(CBO)。 基于...
"基于成本的Oracle优化法则"是一个重要的概念,它涉及到Oracle数据库查询优化器的工作原理。在这个主题中,我们将深入探讨这一法则,理解其背后的机制,并学习如何利用这些知识来提升数据库性能。 1. **基于成本的...
Oracle 优化常用概念 Oracle 优化器是 Oracle 数据库管理系统中一个核心组件,负责根据用户提交的 SQL 语句生成最优的执行计划,以提高查询效率。以下是 Oracle 优化器中的一些常用概念: CBO/RBO Oracle 优化...
《Oracle优化日记——一个金牌DBA的故事》这本书深入浅出地揭示了Oracle数据库优化的精髓。作为一名金牌DBA,作者以其丰富的实战经验,通过一系列的实际案例,讲述了在Oracle数据库管理与优化过程中的种种挑战和解决...
Oracle优化设计方案旨在提升数据库性能,确保数据安全,便于管理和开发。设计Oracle数据库时,需要遵循一系列基本原则和步骤。 首先,逻辑建模是根据系统需求分析数据间的内在和外在关系,构建整个系统的数据结构。...
### Oracle优化重量级知识点解析 #### 一、Oracle优化的重要性 在数据库管理领域,Oracle数据库因其卓越的性能、稳定性和安全性而被广泛采用。然而,随着业务量的增长和技术的发展,即使是像Oracle这样的顶级...
优化笔记 sql性能的调整-总结 SQL代码性能优化 Oracle语句优化53个规则详解 ORACLE9i优化设计与系统调整 oracle9i优化器介绍 oracle9i的查询优化 ……
该培训资料中包括5大内容块: 1>Oracle分区技术及大数据量操作性能优化 2>Oracle性能问题一般解决思路 3>Oracle常用hint 4>Oracle动态图 5>Oracle执行计划和SQL调优
### Oracle优化教程知识点详解 #### 一、选用适合的Oracle优化器 在Oracle数据库中,优化器的选择对于SQL语句的执行效率至关重要。Oracle提供了三种优化器类型:基于规则(RULE)、基于成本(COST)和选择性...
ORACLE SQL性能优化系列 ORACLE SQL性能优化是数据库管理员和开发者非常关心的一个话题。为了提高数据库的性能,ORACLE 提供了多种优化技术。下面我们将详细介绍 ORACLE SQL 性能优化系列中的一些重要知识点。 一...
Oracle优化PPT教程通常会涵盖一系列关键概念和技术,旨在提高数据库的运行效率,减少资源消耗,提升用户体验。以下是对这个教程可能涉及的知识点的详细解释: 1. **SQL优化**:这是Oracle数据库优化的核心,涉及到...
### Oracle优化方法与实践 #### 一、优化器模式选择 在进行Oracle数据库优化时,首先需要关注的是优化器模式的选择。Oracle提供了多种优化器模式,包括基于规则的优化器(RULE)、基于成本的优化器(COST)以及...
Oracle SQL 优化 Oracle SQL 优化是数据库性能优化的关键部分。为了提高数据库的性能,我们需要从五个方面进行调整:去掉不必要的大型表的全表扫描、缓存小型表的全表扫描、检验优化索引的使用、检验优化的连接技术...
Oracle数据库性能优化是确保系统高效运行的关键环节,尤其是在大数据量和高并发的环境中。Oracle数据库因其先进、完整和集成的特性,在市场中占据主导地位,因此深入理解和掌握Oracle的优化技术至关重要。 首先,...
4. **内存结构调优**:Oracle数据库中的SGA(System Global Area)和PGA(Program Global Area)是关键内存结构。DBA需合理配置这些内存大小,以减少磁盘I/O,提高缓存命中率。 5. **统计信息收集**:准确的统计...
《Oracle查询优化改写技巧与案例》不讲具体语法,只是以案例的形式介绍各种查询语句的用法。第1~4章是基础部分,讲述了常用的各种基础语句,以及常见的错误和正确语句的写法。这部分的内容应熟练掌握,因为日常查询...
Oracle优化是数据库管理中的关键环节,它涉及到性能提升、资源有效利用和系统稳定性等多个方面。在给定的压缩包文件中,我们找到了四个与Oracle优化密切相关的文档:ArcSDE for Oracle优化配置和调整初步、oracle...