AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-3336

Jon Heller's questions

Martin Hope
Jon Heller
Asked: 2015-10-20 07:57:00 +0800 CST

重新创建固定视图

  • 1

是否可以重新创建 Oracle 固定视图?我遇到 GV$ACTIVE_SESSION_HISTORY 的性能问题,可能需要重建视图。

select * from gv$active_session_history;由于错误的执行计划,一个简单的永远运行。这只发生在我们的少数数据库上,可能与以前的 NLS 设置有关。下面的执行计划使用 2 个FIXED TABLE FULL操作,因为NLSSORT谓词阻止使用固定索引:

explain plan for select * from gv$active_session_history;

select * from table(dbms_xplan.display);

Plan hash value: 2432277601

------------------------------------------------------------------------------------------------
| Id  | Operation          | Name                      | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |                           |   136K|   169M|   215 (100)| 00:00:04 |
|   1 |  VIEW              | GV$ACTIVE_SESSION_HISTORY |   136K|   169M|   215 (100)| 00:00:04 |
|   2 |   NESTED LOOPS     |                           |   136K|    62M|   215 (100)| 00:00:04 |
|   3 |    FIXED TABLE FULL| X$KEWASH                  |   136K|  3196K|    72 (100)| 00:00:02 |
|*  4 |    FIXED TABLE FULL| X$ASH                     |     1 |   454 |     0   (0)| 00:00:01 |
------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   4 - filter("S"."SAMPLE_ADDR"="A"."SAMPLE_ADDR" AND "S"."SAMPLE_ID"="A"."SAMPLE_ID" 
              AND "S"."SAMPLE_TIME"="A"."SAMPLE_TIME" AND 
              NLSSORT("S"."NEED_AWR_SAMPLE",'nls_sort=''BINARY_CI''')=NLSSORT("A"."NEED_AWR_SAMPLE",'n
              ls_sort=''BINARY_CI'''))

为了比较,这里有一个很好的执行计划,适用于我们 99% 的数据库:

Plan hash value: 436940376

-------------------------------------------------------------------------------------------------------
| Id  | Operation                 | Name                      | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT          |                           |   100 |   127K|     0   (0)| 00:00:01 |
|   1 |  VIEW                     | GV$ACTIVE_SESSION_HISTORY |   100 |   127K|     0   (0)| 00:00:01 |
|   2 |   NESTED LOOPS            |                           |   100 |   131K|     0   (0)| 00:00:01 |
|   3 |    FIXED TABLE FULL       | X$KEWASH                  |   100 |  5200 |     0   (0)| 00:00:01 |
|*  4 |    FIXED TABLE FIXED INDEX| X$ASH (ind:1)             |     1 |  1299 |     0   (0)| 00:00:01 |
-------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   4 - filter("S"."SAMPLE_ADDR"="A"."SAMPLE_ADDR" AND "S"."SAMPLE_ID"="A"."SAMPLE_ID" AND 
              "S"."SAMPLE_TIME"="A"."SAMPLE_TIME" AND "S"."NEED_AWR_SAMPLE"="A"."NEED_AWR_SAMPLE")

这是我尝试过的方法,以及不起作用的解决方法:

  1. 提示和计划管理功能。 一次修复一个查询是不够的。这个固定视图在太多的系统查询中使用,我不想全部修改。例如,我可以用这样的提示修复我的示例:select /*+ use_hash(@"SEL$3" "A"@"SEL$3") */ * from gv$active_session_history order by sample_time desc;。但我无法更改使用 GV$* 的系统查询,而且我不想管理每个单独的查询。
  2. 收集统计数据。 “Rows = 1”表示统计数据不佳,但我已经尝试收集统计数据但无济于事。
  3. 伪造统计数据。 即使在将表行设置得高得离谱并将列设置得非常低之后,我也无法计划使用散列连接。即使优化器认为连接返回千万亿行,它仍然使用带有两次全表扫描的嵌套循环。
  4. 更改 NLS 设置。 起初,这看起来像是典型的语言排序忽略索引问题。但是 nls_sort 和 nls_comp 都设置为 BINARY。当我在会话级别更改 nls_comp 和 nls_sort 时,谓词有 2 个 NLSSORT 函数:

    alter session set nls_comp='LINGUISTIC';
    alter session set nls_sort='BINARY_CI';
    explain plan for select * from gv$active_session_history where sql_id = '7f7bap53hb12w';
    select * from table(dbms_xplan.display);
    
    ...
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       4 - filter(NLSSORT("A"."SQL_ID",'nls_sort=''BINARY_CI''')=HEXTORAW('37663762617035336
                  86231327700')  AND "S"."SAMPLE_ADDR"="A"."SAMPLE_ADDR" AND 
                  "S"."SAMPLE_ID"="A"."SAMPLE_ID" AND "S"."SAMPLE_TIME"="A"."SAMPLE_TIME" AND 
                  NLSSORT("S"."NEED_AWR_SAMPLE",'nls_sort=''BINARY_CI''')=NLSSORT("A"."NEED_AWR_SAMPLE",'n
                  ls_sort=''BINARY_CI'''))
    

    当我将它们设置回 BINARY 时,其中一个 NLSSORT 消失了,但一个仍然存在,阻止了索引:

    alter session set nls_comp='BINARY';
    alter session set nls_sort='BINARY';
    explain plan for select * from gv$active_session_history where sql_id = '7f7bap53hb12w';
    select * from table(dbms_xplan.display);
    
    ...
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       4 - filter("A"."SQL_ID"='7f7bap53hb12w' AND "S"."SAMPLE_ADDR"="A"."SAMPLE_ADDR" AND 
                  "S"."SAMPLE_ID"="A"."SAMPLE_ID" AND "S"."SAMPLE_TIME"="A"."SAMPLE_TIME" AND 
                  NLSSORT("S"."NEED_AWR_SAMPLE",'nls_sort=''BINARY_CI''')=NLSSORT("A"."NEED_AWR_SAMPLE",'n
                  ls_sort=''BINARY_CI'''))
    
  5. 找到视图源。 我找不到完整的视图源。它不在 DBA_VIEWS 中,只有前 4000 个字符在 $FIXED_VIEW_DEFINITION 中。我在 $ORACLE_HOME/rdbms/admin/ 中尝试过grep -i v.*active_session_history *,但没有看到任何东西。

  6. 重新编译。 alter view gv$active_session_history compile;抛出 ORA-600。

我在 Solaris 上运行 11.2.0.4。我创建了 Oracle 支持服务请求,但尚未收到答复。

oracle oracle-11g-r2
  • 1 个回答
  • 642 Views
Martin Hope
Jon Heller
Asked: 2015-02-24 10:23:03 +0800 CST

使用 EMCLI 更新 OEM Oracle 主路径

  • 4

是否可以使用企业管理器命令行界面(EMCLI) 更改 Oracle 主路径?

我们最近升级了许多数据库、监听器和 ASM,我想自动化这个过程:

  1. 选择目标
  2. 转到目标设置 --> 监控配置
  3. 更改“Oracle Home Path”,点击下一步,点击提交。

我查看了 EMCLI动词参考,但找不到这样做的方法。

oracle oracle-enterprise-manager
  • 2 个回答
  • 6943 Views
Martin Hope
Jon Heller
Asked: 2014-06-26 12:14:20 +0800 CST

SQLNET.ALLOWED_LOGON_VERSION=12 和 JDBC 瘦客户端

  • 2

要解决密码安全问题,我们需要设置SQLNET.ALLOWED_LOGON_VERSION=12. 根据Oracle 数据库网络服务参考:

请注意将该值设置为 12 的以下含义: ... Oracle 数据库 10g 之前的 OCI 客户端版本和所有版本的 JDBC 瘦客户端无法使用基于密码的身份验证对 Oracle 数据库进行身份验证。

这句话在我看来真的很糟糕。我不想在体面的密码安全性和推荐的 JDBC 驱动程序之间做出选择。

好消息是手册可能有误。我可以连接SQLNET.ALLOWED_LOGON_VERSION=12一个 JDBC 瘦客户端。我确实必须将 ojdbc.jar 从 11.2.0.1.0 升级到 Oracle 11.2.0.3.0,但这是意料之中的,也证明该设置确实对我的服务器产生了影响。

这里发生了什么:

  1. 说明书错了吗?
  2. 我读错手册了吗?
  3. 它是否仅在我的简单测试用例中作为一些未记录的功能起作用,但会因其他配置而失败?

我们有成千上万的用户,有许多不同的配置,我不能仅仅依靠我的简单测试。有没有其他人同时使用SQLNET.ALLOWED_LOGON_VERSION=12JDBC 瘦客户端的经验?

oracle
  • 1 个回答
  • 14700 Views
Martin Hope
Jon Heller
Asked: 2014-03-17 21:05:15 +0800 CST

历史 SQL 监控

  • 3

是否有将实时 SQL 监控扩展到历史活动的内置 Oracle 功能?我对在 SQL操作级别聚合等待事件特别感兴趣,而不仅仅是每个语句。

操作级别信息可在DBA_HIST_ACTIVE_SESS_HISTORY. 许多 AWR 报告都使用该表,但它们中的任何一个都显示操作级别的信息吗?目前我通过加入DBA_HIST_ACTIVE_SESS_HISTORYand来获取这些数据DBMS_XPLAN.DISPLAY_AWR,但似乎应该有一个内置功能来为我做这件事。在我构建自己的工具之前,我想确保其他人尚未构建它。

这个缺失的功能可能听起来有点不便,但使用实际的执行统计数据,甚至是其中的一个样本,会使调优变得容易得多。例如,下面是最近出现的问题的真实 SQL 监控报告,经过修改以适合此处。有了操作级信息,就无需猜测哪个步骤慢,甚至无需检查等待。问题很快就被发现了——索引在大INSERT.

SQL Monitoring Report


SQL Text
------------------------------
<SQL statement...>


Global Information
------------------------------
<metadata like run status, session, sql_id, duration, etc...>

Parallel Execution Details (DOP=64 , Servers Allocated=128)
...

SQL Plan Monitoring Details (Plan Hash Value=2062479242)

=================================================================================
| Id |     Operation          | Activity |          Activity Detail             |
|    |                        |   (%)    |            (# samples)               |
=================================================================================
...
|  1 |   PX COORDINATOR       |     0.19 | enq: KO - fast object checkpoint (21)|
|  2 |    PX SEND QC (RANDOM) |          |                                      |
|  3 |     INDEX MAINTENANCE  |    84.70 | buffer busy waits (2801)             |
|    |                        |          | enq: HW - contention (29)            |
|    |                        |          | enq: TX - allocate ITL entry (25)    |
|    |                        |          | free buffer waits (61734)            |
|    |                        |          | write complete waits (10365)         |
|    |                        |          | Cpu (341)                            |
|    |                        |          | enq: FB - contention (1632)          |
|    |                        |          | enq: TX - contention (53)            |
|    |                        |          | db file sequential read (3717)       |
|    |                        |          | read by other session (641)          |
|  4 |      PX RECEIVE        |     0.02 | Cpu (18)                             |
|    |                        |          | resmgr:cpu quantum (1)               |
...
=================================================================================

还有一些其他方法可以产生类似的信息,例如跟踪/*+ gather_plan_statistics */、 或alter session set statistics_level=all;。但是这些方法只在开发环境中有用。我没有能力重新运行具有不同设置的语句。

oracle
  • 1 个回答
  • 3192 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve