首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ORACLE数据库性能调优

ORACLE数据库性能调优
EN

Stack Overflow用户
提问于 2012-04-18 19:25:10
回答 2查看 414关注 0票数 0

我们遇到了性能问题,我需要一些建议(我们使用的是Oracle10g R2),情况是这样的

1)它是一个遗留系统。

2)在一些表中,它保存了过去10年的数据(这意味着自从第一个版本推出以来,数据从未被删除过)。现在,在大多数OLTP表中,它们大约有30,000,000 - 40,000,000行。

3)在这些表上的搜索操作只需要5-6分钟的时间。(像select count(0) from xxxxx where isActive=‘Y’这样的简单查询大约需要6分钟。)当我们看到explain计划时,我们发现索引扫描正在isActive列上进行。

4)我们已经建议归档和清除不需要的旧数据,团队正在努力实现这一点。即使我们删除5年的数据,我们在表中只剩下大约15,000,000 - 20,000,000行,这本身就是非常巨大的,所以我们想在这些表上进行表分区,但我们发现用户可以从UI中搜索这些表的大部分列,所以这将违背表分区的真正目的。

那么,需要采取哪些步骤来改善这种情况呢?

EN

回答 2

Stack Overflow用户

发布于 2012-04-18 19:45:35

首先:问一下为什么要在第一个地方发出查询select count(0) from xxxxx where isactive = 'Y'。十次中有九次这是一种懒惰的方式来检查记录的存在。如果您遇到这种情况,只需将其替换为选择1行的查询(rownum =1和一个first_rows提示)。

你提到的行数没什么好担心的。如果您的应用程序在行数增长时性能不佳,那么您的系统就不能伸缩。我会使用SQL*Trace或ASH调查所有耗时过长的查询,并修复它。

顺便说一句:你提到的任何东西都不能证明“遗产”这个词是正确的。

致以敬意,

罗伯。

票数 4
EN

Stack Overflow用户

发布于 2012-04-18 20:01:59

只有几点观察:

  1. 我猜"isActive“列可以有两个值-- 'Y‘和'N’(或者可能是'Y‘、'N’和NULL --尽管我不明白为什么在Fred的名字里这样的列不会有NOT NULL约束)。如果是这种情况,此列上的索引将具有非常差的选择性,没有它可能会更好。尝试删除索引并重新运行有关使用SELECT COUNT(*)的query.
  2. @RobVanWijk's评论非常好。如果确实需要计数,则只要求行计数;如果不需要计数,我发现使用适当的异常处理程序进行直接探测(SELECT whatever FROM wherever WHERE somefield = somevalue)比使用SELECT COUNT(*)更快。在你引用的例子中,我认为像

这样做会更好。

BEGIN

代码语言:javascript
复制
  SELECT IS_ACTIVE
    INTO strIsActive
    FROM MY_TABLE
    WHERE IS_ACTIVE = 'Y';

  bActive_records_found := TRUE;
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    bActive_records_found := FALSE;
  WHEN TOO_MANY_ROWS THEN
    bActive_records_found := TRUE;
END;

  1. to partitioning -如果在所有查询中都使用了字段,则分区可以有效地减少查询时间。例如,如果在TRANSACTION_DATE变量上对一个表进行了分区,那么为了使分区起作用,对该表的所有查询都必须在WHERE子句中进行TRANSACTION_DATE测试。否则,数据库将不得不搜索每个分区以满足查询,因此我怀疑是否会注意到任何改进。

分享和享受。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10208345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档