161.Oracle数据库SQL开发之 SQL优化——比较执行查询的成本

论坛 期权论坛 脚本     
匿名技术用户   2020-12-29 22:23   1001   0

161.Oracle数据库SQL开发之 SQL优化——比较执行查询的成本

欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/50186053

ORACLE数据库软件使用一个称为优化器的子系统,生成访问表中存储数据的最有效路径。优化器生成的路径称为执行计划。10g及以上版本自动收集表和索引中数据的统计信息,从而生成最优执行计划;称为基于成本的优化。

1. 检查执行计划

可以使用SQL*Plus EXPLAIN PLAN命令检查执行计划。

EXPLAIN PLAN命令使用SQL语句的执行计划填充表plan_table,称为计划表。

执行如下:

store@PDB1> desc plan_table;

Name Null? Type

------------------------------------------------------------- ------------------------------------

STATEMENT_ID VARCHAR2(30)

PLAN_ID NUMBER

TIMESTAMP DATE

REMARKS VARCHAR2(4000)

OPERATION VARCHAR2(30)

OPTIONS VARCHAR2(255)

OBJECT_NODE VARCHAR2(128)

OBJECT_OWNER VARCHAR2(128)

OBJECT_NAME VARCHAR2(128)

OBJECT_ALIAS VARCHAR2(261)

OBJECT_INSTANCE NUMBER(38)

OBJECT_TYPE VARCHAR2(30)

OPTIMIZER VARCHAR2(255)

SEARCH_COLUMNS NUMBER

ID NUMBER(38)

PARENT_ID NUMBER(38)

DEPTH NUMBER(38)

POSITION NUMBER(38)

COST NUMBER(38)

CARDINALITY NUMBER(38)

BYTES NUMBER(38)

OTHER_TAG VARCHAR2(255)

PARTITION_START VARCHAR2(255)

PARTITION_STOP VARCHAR2(255)

PARTITION_ID NUMBER(38)

OTHER LONG

OTHER_XML CLOB

DISTRIBUTION VARCHAR2(30)

CPU_COST NUMBER(38)

IO_COST NUMBER(38)

TEMP_SPACE NUMBER(38)

ACCESS_PREDICATES VARCHAR2(4000)

FILTER_PREDICATES VARCHAR2(4000)

PROJECTION VARCHAR2(4000)

TIME NUMBER(38)

QBLOCK_NAME VARCHAR2(30)

如果不存在该计划表,执行utlxplan.sql

在$ORACLE_HOME/rdbms/admin/中。

生成执行计划语法如下:

store@PDB1> explain plan setstatement_id='customers' for select customer_id,first_name,last_name fromcustomers;

Explained.

查询计划表使用explain_plan.sql脚本如下:

UNDEFINE v_statement_id;

SELECT

id ||

DECODE(id, 0,'', LPAD(' ', 2*(level - 1))) || ' ' ||

operation ||' ' ||

options || '' ||

object_name|| ' ' ||

object_type|| ' ' ||

DECODE(cost,NULL, '', 'Cost = ' || position)

AS execution_plan

FROM plan_table

CONNECT BY PRIOR id = parent_id

AND statement_id = '&&v_statement_id'

START WITH id = 0

AND statement_id = '&v_statement_id';

查询如下:

store@PDB1> @explain_plan.sql

Enter value for v_statement_id: customers

old 12: AND statement_id = '&&v_statement_id'

new 12: AND statement_id = 'customers'

old 14: AND statement_id = '&v_statement_id'

new 14:AND statement_id = 'customers'

EXECUTION_PLAN

----------------------------------------------------------------------------------------------------

0 SELECT STATEMENT Cost = 3

1 TABLE ACCESS FULL CUSTOMERSTABLE Cost = 1

表连接的执行计划如下:

store@PDB1> explain plan setstatement_id='products' for

selectp.name,pt.name from products p,product_types pt where p.product_type_id =pt.product_type_id;

Explained.

查询如下:

store@PDB1> @explain_plan.sql

Enter value for v_statement_id: products

old 12: AND statement_id = '&&v_statement_id'

new 12: AND statement_id = 'products'

old 14: AND statement_id = '&v_statement_id'

new 14: AND statement_id = 'products'

EXECUTION_PLAN

----------------------------------------------------------------------------------------------------

0 SELECT STATEMENT Cost = 6

1 HASH JOIN Cost = 1

2 TABLE ACCESS FULL PRODUCT_TYPES TABLE Cost = 1

3 TABLE ACCESS FULL PRODUCTS TABLE Cost = 2

收集表统计信息:

使用10g之前的数据库版本,必须使用ANALYZE命令收集表统计信息。

例如:

store@PDB1> analyze table products computestatistics;

Table analyzed.

store@PDB1> analyze table product_types computestatistics;

Table analyzed.

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP