Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 建议提高查询性能(Oracle)_Sql_Performance_Oracle11g - Fatal编程技术网

Sql 建议提高查询性能(Oracle)

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

我有一个表(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 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