For 甲骨文数据库提供以下信息:
描述问题的症状
描述导致问题的行为。查询的行为是否稳定或者问题是否仅发生
有时,具有特定参数或简单随机。您可以在 IDE(例如 SQL Developer)中重现此行为吗?
描述环境
定义 Oracle 的确切版本
select * from v$version
描述如何连接到数据库:驱动程序、ORM、编程语言。提供名称和/或版本号。
描述查询
发布查询文本。尝试简化 - 显示最小可重复示例.
示例 - 您有问题的查询连接了 10 个表。检查在具有 9 个或 8 个联接的查询中是否看到相同的症状。
逐步退出,直到看到问题并仅显示简化的查询。
是的,这很昂贵,但它大大增加了您获得支持的机会!查询越小,吸引的程度就越高
支持者。
描述执行计划
要获取执行计划,请运行此语句(替换您的查询文本)
EXPLAIN PLAN SET STATEMENT_ID = '<some_id>' into plan_table FOR
select * from .... -- your query here
;
执行计划存储在PLAN_TABLE
,查看它运行此查询
SELECT * FROM table(DBMS_XPLAN.DISPLAY('plan_table', '<some_id>','ALL'));
显示完整结果(不仅仅是带有执行计划的表)。
极其重要的可能是谓词部分和下面的注释。
示例select * from dual where dummy = :1;
Plan hash value: 272002086
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 2 | 2 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| DUAL | 1 | 2 | 2 (0)| 00:00:01 |
--------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL$1 / DUAL@SEL$1
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("DUMMY"=:1)
Column Projection Information (identified by operation id):
-----------------------------------------------------------
1 - "DUMMY"[VARCHAR2,1]
不要剪切和粘贴图形结果您的 IDE 解释计划。
这个执行计划是真正执行的执行计划吗?
不幸的是并非总是如此。有几个原因解释了执行计划可能与真品不同 http://tkyte.blogspot.co.at/2007/04/when-explanation-doesn-sound-quite.html.
如果您有疑问(特别是当您看到一个好的计划,但查询运行不佳时),您可能会
从数据库缓存中提取计划,提供SQL_ID
.
SELECT t.* FROM table(DBMS_XPLAN.DISPLAY_CURSOR('<SQL_ID>',null,'ALL')) t;
当前正在运行(或运行不久且仍被缓存)的查询的 SQL_ID 可以通过以下方式找到
文本匹配和/或数据库用户:
select sql_id, sql_fulltext from v$sql a where
lower(sql_text) like lower('%<some identifying part of the query text>%')
and parsing_schema_name = '<user running the query>';
如果您有 AWR 许可证,您可以从那里获取执行计划,即使对于历史中运行的查询也是如此。
SELECT t.*
FROM table(DBMS_XPLAN.DISPLAY_AWR('10u2rj016s96k' )) t;
可以使用以下命令找到 SQL_ID
select sql_id, sql_text
from dba_hist_sqltext a
where lower(sql_text) like lower('%<some identifying part of the query text>%')
描述数据
显示表的 DDL 以及这些表上的索引。
提及最近是否收集了优化器统计信息并显示已使用的dbms_stats
收集声明。
对于关键表,提供有关段大小、行数、分区等的信息...
对于访问或联接中使用的列,提供有关不同值数量的信息。
这些值是均匀分布的还是倾斜的(例如,经常出现的少量值和大量出现的值)
具有稀有价值)。
您定义直方图吗?
还要别的吗?
当然,这只是基础知识,可能仍然需要其他信息,例如系统统计数据或优化器参数。
但再次尝试提供(你的)可以识别问题的最少信息。
根据要求发布更多信息。
祝你好运!