问题描述
嗨。
我们有一个每天晚上运行的过程,它开始变慢,我们需要一些帮助来找到分析问题的资源。
在我们的设置中,不幸的是,事务模式和仓储 (统计) 模式都保存在同一数据库中。这是因为我们没有很多许可证。
我们有一个统计使用的表,它有163列和大约2300万条记录。如果我们有许可选项,这张表可能会在年份进行分区,但我们没有。
该表具有6个不同的索引 (所有索引都没有唯一索引),它们用于统计选择的目的不同。
每天晚上,statistics都会运行pl/sql代码,在此过程中,删除表上的所有索引,从表中删除最近3年,然后用最近3年的新数据填充它,最后再次创建索引。
我们试图用一个具体化的视图来做到这一点,但它必须沉重地运行 (有时需要超过24小时来刷新)。
完成此操作后,将最后3年导出到文件中。为此,我们在一个接一个地运行的3个docker实例中使用SQLCL。
在年初,2017和2018的出口大约需要6-7分钟,2019大约需要1分钟 (数据不多)。在第二季度,2018文件开始花费更长的时间,大约22分钟 (没有变大,只是数据的微小变化),而2017保持不变。2019的时间也增加了,但是如果有更多的数据,这将是正常的。
在这一年的后期,所有时间都增加了,昨天我们有以下时间。2017: 31,2018: 46,2017: 14.
我还作为一个测试每年的计数 (这是非常相似的大小,2019是最小的),这给了我以下结果: 2019: 950秒,2018: 850秒,2017: 350秒,2016: 180秒,2017: 180秒。对整个表进行计数需要85秒。
当我使用explain plan或autotrace时,我似乎没有找到任何表明任何问题的东西。同样,我们没有调优和诊断许可证,因此我无法使用它。我也尝试过检查lonoops的过程,但是似乎没有什么不寻常的。
我还能在数据库中找到什么可能是问题的信息,还有一些简单的解决方案我可以做。
我需要对索引做些什么吗?我认为,当删除索引并重新创建索引时,它将在过程中自动进行分析。是否可能需要在表上 (或索引) 进行重建。
我还想知道是否可以在我们为导出运行的3个脚本中的搜索条件上放置位图索引。用作谓词的列只有4个,每个列的唯一值少于20个。
我希望这是可以理解的,我真的希望你能帮助我。
问候,
英格蒙杜尔
我们有一个每天晚上运行的过程,它开始变慢,我们需要一些帮助来找到分析问题的资源。
在我们的设置中,不幸的是,事务模式和仓储 (统计) 模式都保存在同一数据库中。这是因为我们没有很多许可证。
我们有一个统计使用的表,它有163列和大约2300万条记录。如果我们有许可选项,这张表可能会在年份进行分区,但我们没有。
该表具有6个不同的索引 (所有索引都没有唯一索引),它们用于统计选择的目的不同。
每天晚上,statistics都会运行pl/sql代码,在此过程中,删除表上的所有索引,从表中删除最近3年,然后用最近3年的新数据填充它,最后再次创建索引。
我们试图用一个具体化的视图来做到这一点,但它必须沉重地运行 (有时需要超过24小时来刷新)。
完成此操作后,将最后3年导出到文件中。为此,我们在一个接一个地运行的3个docker实例中使用SQLCL。
在年初,2017和2018的出口大约需要6-7分钟,2019大约需要1分钟 (数据不多)。在第二季度,2018文件开始花费更长的时间,大约22分钟 (没有变大,只是数据的微小变化),而2017保持不变。2019的时间也增加了,但是如果有更多的数据,这将是正常的。
在这一年的后期,所有时间都增加了,昨天我们有以下时间。2017: 31,2018: 46,2017: 14.
我还作为一个测试每年的计数 (这是非常相似的大小,2019是最小的),这给了我以下结果: 2019: 950秒,2018: 850秒,2017: 350秒,2016: 180秒,2017: 180秒。对整个表进行计数需要85秒。
当我使用explain plan或autotrace时,我似乎没有找到任何表明任何问题的东西。同样,我们没有调优和诊断许可证,因此我无法使用它。我也尝试过检查lonoops的过程,但是似乎没有什么不寻常的。
我还能在数据库中找到什么可能是问题的信息,还有一些简单的解决方案我可以做。
我需要对索引做些什么吗?我认为,当删除索引并重新创建索引时,它将在过程中自动进行分析。是否可能需要在表上 (或索引) 进行重建。
我还想知道是否可以在我们为导出运行的3个脚本中的搜索条件上放置位图索引。用作谓词的列只有4个,每个列的唯一值少于20个。
我希望这是可以理解的,我真的希望你能帮助我。
问候,
英格蒙杜尔
专家解答
谢谢你的耐心。
最好的方法是跟踪过程,以便您/我们可以准确地看到时间的丢失。这样做的方法是使用dbms_monitor。让我们说你的过程看起来像这样:
Plsql_prox1;
Plsql_pror2;
plsql_proc3;
这些过程表明您正在进行的业务处理的每个主要部分。然后,您将调整为:
dbms_monitor.session_trace_enable (等待 =>true);
更改会话集tracefile_identifier = stage1;
Plsql_prox1;
更改会话集tracefile_identifier = stage2;
Plsql_pror2;
更改会话集tracefile_identifier = stage3;
plsql_proc3;
数据库管理 _ 监视器.会话 _ 跟踪 _ 禁用
然后,您将获得每个主要部分的跟踪文件。把这些扔进tkprof,看看你的时间在哪里丢失。这将让你缩小到你需要集中精力的地方。
最好的方法是跟踪过程,以便您/我们可以准确地看到时间的丢失。这样做的方法是使用dbms_monitor。让我们说你的过程看起来像这样:
Plsql_prox1;
Plsql_pror2;
plsql_proc3;
这些过程表明您正在进行的业务处理的每个主要部分。然后,您将调整为:
dbms_monitor.session_trace_enable (等待 =>true);
更改会话集tracefile_identifier = stage1;
Plsql_prox1;
更改会话集tracefile_identifier = stage2;
Plsql_pror2;
更改会话集tracefile_identifier = stage3;
plsql_proc3;
数据库管理 _ 监视器.会话 _ 跟踪 _ 禁用
然后,您将获得每个主要部分的跟踪文件。把这些扔进tkprof,看看你的时间在哪里丢失。这将让你缩小到你需要集中精力的地方。
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




