我们遇到了性能问题,我需要一些建议(我们使用的是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中搜索这些表的大部分列,所以这将违背表分区的真正目的。
那么,需要采取哪些步骤来改善这种情况呢?
发布于 2012-04-18 19:45:35
首先:问一下为什么要在第一个地方发出查询select count(0) from xxxxx where isactive = 'Y'。十次中有九次这是一种懒惰的方式来检查记录的存在。如果您遇到这种情况,只需将其替换为选择1行的查询(rownum =1和一个first_rows提示)。
你提到的行数没什么好担心的。如果您的应用程序在行数增长时性能不佳,那么您的系统就不能伸缩。我会使用SQL*Trace或ASH调查所有耗时过长的查询,并修复它。
顺便说一句:你提到的任何东西都不能证明“遗产”这个词是正确的。
致以敬意,
罗伯。
发布于 2012-04-18 20:01:59
只有几点观察:
SELECT COUNT(*)的query.SELECT whatever FROM wherever WHERE somefield = somevalue)比使用SELECT COUNT(*)更快。在你引用的例子中,我认为像这样做会更好。
BEGIN
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;分享和享受。
https://stackoverflow.com/questions/10208345
复制相似问题