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

标签 oracle performance relational-database query-optimization

我有一个在关系数据库中运行的查询,它不满足用户的期望。

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

最佳答案

对于 Oracle 数据库 提供以下信息:

描述问题的症状

描述导致问题的行为。查询的行为是稳定的还是仅出现问题
有时,带有特定参数或简单随机。您能否在 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解释计划。

这个执行计划是真正被执行的吗?

不幸的是,并非总是如此。解释的执行计划可能有多种原因 differ from the real one .

如果您有疑问(尤其是当您看到一个好的计划,但查询运行不佳时),您可能
从提供 SQL_ID 的 DB 缓存中提取计划.
 SELECT t.* FROM  table(DBMS_XPLAN.DISPLAY_CURSOR('<SQL_ID>',null,'ALL')) t; 

可以使用
文本匹配和/或数据库用户:
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收集声明。

对于关键表,请提供有关段大小、行号、分区等的信息。

对于访问或联接中使用的列,提供有关不同值数量的信息。
值是否均匀分布或偏斜(例如,经常出现的少量值和大量出现的值?
稀有值(value))。
你定义直方图吗?

还要别的吗?

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

祝你好运!

关于oracle - 如何描述关系数据库中的性能问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34975406/

相关文章:

oracle - 在 sql 语句和 callablestatement 中传递密码的安全问题

sql-server - ARX 匿名化工具 - 支持的数据库

.net - 诊断 .Net 生产应用程序中失控的 CPU

node.js - knexjs 使用事务从父/子表中删除行

mysql - 查询3张表,永远持续

java - 我在 CentOS 上安装了 Open JDK 1.7;我安装了 Oracle 的 Java rpm; Oracle Java 似乎不存在

sql - Oracle DB 中复杂的 SELECT 语句

mysql - 与其他实体有随机关系的实体

string - toString.map 和 toString.toArray.map 的性能差异

mysql - 添加外键约束时,哪个方向是最佳实践?