zhouweifeng
自我介绍
切换风格
订阅我的Blog
博客日历
文章归档...
最新发表...
最多阅读文章...
博客统计...
网站链接...
资源
===========================================================
一个简单的sql优化例子
===========================================================
今天网友liosun问到虚拟索引,想起以前给SDE优化的一个例子涉及到,顺便贴出优化的一个简单过程(摘自办公邮件):

All:

目前索引结构:

SQL> select index_name,table_name,column_name from dba_ind_columns where lower(table_name) in ('feed_items','feed_schema','feed_string_attributes')


INDEX_NAME TABLE_NAME COLUMN_NAME
------------------------------ ------------------------------ ------------------------------
PK_FEED_ITEMS FEED_ITEMS FEED_ITEM_ID
PK_FEED_SCHEMA FEED_SCHEMA FEED_SCHEMA_ID
PK_FEED_STRING_ATTRIBUTES FEED_STRING_ATTRIBUTES FEED_STRING_ATTRIBUTE_ID
UI_FEED_STRING_ATTRIBUTES_NBK FEED_STRING_ATTRIBUTES JOYO_ATTRIBUTE_ID
UI_FEED_STRING_ATTRIBUTES_NBK FEED_STRING_ATTRIBUTES ORDINAL_NUMBER
UI_FEED_STRING_ATTRIBUTES_NBK FEED_STRING_ATTRIBUTES FEED_ITEM_ID

6 rows selected.

执行计划:

select
feed.feed_item_id,feed.feed_schema_id feed_schema_id, sch.vendor_code, attr.attribute_value vendor_product_id
from
MATCHING_PROD_USER.feed_items feed,
MATCHING_PROD_USER.feed_schema sch,
MATCHING_PROD_USER.feed_string_attributes attr
where
feed.FEED_SCHEMA_ID=sch.feed_schema_id
and feed.FEED_ITEM_ID = attr.FEED_ITEM_ID
and attr.JOYO_ATTRIBUTE_ID=1
and feed.process_status_id =1
and rownum<50

Elapsed: 00:00:26.93

Execution Plan
----------------------------------------------------------
Plan hash value: 598078541

---------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 49 | 3626 | 115 (1)| 00:00:02 |
|* 1 | COUNT STOPKEY | | | | | |
|* 2 | HASH JOIN | | 1627K| 114M| 115 (1)| 00:00:02 |
| 3 | TABLE ACCESS FULL | FEED_SCHEMA | 3 | 24 | 9 (0)| 00:00:01 |
| 4 | NESTED LOOPS | | 50 | 1650 | 105 (0)| 00:00:02 |
|* 5 | TABLE ACCESS FULL | FEED_STRING_ATTRIBUTES | 51 | 1071 | 3 (0)| 00:00:01 |
|* 6 | TABLE ACCESS BY INDEX ROWID| FEED_ITEMS | 1 | 12 | 2 (0)| 00:00:01 |
|* 7 | INDEX UNIQUE SCAN | PK_FEED_ITEMS | 1 | | 1 (0)| 00:00:01 |
---------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - filter(ROWNUM<50)
2 - access("FEED"."FEED_SCHEMA_ID"="SCH"."FEED_SCHEMA_ID")
5 - filter("ATTR"."JOYO_ATTRIBUTE_ID"=1)
6 - filter("FEED"."PROCESS_STATUS_ID"=1)
7 - access("FEED"."FEED_ITEM_ID"="ATTR"."FEED_ITEM_ID")


Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
5525557 consistent gets
79720 physical reads
0 redo size
2503 bytes sent via SQL*Net to client
418 bytes received via SQL*Net from client
5 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
49 rows processed


目前还不是很清楚各个表的结构,建议考虑索引的修改:

黑色的复合索引是否需要分开
在column feed_items.feed_schema_id 上增加索引


测试了下创建2个索引的效果,供参考:红色字体的表只有3条数据,全表扫描访问,没有考虑再次优化。consistent gets = 4907552 还是很高,估计可能和虚拟索引有关系。


SQL> create index idx_feed_string on FEED_STRING_ATTRIBUTES(FEED_ITEM_ID) nosegment;

Index created.

Elapsed: 00:00:00.10

SQL> create index idx_feed_items_schema_id on feed_items(feed_schema_id) nosegment;

Index created.

SQL> alter session set "_use_nosegment_indexes" = true;

Session altered.

Elapsed: 00:00:00.12

49 rows selected.

Elapsed: 00:00:21.89

Execution Plan
----------------------------------------------------------
Plan hash value: 3268655428

------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 49 | 2009 | 78 (0)| 00:00:01 |
|* 1 | COUNT STOPKEY | | | | | |
|* 2 | TABLE ACCESS BY INDEX ROWID | FEED_STRING_ATTRIBUTES | 1 | 21 | 2 (0)| 00:00:01 |
| 3 | NESTED LOOPS | | 50 | 2050 | 78 (0)| 00:00:01 |
| 4 | NESTED LOOPS | | 39 | 780 | 6 (0)| 00:00:01 |
| 5 | TABLE ACCESS FULL | FEED_SCHEMA | 3 | 24 | 4 (0)| 00:00:01 |
|* 6 | TABLE ACCESS BY INDEX ROWID| FEED_ITEMS | 39 | 468 | 2 (0)| 00:00:01 |
|* 7 | INDEX RANGE SCAN | IDX_FEED_ITEMS_SCHEMA_ID | 50 | | 1 (0)| 00:00:01 |
|* 8 | INDEX RANGE SCAN | IDX_FEED_STRING | 9 | | 1 (0)| 00:00:01 |
------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - filter(ROWNUM<50)
2 - filter("ATTR"."JOYO_ATTRIBUTE_ID"=1)
6 - filter("FEED"."PROCESS_STATUS_ID"=1)
7 - access("FEED"."FEED_SCHEMA_ID"="SCH"."FEED_SCHEMA_ID")
8 - access("FEED"."FEED_ITEM_ID"="ATTR"."FEED_ITEM_ID")


Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
4907552 consistent gets
47897 physical reads
0 redo size
2503 bytes sent via SQL*Net to client
418 bytes received via SQL*Net from client
5 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
49 rows processed

/********************简单调试后****************************/

Hi:


我们可以试用下如下sql:


select /*+use_nl(feed) index(attr UI_FSA_NBK) index(feed I_FI_PROCSTATUSID)*/
feed.feed_item_id,feed.feed_schema_id feed_schema_id,sch.vendor_code,
attr.attribute_value vendor_product_id
from
MATCHING_PROD_USER.feed_items feed,
MATCHING_PROD_USER.feed_schema sch,
MATCHING_PROD_USER.feed_string_attributes attr
where
feed.FEED_SCHEMA_ID=sch.feed_schema_id
and feed.FEED_ITEM_ID = attr.FEED_ITEM_ID
and attr.JOYO_ATTRIBUTE_ID=1
and feed.process_status_id =1
and rownum<50

49 rows selected.

Elapsed: 00:00:00.30

Execution Plan
----------------------------------------------------------
Plan hash value: 1653673368

----------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 49 | 2009 | 122 (1)| 00:00:02 |
|* 1 | COUNT STOPKEY | | | | | |
| 2 | TABLE ACCESS BY INDEX ROWID | FEED_STRING_ATTRIBUTES | 1 | 21 | 3 (0)| 00:00:01 |
| 3 | NESTED LOOPS | | 50 | 2050 | 122 (1)| 00:00:02 |
| 4 | NESTED LOOPS | | 39 | 780 | 10 (0)| 00:00:01 |
| 5 | TABLE ACCESS FULL | FEED_SCHEMA | 3 | 24 | 4 (0)| 00:00:01 |
|* 6 | TABLE ACCESS BY INDEX ROWID| FEED_ITEMS | 39 | 468 | 6 (0)| 00:00:01 |
|* 7 | INDEX RANGE SCAN | I_FI_PROCSTATUSID | 118 | | 2 (0)| 00:00:01 |
|* 8 | INDEX RANGE SCAN | UI_FSA_NBK | 1 | | 2 (0)| 00:00:01 |
----------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - filter(ROWNUM<50)
6 - filter("FEED"."FEED_SCHEMA_ID"="SCH"."FEED_SCHEMA_ID")
7 - access("FEED"."PROCESS_STATUS_ID"=1)
8 - access("FEED"."FEED_ITEM_ID"="ATTR"."FEED_ITEM_ID" AND "ATTR"."JOYO_ATTRIBUTE_ID"=1)


Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
6696 consistent gets
0 physical reads
0 redo size
2504 bytes sent via SQL*Net to client
418 bytes received via SQL*Net from client
5 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
49 rows processed

MATCHING_PROD_USER.feed_items

目前相关表的索引结构:

SQL> select index_name,table_name,column_name from dba_ind_columns where lower(table_name) in ('feed_items','feed_schema','feed_string_attributes');

INDEX_NAME TABLE_NAME COLUMN_NAME
------------------------------ ------------------------------ ----------------------------------------
PK_FEED_ITEMS FEED_ITEMS FEED_ITEM_ID
PK_FEED_SCHEMA FEED_SCHEMA FEED_SCHEMA_ID
PK_FEED_STRING_ATTRIBUTES FEED_STRING_ATTRIBUTES FEED_STRING_ATTRIBUTE_ID
I_FI_PROCSTATUSID FEED_ITEMS PROCESS_STATUS_ID
UI_FSA_NBK FEED_STRING_ATTRIBUTES ORDINAL_NUMBER
UI_FSA_NBK FEED_STRING_ATTRIBUTES FEED_ITEM_ID
UI_FSA_NBK FEED_STRING_ATTRIBUTES JOYO_ATTRIBUTE_ID

7 rows selected.

/*************************其他写法*************************/

再提供两种SQL写法,供参考!

49 rows selected.

Elapsed: 00:00:00.03

Execution Plan
----------------------------------------------------------
Plan hash value: 1983741984

----------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 49 | 2058 | 97 (0)| 00:00:02 |
|* 1 | COUNT STOPKEY | | | | | |
| 2 | TABLE ACCESS BY INDEX ROWID | FEED_STRING_ATTRIBUTES | 2 | 44 | 3 (0)| 00:00:01 |
| 3 | NESTED LOOPS | | 50 | 2100 | 97 (0)| 00:00:02 |
|* 4 | HASH JOIN | | 31 | 620 | 9 (12)| 00:00:01 |
| 5 | TABLE ACCESS FULL | FEED_SCHEMA | 3 | 24 | 2 (0)| 00:00:01 |
| 6 | TABLE ACCESS BY INDEX ROWID| FEED_ITEMS | 93 | 1116 | 6 (0)| 00:00:01 |
|* 7 | INDEX RANGE SCAN | I_FI_PROCSTATUSID | 6884 | | 3 (0)| 00:00:01 |
|* 8 | INDEX RANGE SCAN | UI_FSA_NBK | 1 | | 2 (0)| 00:00:01 |
----------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - filter(ROWNUM<50)
4 - access("FEED"."FEED_SCHEMA_ID"="SCH"."FEED_SCHEMA_ID")
7 - access("FEED"."PROCESS_STATUS_ID"=1)
8 - access("FEED"."FEED_ITEM_ID"="ATTR"."FEED_ITEM_ID" AND "ATTR"."JOYO_ATTRIBUTE_ID"=1)


Statistics
----------------------------------------------------------
223 recursive calls
0 db block gets
205 consistent gets
2 physical reads
0 redo size
2505 bytes sent via SQL*Net to client
418 bytes received via SQL*Net from client
5 SQL*Net roundtrips to/from client
13 sorts (memory)
0 sorts (disk)
49 rows processed


select /*index(attr UI_FSA_NBK) index(feed I_FI_PROCSTATUSID)*/
feed.feed_item_id,feed.feed_schema_id feed_schema_id,sch.vendor_code,
attr.attribute_value vendor_product_id
from
MATCHING_PROD_USER.feed_items feed,
MATCHING_PROD_USER.feed_schema sch,
MATCHING_PROD_USER.feed_string_attributes attr
where
feed.FEED_SCHEMA_ID=sch.feed_schema_id
and feed.FEED_ITEM_ID = attr.FEED_ITEM_ID
and attr.JOYO_ATTRIBUTE_ID=1
and feed.process_status_id =1
and rownum<50


49 rows selected.

Elapsed: 00:00:00.02

Execution Plan
----------------------------------------------------------
Plan hash value: 1983741984

----------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 49 | 2058 | 97 (0)| 00:00:02 |
|* 1 | COUNT STOPKEY | | | | | |
| 2 | TABLE ACCESS BY INDEX ROWID | FEED_STRING_ATTRIBUTES | 2 | 44 | 3 (0)| 00:00:01 |
| 3 | NESTED LOOPS | | 50 | 2100 | 97 (0)| 00:00:02 |
|* 4 | HASH JOIN | | 31 | 620 | 9 (12)| 00:00:01 |
| 5 | TABLE ACCESS FULL | FEED_SCHEMA | 3 | 24 | 2 (0)| 00:00:01 |
| 6 | TABLE ACCESS BY INDEX ROWID| FEED_ITEMS | 93 | 1116 | 6 (0)| 00:00:01 |
|* 7 | INDEX RANGE SCAN | I_FI_PROCSTATUSID | 6884 | | 3 (0)| 00:00:01 |
|* 8 | INDEX RANGE SCAN | UI_FSA_NBK | 1 | | 2 (0)| 00:00:01 |
----------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - filter(ROWNUM<50)
4 - access("FEED"."FEED_SCHEMA_ID"="SCH"."FEED_SCHEMA_ID")
7 - access("FEED"."PROCESS_STATUS_ID"=1)
8 - access("FEED"."FEED_ITEM_ID"="ATTR"."FEED_ITEM_ID" AND "ATTR"."JOYO_ATTRIBUTE_ID"=1)


Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
165 consistent gets
0 physical reads
0 redo size
2505 bytes sent via SQL*Net to client
418 bytes received via SQL*Net from client
5 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
49 rows processed

select /*+use_nl(feed) index(attr UI_FSA_NBK) index(feed I_FI_PROCSTATUSID)*/
feed.feed_item_id,feed.feed_schema_id feed_schema_id,sch.vendor_code,
attr.attribute_value vendor_product_id
from
MATCHING_PROD_USER.feed_items feed,
MATCHING_PROD_USER.feed_schema sch,
MATCHING_PROD_USER.feed_string_attributes attr
where
feed.FEED_SCHEMA_ID=sch.feed_schema_id
and feed.FEED_ITEM_ID = attr.FEED_ITEM_ID
and attr.JOYO_ATTRIBUTE_ID=1
and feed.process_status_id =1
and rownum<50


49 rows selected.

Elapsed: 00:00:00.02

Execution Plan
----------------------------------------------------------
Plan hash value: 1653673368

----------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 49 | 2058 | 98 (0)| 00:00:02 |
|* 1 | COUNT STOPKEY | | | | | |
| 2 | TABLE ACCESS BY INDEX ROWID | FEED_STRING_ATTRIBUTES | 2 | 44 | 3 (0)| 00:00:01 |
| 3 | NESTED LOOPS | | 50 | 2100 | 98 (0)| 00:00:02 |
| 4 | NESTED LOOPS | | 31 | 620 | 9 (0)| 00:00:01 |
| 5 | TABLE ACCESS FULL | FEED_SCHEMA | 3 | 24 | 4 (0)| 00:00:01 |
|* 6 | TABLE ACCESS BY INDEX ROWID| FEED_ITEMS | 31 | 372 | 5 (0)| 00:00:01 |
|* 7 | INDEX RANGE SCAN | I_FI_PROCSTATUSID | 93 | | 2 (0)| 00:00:01 |
|* 8 | INDEX RANGE SCAN | UI_FSA_NBK | 1 | | 2 (0)| 00:00:01 |
----------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - filter(ROWNUM<50)
6 - filter("FEED"."FEED_SCHEMA_ID"="SCH"."FEED_SCHEMA_ID")
7 - access("FEED"."PROCESS_STATUS_ID"=1)
8 - access("FEED"."FEED_ITEM_ID"="ATTR"."FEED_ITEM_ID" AND "ATTR"."JOYO_ATTRIBUTE_ID"=1)


Statistics
----------------------------------------------------------
113 recursive calls
0 db block gets
307 consistent gets
0 physical reads
3164 redo size
2504 bytes sent via SQL*Net to client
418 bytes received via SQL*Net from client
5 SQL*Net roundtrips to/from client
3 sorts (memory)
0 sorts (disk)
49 rows processed

zhouwf0726 发表于:2008.01.22 16:06 ::分类: ( oracle性能调整 ) ::阅读:(409次) :: 评论 (0) :: 引用 (0)

发表评论
标题

在此添加评论

称呼

邮箱地址(可选)

个人主页(可选)

authimage