Sql 建议提高查询性能(Oracle)
我有一个表(a),有116317979条记录,每天大约有750000条记录在增长 根据我的要求,我希望使用日期列(日期时间存储在列中)有效地从表中获取最近3天的完整数据。因此,查询将是Sql 建议提高查询性能(Oracle),sql,performance,oracle11g,Sql,Performance,Oracle11g,我有一个表(a),有116317979条记录,每天大约有750000条记录在增长 根据我的要求,我希望使用日期列(日期时间存储在列中)有效地从表中获取最近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 an
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(X、Y、Z、M、N)的唯一索引和主键
表A(ID)的唯一索引和主键
表A上的建议IDX 1(日期\u列) 表A(X,Y,Z)中的建议IDX 2 通过在A.date_列中添加索引,我认为可以显著提高性能,但我的测试结果是否定的。除了添加新的索引之外,还有什么其他提示可以提高性能吗?从长远来看,添加这样的索引有什么害处吗 或 最好创建另一个表,并以某种方式在其中填充最近3天的数据(使用db触发器)。我可以很容易地使用另一个进程来清除每晚超过3天的数据
提前感谢。您应该检查执行计划,看看是否正在使用索引。我猜没有使用
date\u列上的索引,32秒和34秒之间的差异只是噪音
对于这个查询,我建议在A(date\u列,X,Y,Z)
上建立索引
添加索引是否有害?好吧,它们增加了insert
s/update
s/delete
s的开销。如果插入是事务性的,那么每秒插入大约10行——不包括更新和删除。如果您的峰值明显高于此值,并且您的硬件不是很好,那么索引可能会减慢速度。如果分批添加额外的行,我就不会担心开销
我怀疑把这张桌子分成一张单独的三天桌子会有多大的不同。但为什么要听我说?试试看。取最后3天以上的数据,将其转储到一个表中,对其进行适当的索引,然后查看查询是否更快。您应该检查执行计划,查看是否正在使用索引。我猜没有使用date\u列上的索引,32秒和34秒之间的差异只是噪音
对于这个查询,我建议在A(date\u列,X,Y,Z)
上建立索引
添加索引是否有害?好吧,它们增加了insert
s/update
s/delete
s的开销。如果插入是事务性的,那么每秒插入大约10行——不包括更新和删除。如果您的峰值明显高于此值,并且您的硬件不是很好,那么索引可能会减慢速度。如果分批添加额外的行,我就不会担心开销
我怀疑把这张桌子分成一张单独的三天桌子会有多大的不同。但为什么要听我说?试试看。取最后3天以上的数据,将其转储到一个表中,对其进行适当的索引,并查看查询是否更快。Oracle分区在这里是有意义的,但即使对于Enterprise Edition,这也是一个额外的成本选项。
在分区不可用的情况下,保留最后3天的单独表应该是性能最好的。你应该试试看
如果你想从索引中获得最大值,那么你可以考虑在物理参数上玩一点:
- 如果日期列未更新且数据很少删除,则可以设置
PCTFREE 0
- 查看最后的查询,我建议在trunc(date)列上创建一个索引,并使用compression->在本例中,每个索引数据块存储更多的条目。在这种情况下,最终查询条件应该是
trunc(date\u column)>=trunc(sysdate)-3
根据表A中X、Y、Z的选择性,压缩它们也是有意义的。因此,我建议检查两种情况:
在(trunc(date\u列))pctfree 0压缩上创建索引trunc\u date\u ai代码>+您的IDX2
在(trunc(date\u列),X,Y,Z)pctfree 0压缩上创建索引trunc\u date\u ai代码>
如果表A中的X、Y、Z未更新,则应使用pctfree 0
。
compress
关键字此处对所有4列进行压缩,因此,如果表A中的X、Y、Z值对于特定的trunc(date\u列)高度可重复,则值得使用
要强制使用索引,可以提示查询,例如:
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
Oracle分区在这里是有意义的,但即使对于Enterprise Edition,这也是一个额外的成本选项。
在分区不可用的情况下,保留最后3天的单独表应该是性能最好的。你应该试试看
如果你想从索引中获得最大值,那么你可以考虑在物理参数上玩一点:
- 如果日期列未更新且数据很少删除,则可以设置
PCTFREE 0
- 查看最后的查询,我建议在trunc(date)列上创建一个索引,并使用compression->在本例中,每个索引数据块存储更多的条目。在这种情况下,最终查询条件应该是
trunc(date\u column)>=trunc(sysdate)-3
根据表A中X、Y、Z的选择性,压缩它们也是有意义的。因此,我建议检查两种情况:
在(trunc(date\u列))pctfree 0压缩上创建索引trunc\u date\u ai代码>+您的IDX2
在(trunc(date\u列),X,Y,Z)pctfree 0压缩上创建索引trunc\u date\u ai代码>
如果表A中的X、Y、Z未更新,则应使用pctfree 0
。
compress
关键字此处对所有4列进行压缩,因此,如果表A中的X、Y、Z值对于特定的trunc(date\u列)高度可重复,则值得使用
要强制使用索引,可以提示
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