ITPub博客

首页 > 数据库 > Oracle > 优化SQL语句和应用程序

优化SQL语句和应用程序

原创 Oracle 作者:m77m78 时间:2007-04-15 23:58:18 0 删除 编辑
1. 测量SQL语句的性能
Tkprof(Trace Kernel Profile)工具的使用
功能:测量SQL语句的性能。
查看tkprof的不同参数 c:>tkprof[@more@]1. 测量SQL语句的性能
Tkprof(Trace Kernel Profile)工具的使用
功能:测量SQL语句的性能。
查看tkprof的不同参数 c:>tkprof

c:> tkprof D:oracleadminERPudumperp_ora_1436.trc bao.txt sys=no
explain=scott/tiger@erp
sys=no的含义:不包含递归SQL语句(即访问数据字典的隐含语句)

SQL语句的处理要经过三个阶段:Parse、Execute、Execute。
需要优化的SQL语句:
占用过多的CPU时间。
Parse、Execute、Execute阶段的时间太长。
从磁盘读太多的数据块,而从内存中读很少的数据块。
访问许多数据块,但只返回几条数据。

Top SQL 的使用
代替Tkprof。
首先找出哪些SQL语句的性能差,需要优化。
Top SQL 中的数据来源于V$SQL。

Top Sessions的使用

2. SQL语句的解释计划(EXPLAIN PLAN)
通过解释计划,可以找出SQL语句性能低的原因。

用图形界面来生成SQL语句的解释计划:
用SQL ScratchPad。

用命令来生成SQL语句的解释计划:
先检查sys用户下是否有plan_table表,如果没有,
执行d:oracleora92rdbmsadminutlxplan.sql脚本。

SQL>explain plan for SELECT e.empno, e.ename, d.deptno, d.loc
FROM scott.emp e, scott.dept d WHERE e.deptno = d.deptno;

查询执行计划:
SQL>select lpad(' ',4*(level-2)) || operation || ' ' || options || ' ' || object_name
"EXECUTION_PLAN" from plan_table start with id =0 connect by prior id = parent_id;

3.STATSPACK报告中的SQL语句性能
SQL ordered by Gets(按Gets排序的SQL语句)
SQL ordered by Reads(按Reads排序的SQL语句)
SQL ordered by Executions(按Executions排序的SQL语句)
SQL ordered by Parse Calls(按Parse Calls排序的SQL语句)

4. Oracle优化方式
优化方式:基于rule和cost.

基于rule时的优化等级:根据语法和表结构优化
1 Single row by rowid
2 Single row by cluster join
3 Single row by hash cluster key with unique or primary key
4 Single row by unique or primary key
5 Cluster join
6 Hash cluster key
7 Indexed cluster key
8 Composite key
9 Single-column indexes
10 Bounded range search on indexed columns
11 Unbounded range search on indexed columns
12 Sort-merge join
13 MAX or MIN of indexed column
14 ORDER BY on indexed columns
15 Full table scan
以 SELECT empno FROM emp WHERE ename = 'CHUNG' AND sal > 2000;语句为例说明访问路径 。分析应在哪个字段上创建索引?
缺点:小表的全表扫描比索引效率高,索引字段值的差异性小。

基于cost时的优化根据表和索引的统计信息优化,优先采用。
根据表和索引的统计信息包括:
每个表或索引的大小。
每个表或索引所包括的数据行数。
每个表或索引所使用的数据块数量。
每个表行的字节数。
索引字段值的差异性(基数)。

5. 统计信息的创建
SQL> ANALYZE TABLE employee COMPUTE STATISTICS;
SQL> ANALYZE INDEX employee_last_name_idx COMPUTE STATISTICS;

查询统计信息,可用图形界面或DBA_TABLES。

SQL> ANALYZE TABLE employee DELETE STATISTICS;

如果表或索引的数据量很大时,可以使用样本来创建统计信息:
SQL> ANALYZE TABLE employee ESTIMATE STATISTICS;
默认的样本大小为1064行。

SQL> ANALYZE TABLE employee ESTIMATE STATISTICS
SAMPLE 500 ROWS;
SQL> ANALYZE TABLE employee ESTIMATE STATISTICS
SAMPLE 35 PERCENT;

创建字段的统计信息:
SQL> ANALYZE TABLE employee ESTIMATE STATISTICS
FOR COLUMNS employee_id 500 size 200;
size的默认值是75。可以是1到254。

字段上的数据假设是正态分布。
直方图:SQL> ANALYZE TABLE finaid COMPUTE STATISTICS FOR COLUMN award size 100;

用图形界面创建统计信息。

优化提示:SQL> SELECT /*+ FIRST_ROWS */ * FROM hr.employees;
其它优化提示有:RULE、FULL SALES(访问SALES表)、 INDEX SALES_ID_PK、PARALLEL。

6. 设置优化模式
init.ora参数OPTIMIZER_MODE:
CHOOSE、RULE、FIRST_ROWS(提高响应时间)、ALL_ROWS(提高吞吐量)。


7. 优化应用程序
B树索引: 适合建在于重复值少的字段。
索引的统计信息,索引B-树的高度(建议<4)。
SQL> ANALYZE INDEX employee_last_name_idx VALIDATE STRUCTURE;
SQL> SELECT (DEL_LF_ROWS_LEN/ LF_ROWS_LEN) * 100 “Wasted Space” FROM index_stats WHERE NAME= “EMPLOYEE_LAST_NAME_IDX” ;

建议:索引的空闲空间(<20)。

重组索引:
SQL> alter index scott.pk_dept rebuild online;
SQL> alter index scott.pk_dept coalesce;

压缩B树索引:适合于索引字段重复值多的情况
SQL>ALTER INDEX employee_last_name_idx REBUILD COMPRESS;

位图(bitmap)索引:适合建在于重复值多的字段。
位图索引不适合于建在频繁进行insert、update和delete的表上。这些操作的性能代价太高。位图索引适合于数据仓库和DSS。
优化位图索引的init.ora参数:SORT_AREA_size、PGA_AGGREGATE_TARGET。
淘汰的init.ora参数:CREATE_BITMAP_AREA_size、BITMAP_MERGE_AREA_size。

函数索引
必须要把init.ora参数QUERY_REWRITE_ENABLE设成TRUE,才能创建函数索引。

SQL>SELECT last_name,first_name FROM employee
WHERE UPPER(first_name)=’SMITH’;

SQL> CREATE INDEX employee_first_name_upper_idx
ON employee(UPPER(first_name));

SQL> SELECT * FROM sales where (price * units) > 10000;
SQL> CREATE INDEX sales_total_sale_idx
ON sales (price * units) TABLESPACE INDX;

反键索引:适用于序列字段。
反键索引只适用于=和!=查询。使用Between、>、< 查询不会使用反键索引优化。

索引组织表(IOT)

分区表
簇:索引簇和散列簇。

8. 使用 SQL Analyze。
例子:SELECT department_name, department_id
FROM hr.departments
WHERE department_id NOT IN (SELECT department_id
FROM hr.employees)

使用Index Tuning Wizard。

第四课 调整共享池(Shared Pool)的性能

共享池由library cache和dictionary cache组成。采用LRU(Least Recently Used)算法管理。library cache用于缓存执行的SQL语句和PL/SQL程序。dictionary cache用于缓存数据字典。
共享池有关的数据字典:V$SQL、V$SQLAREA、V$SQLTEXT、V$SQL_PLAN。(V$session)。

1. 监视共享池的性能
测量library cache的命中率:V$librarycache
SQL>select namespace,gethitratio,pinhitratio,reloads,invalidations
from v$libarycache
where namespace in (‘SQL AREA’,’TABLE/PROCEDURE’,’BODY’,’TRIGGER’);

SQL AREA部分的gethitratio 、pinhitratio要 > 90%。

GETS(语法分析)。
PINS(执行)。
RELOADS(SQL语句需要重新语法分析)、
INVALIDATIONS(例如视图重新编译)。

select SUM(reloads)/SUM(pins) “Reload Ratio” from V$librarycache;

重新装载率Reload Ratio要 < 1%。

使用STATSPACK来监视library cache。
使用REPORT.TXT来监视library cache。
使用Performance Manager(内存、数据库例程、SQL)来监视library cache。

SGA内存的经验公式。

测量dictionary cache的命中率:V$rowcache
select 1- (SUM(getmisses)/SUM(gets)) “Data Dictionary Hit Ratio” from V$rowcache;
“Data Dictionary Hit Ratio”的值要 > 85%。
使用STATSPACK来监视dictionary cache。
使用REPORT.TXT来监视dictionary cache。

2. 提高共享池性能的方法
加大共享池的大小:init.ora参数shared_pool_size(动态参数)。注意参数sga_max_size。
(设置SGA内存大小的经验公式:
SGA = 55%物理内存
Shared pool = 45% SGA
Buffer cache = 45% SGA
Redo Log Cache = 10% SGA
)

为大型PL/SQL程序设置保留内存:防止其它SQL语句从内存中移走。
init.ora参数SHARED_POOL_RESERVED_size(建议值:10% shared_pool_size)。

销定(Pin)程序:DBMS_SHARED_POOL.KEEP(‘deposit’)。
鼓励代码重用:在SQL语句中使用变量。

调整共享池有关的init.ora参数
OPEN_CURSORS:建议值500。
CURSOR_SPACE_FOR_TIME:建议值TRUE。
SESSION_CACHED_CURSORS:建议值TRUE。
CURSOR_SHARING:默认值为EXACT。建议设成EXACT或FORCE。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/34329/viewspace-910953/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: Oracle历史(2)
请登录后发表评论 登录
全部评论

注册时间:2008-04-25

  • 博文量
    168
  • 访问量
    764675