【问题标题】:Oracle database performance issueOracle 数据库性能问题
【发布时间】:2017-08-03 03:00:55
【问题描述】:

我们正在尝试从 oracle 数据库中提取数据,但性能似乎非常低。

我们有一个大约 1000 万行的表,我们有一个索引,我们通过该索引提取大约 1.3k 行 {select * from tab where indexed_field = 'value'}(简化形式)。

SQuirreL 报告查询“执行:0.182 秒,构建输出:28.921 秒”。返回的数据占用大约 340kB(例如,当复制/粘贴到文本文件时)。

有时构建输出阶段需要更长的时间(>5 分钟),尤其是第一次运行查询时。重复它似乎运行得更快 - 例如上面的 29s 值。这可能只是数据库暂时过载的结果,还是因为缓冲重复数据?

每 50 行 (13kB) 的秒数是合理的数字,还是出乎意料的大? (这不太可能是网络问题。)

如果 dbms 未能利用数据可以物理分组(通过使物理顺序与索引顺序相同)并且每行执行单独的磁盘读取这一事实,dbms 是否有可能,如果是这样,如何它被说服更有效率?

数据没有什么奇怪的——每行 22 列,虽然通常包含几十个字符,但大多定义为 varchar2(250)。我不确定运行 Oracle 的铁件有多大,但它存在于数据中心中,所以可能不会太微不足道。

感谢您的任何想法。

【问题讨论】:

  • 您是否尝试过将获取大小设置得更大,例如 500 左右?我认为对于 SQuirreL,它位于 File -> New Session properties -> General 之类的地方。在另一个故障排除说明中,如果您不选择任何列,查询速度会如何?例如select 1 from tab where indexed_field = 'value'
  • 性能调优关乎细节——数据量和偏斜、分布、索引、统计等。这个问题太笼统了,无法回答。

标签: oracle


【解决方案1】:

kfinity>您是否尝试过将您的 fetch size 设置得更大,比如 500 左右?

就是这个!将其加速一个数量级。 2.5s 1.3k 行,19s 9.5k 行。谢谢你的建议。

顺便说一句,执行 select 1 只能提供大约 10% 的加速,我猜这表明磁盘访问不是瓶颈。

其他> 获取计划是:

    Operation           Options                   Object        Mode        Cost    Bytes   Cardinality
0   SELECT STATEMENT                                            ALL_ROWS    6       17544   86
1   TABLE ACCESS        BY INDEX ROWID BATCHED    TAB           ANALYZED    6       17544   86
2   INDEX               RANGE SCAN                TAB_IDX       ANALYZED    3               86

根据我的有限理解,看起来不错。

“sho 参数”的东西不起作用(SQL 错误),除了给出的选择:

Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
PL/SQL Release 12.1.0.2.0 - Production
CORE    12.1.0.2.0  Production
TNS for Linux: Version 12.1.0.2.0 - Production
NLSRTL Version 12.1.0.2.0 - Production

我想唯一悬而未决的问题是“将获取大小设置为较大的值有什么缺点?”。鉴于我们最终将始终阅读整个结果集(除非有例外),我的猜测是“不多”。对吗?

无论如何,非常感谢那些回复并非常感谢解决方案的人。

【讨论】:

    【解决方案2】:

    对于 oracle 来说,10M 行的表上的 1.3k 行并不算大。

    第二个结果比第一个结果快的原因是 oracle 在第一个查询时将数据加载到 RAM 中,然后在第二个查询时从 RAM 中读取它。

    您确定索引使用得很好吗?或许你可以做一个解释计划并告诉我们结果?

    【讨论】:

      【解决方案3】:

      需要立即采取的行动是:

      1. 重建表上的索引。
      2. 收集表格上的统计数据。
      3. 在重新运行查询之前执行以下操作以提取执行计划。

        sql> 设置自动跟踪 traceonly 启用 ;

      通过以下方式关闭此功能:

      sql> set autotrace off ;
      

      另外,提供以下结果:

      sql> sho parameter SGA 
      sql> sho parameter cursor
      sql> select banner from v$version;
      
      • 阿比

      【讨论】:

        猜你喜欢
        • 2013-06-15
        • 1970-01-01
        • 1970-01-01
        • 2022-01-03
        • 1970-01-01
        • 1970-01-01
        • 2012-11-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多