`
jason9988
  • 浏览: 4832 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

One article about Oracle SQL Tunning

阅读更多

  

Oracle database Performance Tuning FAQ
From Oracle FAQ
Jump to: navigation, search
General Oracle database Performance Tuning FAQ. Remember: The best performance comes from the unnecessary work you don't do.

Contents [hide]
1 Why and when should one tune?
2 Where should the tuning effort be directed?
3 What tools/utilities does Oracle provide to assist with performance tuning?
4 When is cost based optimization triggered?
5 How can one optimize %XYZ% queries?
6 Where can one find I/O statistics per table?
7 My query was fine last week and now it is slow. Why?
8 Does Oracle use my index or not?
9 Why is Oracle not using the damn index?
10 When should one rebuild an index?
11 How does one tune Oracle Wait event XYZ?
12 What is the difference between DBFile Sequential and Scattered Reads?
13 How does one tune the Redo Log Buffer?


[edit] Why and when should one tune?
One of the biggest responsibilities of a DBA is to ensure that the Oracle database is tuned properly. The Oracle RDBMS is highly tunable and allows the database to be monitored and adjusted to increase its performance.

One should do performance tuning for the following reasons:

The speed of computing might be wasting valuable human time (users waiting for response);
Enable your system to keep-up with the speed business is conducted; and
Optimize hardware usage to save money (companies are spending millions on hardware).
Although this site is not overly concerned with hardware issues, one needs to remember than you cannot tune a Buick into a Ferrari.

[edit] Where should the tuning effort be directed?
Consider the following areas for tuning. The order in which steps are listed needs to be maintained to prevent tuning side effects. For example, it is no good increasing the buffer cache if you can reduce I/O by rewriting a SQL statement.

Database Design (if it's not too late):
Poor system performance usually results from a poor database design. One should generally normalize to the 3NF. Selective denormalization can provide valuable performance improvements. When designing, always keep the "data access path" in mind. Also look at proper data partitioning, data replication, aggregation tables for decision support systems, etc.
Application Tuning:
Experience showed that approximately 80% of all Oracle system performance problems are resolved by coding optimal SQL. Also consider proper scheduling of batch tasks after peak working hours.
Memory Tuning:
Properly size your database buffers (shared_pool, buffer cache, log buffer, etc) by looking at your wait events, buffer hit ratios, system swapping and paging, etc. You may also want to pin large objects into memory to prevent frequent reloads.
Disk I/O Tuning:
Database files needs to be properly sized and placed to provide maximum disk subsystem throughput. Also look for frequent disk sorts, full table scans, missing indexes, row chaining, data fragmentation, etc.
Eliminate Database Contention:
Study database locks, latches and wait events carefully and eliminate where possible.
Tune the Operating System:
Monitor and tune operating system CPU, I/O and memory utilization. For more information, read the related Oracle FAQ dealing with your specific operating system.
[edit] What tools/utilities does Oracle provide to assist with performance tuning?
Oracle provide the following tools/ utilities to assist with performance monitoring and tuning:

ADDM (Automated Database Diagnostics Monitor) introduced in Oracle 10g
TKProf
Statspack
Oracle Enterprise Manager - Tuning Pack (cost option)
Old UTLBSTAT.SQL and UTLESTAT.SQL - Begin and end stats monitoring
[edit] When is cost based optimization triggered?
It's important to have statistics on all tables for the CBO (Cost Based Optimizer) to work correctly. If one table involved in a statement does not have statistics, and optimizer dynamic sampling isn't performed, Oracle has to revert to rule-based optimization for that statement. So you really want for all tables to have statistics right away; it won't help much to just have the larger tables analyzed.

Generally, the CBO can change the execution plan when you:

Change statistics of objects by doing an ANALYZE;
Change some initialization parameters (for example: hash_join_enabled, sort_area_size, db_file_multiblock_read_count).
[edit] How can one optimize %XYZ% queries?
It is possible to improve %XYZ% (wildcard search) queries by forcing the optimizer to scan all the entries from the index instead of the table. This can be done by specifying hints.

If the index is physically smaller than the table (which is usually the case) it will take less time to scan the entire index than to scan the entire table.

[edit] Where can one find I/O statistics per table?
The STATSPACK and UTLESTAT reports show I/O per tablespace. However, they do not show which tables in the tablespace has the most I/O operations.

The $ORACLE_HOME/rdbms/admin/catio.sql script creates a sample_io procedure and table to gather the required information. After executing the procedure, one can do a simple SELECT * FROM io_per_object; to extract the required information.

For more details, look at the header comments in the catio.sql script.

[edit] My query was fine last week and now it is slow. Why?
The likely cause of this is because the execution plan has changed. Generate a current explain plan of the offending query and compare it to a previous one that was taken when the query was performing well. Usually the previous plan is not available.

Some factors that can cause a plan to change are:

Which tables are currently analyzed? Were they previously analyzed? (ie. Was the query using RBO and now CBO?)
Has OPTIMIZER_MODE been changed in INIT<SID>.ORA?
Has the DEGREE of parallelism been defined/changed on any table?
Have the tables been re-analyzed? Were the tables analyzed using estimate or compute? If estimate, what percentage was used?
Have the statistics changed?
Has the SPFILE/ INIT<SID>.ORA parameter DB_FILE_MULTIBLOCK_READ_COUNT been changed?
Has the INIT<SID>.ORA parameter SORT_AREA_SIZE been changed?
Have any other INIT<SID>.ORA parameters been changed?
What do you think the plan should be? Run the query with hints to see if this produces the required performance.

It can also happen because of a very high high water mark. Typically when a table was big, but now only contains a couple of records. Oracle still needs to scan through all the blocks to see if they contain data.

[edit] Does Oracle use my index or not?
One can use the index monitoring feature to check if indexes are used by an application or not. When the MONITORING USAGE property is set for an index, one can query the v$object_usage to see if the index is being used or not. Here is an example:

SQL> CREATE TABLE t1 (c1 NUMBER);
Table created.

SQL> CREATE INDEX t1_idx ON t1(c1);
Index created.

SQL> ALTER INDEX t1_idx MONITORING USAGE;
Index altered.

SQL>
SQL> SELECT table_name, index_name, monitoring, used FROM v$object_usage;
TABLE_NAME                     INDEX_NAME                     MON USE
------------------------------ ------------------------------ --- ---
T1                             T1_IDX                         YES NO

SQL> SELECT * FROM t1 WHERE c1 = 1;
no rows selected

SQL> SELECT table_name, index_name, monitoring, used FROM v$object_usage;
TABLE_NAME                     INDEX_NAME                     MON USE
------------------------------ ------------------------------ --- ---
T1                             T1_IDX                         YES YES
To reset the values in the v$object_usage view, disable index monitoring and re-enable it:

ALTER INDEX indexname NOMONITORING USAGE;
ALTER INDEX indexname MONITORING   USAGE;
[edit] Why is Oracle not using the damn index?
This problem normally only arises when the query plan is being generated by the Cost Based Optimizer (CBO). The usual cause is because the CBO calculates that executing a Full Table Scan would be faster than accessing the table via the index. Fundamental things that can be checked are:

USER_TAB_COLUMNS.NUM_DISTINCT - This column defines the number of distinct values the column holds.
USER_TABLES.NUM_ROWS - If NUM_DISTINCT = NUM_ROWS then using an index would be preferable to doing a FULL TABLE SCAN. As the NUM_DISTINCT decreases, the cost of using an index increase thereby making the index less desirable.
USER_INDEXES.CLUSTERING_FACTOR - This defines how ordered the rows are in the index. If CLUSTERING_FACTOR approaches the number of blocks in the table, the rows are ordered. If it approaches the number of rows in the table, the rows are randomly ordered. In such a case, it is unlikely that index entries in the same leaf block will point to rows in the same data blocks.
Decrease the INIT<SID>.ORA parameter DB_FILE_MULTIBLOCK_READ_COUNT - A higher value will make the cost of a FULL TABLE SCAN cheaper.
Remember that you MUST supply the leading column of an index, for the index to be used (unless you use a FAST FULL SCAN or SKIP SCANNING).

There are many other factors that affect the cost, but sometimes the above can help to show why an index is not being used by the CBO. If from checking the above you still feel that the query should be using an index, try specifying an index hint. Obtain an explain plan of the query either using TKPROF with TIMED_STATISTICS, so that one can see the CPU utilization, or with AUTOTRACE to see the statistics. Compare this to the explain plan when not using an index.

[edit] When should one rebuild an index?
You can run the ANALYZE INDEX <index> VALIDATE STRUCTURE command on the affected indexes - each invocation of this command creates a single row in the INDEX_STATS view. This row is overwritten by the next ANALYZE INDEX command, so copy the contents of the view into a local table after each ANALYZE. The 'badness' of the index can then be judged by the ratio of 'DEL_LF_ROWS' to 'LF_ROWS'.

For example, you may decide that index should be rebuilt if more than 20% of its rows are deleted:

select del_lf_rows * 100 / decode(lf_rows,0,1,lf_rows) from index_stats
where name = 'index_ name';
[edit] How does one tune Oracle Wait event XYZ?
Here are some of the wait events from V$SESSION_WAIT and V$SYSTEM_EVENT views:

db file sequential read: Tune SQL to do less I/O. Make sure all objects are analyzed. Redistribute I/O across disks.
buffer busy waits: Increase DB_CACHE_SIZE (DB_BLOCK_BUFFERS prior to 9i)/ Analyze contention from SYS.V$BH ("buffer busy waits" was replaced with "read by other session" Oracle 10g).
log buffer space: Increase LOG_BUFFER parameter or move log files to faster disks
log file sync: If this event is in the top 5, you are committing too often (talk to your developers)
log file parallel write: deals with flushing out the redo log buffer to disk. Your disks may be too slow or you have an I/O bottleneck.
Two useful sections in Oracle's Database Performance Tuning Guide:

Table of Wait Events and Potential Causes
Wait Events Statistics
[edit] What is the difference between DBFile Sequential and Scattered Reads?
Both "db file sequential read" and "db file scattered read" events signify time waited for I/O read requests to complete. Time is reported in 100's of a second for Oracle 8i releases and below, and 1000's of a second for Oracle 9i and above. Most people confuse these events with each other as they think of how data is read from disk. Instead they should think of how data is read into the SGA buffer cache.

db file sequential read:

A sequential read operation reads data into contiguous memory (usually a single-block read with p3=1, but can be multiple blocks). Single block I/Os are usually the result of using indexes. This event is also used for rebuilding the controlfile and reading datafile headers (P2=1). In general, this event is indicative of disk contention on index reads.

db file scattered read:

Similar to db file sequential reads, except that the session is reading multiple data blocks and scatters them into different discontinuous buffers in the SGA. This statistic is NORMALLY indicating disk contention on full table scans. Rarely, data from full table scans could be fitted into a contiguous buffer area, these waits would then show up as sequential reads instead of scattered reads.

The following query shows average wait time for sequential versus scattered reads:

prompt "AVERAGE WAIT TIME FOR READ REQUESTS"
select a.average_wait "SEQ READ", b.average_wait "SCAT READ"
from   sys.v_$system_event a, sys.v_$system_event b
where  a.event = 'db file sequential read'
and    b.event = 'db file scattered read';
[edit] How does one tune the Redo Log Buffer?
The size of the Redo log buffer is determined by the LOG_BUFFER parameter in your SPFILE/INIT.ORA file. The default setting is normally 512 KB or (128 KB * CPU_COUNT), whichever is greater. This is a static parameter and its size cannot be modified after instance startup.

SQL> show parameters log_buffer
NAME                                 TYPE        value
------------------------------------ ----------- ------------------------------
log_buffer                           integer     262144
When a transaction is committed, info in the redo log buffer is written to a Redo Log File. In addition to this, the following conditions will trigger LGWR to write the contents of the log buffer to disk:

Whenever the log buffer is MIN(1/3 full, 1 MB) full; or
Every 3 seconds; or
When a DBWn process writes modified buffers to disk (checkpoint).
Larger LOG_BUFFER values reduce log file I/O, but may increase the time OLTP users have to wait for write operations to complete. In general, values between the default and 1 to 3MB are optimal. However, you may want to make it bigger to accommodate bulk data loading, or to accommodate a system with fast CPUs and slow disks. Nevertheless, if you set this parameter to a value beyond 10M, you should think twice about what you are doing.

SQL> SELECT name, value
  2    FROM SYS.v_$sysstat
  3   WHERE NAME in ('redo buffer allocation retries',
  4                  'redo log space wait time');
NAME                                                                  value
---------------------------------------------------------------- ----------
redo buffer allocation retries                                            3
redo log space wait time                                                  0
Statistic "REDO BUFFER ALLOCATION RETRIES" shows the number of times a user process waited for space in the redo log buffer. This value is cumulative, so monitor it over a period of time while your application is running. If this value is continuously increasing, consider increasing your LOG_BUFFER (but only if you do not see checkpointing and archiving problems).

"REDO LOG SPACE WAIT TIME" shows cumulative time (in 10s of milliseconds) waited by all processes waiting for space in the log buffer. If this value is low, your log buffer size is most likely adequate.
分享到:
评论

相关推荐

    Oracle SQL Tuning with Oracle SQLTXPLAIN: Oracle Database 12c Edition

    Oracle SQL Tuning with Oracle SQLTXPLAIN: Oracle Database 12c Edition by Stelios Charalambides English | 8 May 2017 | ISBN: 1484224353 | 408 Pages | PDF | 24.39 MB Learn through this practical guide ...

    oracle sql_tuning

    SQL_Tuning是Oracle官方提供的一个专题,旨在帮助管理员和开发人员优化SQL查询,从而提高数据库的效率和响应时间。以下是一些关于"Oracle SQL Tuning"的重要知识点: 1. **SQL执行计划**:SQL执行计划是Oracle解析...

    oracle sqltuning workshop

    在这个"Oracle SQLTuning Workshop"中,虽然资料可能源自2004年,但它依然包含了许多至今仍具价值的基础知识和实践经验。以下是一些核心知识点的详细说明: 1. **SQL基础**:SQL(结构化查询语言)是用于管理和处理...

    使用ORACLE SQL Tuning advisor快速优化低效的SQL语句

    使用ORACLE SQL Tuning advisor快速优化低效的SQL语句, 这里是一个使用范例,有9个步骤, 后面 其他语句,都按照这个步骤来做就可以了。

    Oracle SQL Tuning.pdf

    本文将基于“Oracle SQL Tuning”这一主题,深入探讨Oracle SQL调优的核心概念、策略及实践方法。 一、SQL语句处理概览 SQL语句的执行效率对数据库性能有决定性影响。在Oracle环境中,SQL语句的处理流程主要包括...

    Oracle SQL Tuning with Oracle SQLTXPLAIN

    Oracle SQL Tuning with Oracle SQLTXPLAIN,Oracle SQL Tuning with Oracle SQLTXPLAIN,Oracle SQL Tuning with Oracle SQLTXPLAIN

    Oracle SQL Tuning with Oracle SQLTXPLAIN(Apress,2013)

    Oracle SQL Tuning with SQLTXPLAIN is a practical guide to SQL tuning the way Oracle's own experts do it, using a freely downloadable tool called SQLTXPLAIN. Using this simple tool you'll learn how to ...

    Oracle 12C SQL Tuning for Developers

    2. **自动SQL调优**:Oracle 12C引入了Automatic SQL Tuning,它自动识别性能瓶颈并提出优化建议。通过Advisor工具,如SQL Tuning Advisor,系统会分析SQL语句并提供改进建议,如创建索引、重写查询或调整绑定变量。...

    Oracle SQL Tuning Pocket Reference

    ### Oracle SQL Tuning Pocket Reference 知识点解析 #### 一、引言 《Oracle SQL Tuning Pocket Reference》是一本由 Mark Gurry 编写的快速参考指南书籍,旨在为 Oracle SQL 的调优提供实用建议与策略。该书不是...

    ORACLE SQL PERFORMANCE TUNING AND OPTIMIZATION

    《Oracle SQL Performance Tuning and Optimization》是一本专为数据库管理员和开发人员设计的指南,旨在帮助读者深入理解如何优化Oracle数据库中的SQL查询性能。这本书详细介绍了Oracle SQL调优的各个方面,包括...

    oracle sql tuning

    ### Oracle SQL Tuning详解 #### 一、Oracle SQL性能调优概述 在Oracle数据库管理中,SQL性能调优是一项至关重要的任务,它直接影响到应用程序的响应时间和系统的整体性能。SQL性能调优通常涉及对SQL语句进行分析...

    Apress Oracle SQL Tuning with Oracle SQLTXPLAIN 2013

    《Apress Oracle SQL Tuning with Oracle SQLTXPLAIN 2013》这本书是关于使用Oracle提供的工具SQLTXPLAIN来优化SQL语句的专业指南。SQL优化是提高数据库性能的关键环节,而本书深入介绍了如何分析和解决Oracle SQL...

    SQL Tuning Advisor使用总结

    SQL Tuning Advisor(STA)是Oracle数据库中的一个强大工具,用于优化SQL语句的性能。通过自动化的诊断过程,STA能够帮助数据库管理员(DBA)识别出低效的SQL语句,并提供改进建议。本文将详细介绍如何利用SQL ...

    Oracle SQL Tuning with Oracle SQLTXPLAIN.pdf

    ### Oracle SQL Tuning with Oracle SQLTXPLAIN #### 引言 本书旨在介绍一款非常有用的工具——Oracle SQLTXPLAIN(简称SQLT)。对于从事Oracle数据库优化的人员来说,SQLT是必不可少且极为实用的一款工具,更重要...

    Tosska SQL Tuning Expert for Oracle 2.0.3_x64.exe

    Tosska SQL Tuning Expert (TSE™) 是一款优秀的SQL 调优工具,无需用户参与即可优化 SQL 语句。该产品将为您提供最终的 SQL 性能解决方案,只需点击鼠标即可。在整个 SQL 调优过程中,您不必进行分析、猜测或手工...

    高清彩版 oracle sql performance tuning and optimization

    标题提到的 "高清彩版 oracle sql performance tuning and optimization" 指的是一本关于Oracle SQL性能调优和优化的专业书籍。从标题中可以了解到,书籍强调的是“基数(Cardinalities)”在Oracle SQL性能调整中的...

    oracle SQL性能优化

    3本经典oracle sql性能优化的的书,值得一看: Oracle.High.Performance.Tuning.for.9i.and.10g.chm Oracle性能优化技术内幕.pdf SQL Performance Tuning -0201791692.chm

Global site tag (gtag.js) - Google Analytics