繁体   English   中英

建议提高查询性能(Oracle)

[英]Advise to improve Query Performance (Oracle)

我有一张表(A),其中有116,317,979条记录,并且每天在增长,大约每天750,000条记录。

根据我的要求,我想使用日期列(日期时间存储在该列中)从表中有效地获取最近3天的数据。 所以查询将是

select * from A where date_column >= trunc(sysdate) - 3

我还需要将表A与表B连接起来,这样

select * from A 
left outer join B 
on A.X = B.X and A.Y = B.Y and A.Z = B.Z and B.M = 'XYZ' and B.N = 'UIM'
where A.date_column >= trunc(sysdate) - 3

表B的唯一索引和PK(X,Y,Z,M,N)

表A的唯一索引和PK(ID)


表A上建议的IDX 1(date_column)

表A(X,Y,Z)上建议的IDX 2

Time without Indexes 34 sec
Time with IDX 1      32 sec
Time with IDX 1 & 2  27 sec //Sorry about the mistype

通过仅在A.date_column上添加索引,我认为我可以显着提高性能,但是我的测试结果为负。 除了添加新索引之外,还有其他提示可用来提高性能吗? 从长远来看,添加这样的索引是否有任何危害。

要么

最好创建另一个表,并以某种方式实时填充最后3天的数据(使用db触发器)。 我可以轻松地通过另一个过程清除每晚3天以上的数据。

提前致谢。

Oracle分区在这里很有意义,但这是一个额外的成本选择,即使对于企业版也是如此。 如果无法进行分区-保留最近3天的单独表应该是性能最好的。 你应该试试看。

如果要从索引中获取最大收益,则可以考虑使用物理参数:

  • 如果日期列未更新且数据很少删除,则可以将PCTFREE 0设置为PCTFREE 0
  • 查看您的最终查询,我建议在trunc(date)列上创建索引并使用compression->,在这种情况下,每个索引数据块都存储更多条目。 在这种情况下,最终查询条件应为trunc(date_column) >= trunc(sysdate) - 3

根据表A中X,Y,Z的选择性,也可以压缩它们。 因此,我建议检查两种情况:

  1. create index trunc_date_ai on A(trunc(date_column)) pctfree 0 compress; +您的IDX2
  2. create index trunc_date_ai on A(trunc(date_column),X,Y,Z) pctfree 0 compress; pctfree 0应的情况下,X可以使用,Y,Z不更新在表A. compress关键字这里使压缩所有4列,所以它利用是值得如果X,Y,Z值在特定TRUNC表A中高度可重复(date_column)。

要强制使用索引,您可以提示查询,例如:

select --+ index (A trunc_date_ai)
       * 
from   A left outer join B 
on A.X = B.X and A.Y = B.Y and A.Z = B.Z and B.M = 'XYZ' and B.N = 'UIM'
where trunc(A.date_column) >= trunc(sysdate) - 3

您应该检查执行计划,以查看是否正在使用索引。 我猜想没有使用date_column上的索引,并且32和34秒之间的区别只是噪音。

我建议为此查询在A(date_column, X, Y, Z)上建立索引。

添加索引是否有害? 好吧,它们增加了insert s / update s / delete的开销。 如果插入是事务性的,则每秒插入约10行-不包括更新和删除。 如果您的峰值明显高于该峰值, 并且您的硬件不是很好,那么索引可能会使速度变慢。 如果将其他行分批添加,则不必担心开销。

我怀疑将表格分成一个单独的3天表格是否会带来很大的不同。 但是为什么要听我的话? 试试看。 提取最后3天以上的数据,将其转储到表中,对其进行正确索引,然后查看查询是否更快。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM