如何描述关系数据库中的性能问题?

我有一个关系数据库中运行的查询不符合用户的期望。

我应该提供哪些信息以及应该避免哪些信息,以便在本网站上获得有效的帮助?

对于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量值和大量稀有值)。 你定义直方图吗?

还要别的吗?

当然,这只是基础知识,还可能需要其他信息,例如系统统计信息或优化器参数。 但是再次尝试提供(你)能够识别问题的最小信息。 根据要求发布更多信息。

祝你好运!