如何描述关系数据库中的性能问题?
我有一个关系数据库中运行的查询不符合用户的期望。
我应该提供哪些信息以及应该避免哪些信息,以便在本网站上获得有效的帮助?
对于Oracle数据库提供这些信息:
描述问题的症状
描述导致问题的行为。 查询的行为是稳定的还是仅在有时出现问题,具有特定参数或简单随机。 你可以在IDE(例如SQL Developer)中重现这种行为吗?
描述环境
定义Oracle的确切版本
select * from v$version
描述你如何连接到数据库:驱动程序,ORM,编程语言。 提供名称和/或版本号。
描述查询
发布查询文本。 尽量简化 – 显示一个最小的可重复的例子 。
示例 – 您有问题的查询连接了10个表。 检查是否在具有9或8个连接的查询中看到相同的症状。 下台,直到看到问题,并只显示减less的查询。
是的,这是昂贵的,但是它大大增加了你获得支持的机会! 查询越小,吸引支持者就越高。
描述执行计划
要获得执行计划运行此语句(replace您的查询文本)
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;
例子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解释计划的graphics结果 。
这个执行计划是真正的执行计划吗?
不幸的是不总是。 解释执行计划可能与真实执行计划有所不同 。
如果你怀疑(特别是当你看到一个好的计划,但是查询运行不好),你可以从提供SQL_ID
的DBcaching中提取计划。
SELECT t.* FROM table(DBMS_XPLAN.DISPLAY_CURSOR('<SQL_ID>',null,'ALL')) t;
可以通过文本匹配和/或数据库用户find当前正在运行(或正在运行并且仍然被caching)的查询的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许可证,则可以从那里获得执行计划,即使是在历史logging中运行的查询也是如此。
SELECT t.* FROM table(DBMS_XPLAN.DISPLAY_AWR('10u2rj016s96k' )) t;
SQL_ID可以使用find
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
收集语句。
对于关键表提供关于分段大小,行号,分区的信息…
对于访问或联接中使用的列提供有关不同值的数量的信息。 值是均匀分布还是偏斜的(例如,经常出现的less量值和大量稀有值)。 你定义直方图吗?
还要别的吗?
当然,这只是基础知识,还可能需要其他信息,例如系统统计信息或优化器参数。 但是再次尝试提供(你)能够识别问题的最小信息。 根据要求发布更多信息。
祝你好运!