TA的每日心情 | 开心 2021-12-13 21:45 |
---|
签到天数: 15 天 [LV.4]偶尔看看III
|
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.
|
|