从事IT基础架构多年,发现自己原来更合适去当老师……喜欢关注新鲜事物,不仅限于IT领域。
分类: Oracle
2007-02-05 15:19:59
查找未最优化的 SQL
尽管复杂查询可能具有极为复杂的执行计划,大多数 Oracle 专业人员必须调整具有以下问题的 SQL:
让我们来分析 v$sql_plan 视图如何能够帮助我们寻找 SQL 调整的机会。在搜索调整机会时,我们从查询 v$sql_plan 视图开始,以便找出这些大型表的全表扫描,如 所示。然后,我们提取相应的 SQL 并查看全表扫描是否适当还是由于缺失索引而造成的。
我们如何找到适于进行全表扫描的小型表?一种方法是搜索当前处于库高速缓存中的 SQL。Oracle 随后可以生成一个报表,列出在该时刻数据库中所有的全表扫描。 中的脚本从 v$sql_plan 中检查执行计划,并以全表扫描的频率生成报表。
报表(参见)具有以下的列:
该报表提供关于两个调整方面的信息:
将表、分区或索引分配到 KEEP 池很容易,利用 alter 系统命令可以随意添加或删除对象:
alter table CUSTOMER storage (buffer_pool KEEP);
例如,以下是一个使用 substr 和 to_char BIF 的基于函数的索引:
create index fbi_book on book ( substr(book_key,1,3) || to_char(book_retail_price) );
总之,v$sql_plan 中包含的信息是一种极好的执行系统级 SQL 调整的方法。
在 Oracle Database 10g 中有什么新特性?
随着 Oracle Database 10g 的出现,我们现在看到基于成本的 SQL 优化器有了显著的内在提高,并且自动的 SQL 优化机制更加方便。对 Oracle Database 10g 的 SQL 优化器的重大更改包括以下激动人心的主题:
成本的基本知识
尽管我们已经非常详细地了解了优化器内幕,还要不断学习更多内容,因为每个新版本的优化器都变得功能更加强大(和复杂)。本文的要点包括调整优化器行为的一般性原则:
--***************************************************** -- Object Access script report -- -- (c) 2003 by Donald K. Burleson -- This is freeware, Never to be sold --***************************************************** column nbr_FTS format 999,999 column num_rows format 999,999,999 column blocks format 999,999 column owner format a14; column name format a24; column ch format a1; set heading on; set feedback on; set echo off; set pages 999; ttitle 'full table scans and counts| |The "K" indicates that the table is in the KEEP Pool (Oracle8).' select p.owner, p.name, t.num_rows, ltrim(t.cache) ch, decode(t.buffer_pool,'KEEP','Y','DEFAULT','N') K, s.blocks blocks, sum(a.executions) nbr_FTS from dba_tables t, dba_segments s, v$sqlarea a, (select distinct address, object_owner owner, object_name name from v$sql_plan where operation = 'TABLE ACCESS' and options = 'FULL') p where a.address = p.address and t.owner = s.owner and t.table_name = s.segment_name and t.table_name = p.name and t.owner = p.owner and t.owner not in ('SYS','SYSTEM') having sum(a.executions) > 9 group by p.owner, p.name, t.num_rows, t.cache, t.buffer_pool, s.blocks order by sum(a.executions) desc;
列表3:
Listing 3: Full table scans and counts:OWNER NAME NUM_ROWS C K BLOCKS NBR_FTS ---------- -------------------- ------------ - - -------- -------- APPLSYS FND_CONC_RELEASE_DISJS 39 N K 2 98,864 APPLSYS FND_CONC_RELEASE_PERIODS 39 N K 2 98,864 APPLSYS FND_CONC_RELEASE_STATES 1 N K 2 98,864 APPLSYS FND_CONC_PP_ACTIONS 7,021 N 1,262 52,036 APPLSYS FND_CONC_REL_CONJ_MEMBER 0 N K 22 50,174 APPLSYS FND_CONC_REL_DISJ_MEMBER 39 N K 2 50,174 APPLSYS FND_FILE_TEMP 0 N 22 48,611 APPLSYS FND_RUN_REQUESTS 99 N 32 48,606 INV MTL_PARAMETERS 6 N K 6 21,478 APPLSYS FND_PRODUCT_GROUPS 1 N 2 12,555 APPLSYS FND_CONCURRENT_QUEUES_TL 13 N K 10 12,257 AP AP_SYSTEM_PARAMETERS_ALL 1 N K 6 4,521