如何描述关系数据库中的性能问题?
How to describe performance issue in relational database?
我在 关系数据库 中有一个查询 运行 不符合用户的期望。
我应该提供什么信息,我应该避免什么,这样我才能在这个网站上得到有效的帮助?
对于 Oracle 数据库 提供以下信息:
描述问题的症状
描述导致问题的行为。是查询的行为 stable 还是只出现问题
有时,具有特定参数或简单随机。您能否在 IDE(例如 SQL 开发人员)中重现此行为?
描述环境
定义 Oracle 的确切版本
select * from v$version
描述你如何连接到数据库:驱动程序、ORM、编程语言。提供名称 and/or 版本号。
描述查询
Post 查询文本。尝试简化 - 展示一个 最小的可重现示例 .
示例 - 您有问题的查询加入了 10 tables。检查您是否在具有 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'));
显示完整的结果(不仅是带有执行计划的table)。
极其重要的可能是谓词部分和下面的注释。
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 / DUAL@SEL
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
.
的数据库缓存中提取计划
SELECT t.* FROM table(DBMS_XPLAN.DISPLAY_CURSOR('<SQL_ID>',null,'ALL')) t;
当前正在 运行ning(或即将 运行ning 且仍在缓存中)的查询的 SQL_ID 可以通过以下方式找到
文本匹配 and/or 数据库用户:
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 许可证,您可以从那里获得执行计划,即使是查询 运行ning 在历史记录中也是如此。
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>%')
描述数据
显示 table 的 DDL 和那些 table 上的索引。
提及最近是否收集了优化器统计信息并显示使用的 dbms_stats
gather 语句。
对于关键 table(s),请提供有关段大小、行号、分区的信息...
对于访问或连接中使用的列,请提供有关不同值数量的信息。
这些值是均匀分布还是偏斜(例如,少量值经常出现而大量值出现
稀有值)。
你定义直方图吗?
还有什么吗?
当然这只是基础知识,可能还需要其他信息,例如系统统计信息或优化器参数。
但是再次尝试提供(你的东西)可以识别问题的最少信息。
Post 根据要求提供更多信息。
祝你好运!
我在 关系数据库 中有一个查询 运行 不符合用户的期望。
我应该提供什么信息,我应该避免什么,这样我才能在这个网站上得到有效的帮助?
对于 Oracle 数据库 提供以下信息:
描述问题的症状
描述导致问题的行为。是查询的行为 stable 还是只出现问题 有时,具有特定参数或简单随机。您能否在 IDE(例如 SQL 开发人员)中重现此行为?
描述环境
定义 Oracle 的确切版本
select * from v$version
描述你如何连接到数据库:驱动程序、ORM、编程语言。提供名称 and/or 版本号。
描述查询
Post 查询文本。尝试简化 - 展示一个 最小的可重现示例 .
示例 - 您有问题的查询加入了 10 tables。检查您是否在具有 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'));
显示完整的结果(不仅是带有执行计划的table)。 极其重要的可能是谓词部分和下面的注释。
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 / DUAL@SEL
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
.
SELECT t.* FROM table(DBMS_XPLAN.DISPLAY_CURSOR('<SQL_ID>',null,'ALL')) t;
当前正在 运行ning(或即将 运行ning 且仍在缓存中)的查询的 SQL_ID 可以通过以下方式找到 文本匹配 and/or 数据库用户:
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 许可证,您可以从那里获得执行计划,即使是查询 运行ning 在历史记录中也是如此。
SELECT t.*
FROM table(DBMS_XPLAN.DISPLAY_AWR('10u2rj016s96k' )) t;
可以使用
找到SQL_IDselect sql_id, sql_text
from dba_hist_sqltext a
where lower(sql_text) like lower('%<some identifying part of the query text>%')
描述数据
显示 table 的 DDL 和那些 table 上的索引。
提及最近是否收集了优化器统计信息并显示使用的 dbms_stats
gather 语句。
对于关键 table(s),请提供有关段大小、行号、分区的信息...
对于访问或连接中使用的列,请提供有关不同值数量的信息。 这些值是均匀分布还是偏斜(例如,少量值经常出现而大量值出现 稀有值)。 你定义直方图吗?
还有什么吗?
当然这只是基础知识,可能还需要其他信息,例如系统统计信息或优化器参数。 但是再次尝试提供(你的东西)可以识别问题的最少信息。 Post 根据要求提供更多信息。
祝你好运!