17,137
社区成员
发帖
与我相关
我的任务
分享
实际上在监控表上创建物化视图日志应该是最方便的方法了——除非应用做出配合,插入两份数据,但是我想想,连物化视图日志也无法配合创建,那么这就属于馊主意了。
其他方法就更加麻烦咯,比如logminer解析redo日志,动作更大,更需要源数据库端的配合,维护成本更高~[/quote]
谢谢你,我问了我们这边的DBA,也是这样说,确实没有更好的方法。。。
导致结论部分有点问题,这里纠正下:
1)若没有主键
1a)直接count花费时间为:00:00:00.78,执行计划中,有对原表一次全表扫描,逻辑读为:158696;
1b)若是创建临时表,总时间为:00:00:03.14 + 00:00:00.44,大概为4秒,select子句包含一次全表扫描是一目了然的事情,就是说,总的逻辑IO为:150000(建临时表对原表扫描) + 8056(对临时表的扫描) = 158000多
2)若是有主键
2a)直接count花费时间为:00:00:00.43,执行计划中对原表的全表扫描消失,只对主键索引来了一次INDEX FAST FULL SCAN,逻辑读为:12061
2b)若是创建临时表,总时间为:00:00:02.40 + 00:00:00.46,大概是3秒半不到点,原来没主键情况下的表扫描被优化成了主键索引的INDEX FAST FULL SCAN,总的逻辑IO:12000 + 8056,大概为 20000稍多
结论:无论是执行时间还是IO,当原表上有主键时,达到最优(2a),执行时间为:00:00:00.43,逻辑IO为:12061。
[/quote]
ctas 的速度会超出想象。[/quote]
来看下这个测试,也就是我上面提到的有无主键下两种情况:
可以看到:
1)若没有主键
1a)直接count花费时间为:00:00:00.78,执行计划中,对原表一次全表扫描,逻辑读为:158696;
1b)若是创建临时表,总时间为:00:00:03.14 + 00:00:00.44,大概为4秒,select子句包含一次全表扫描是一目了然的事情,也
就是说,总的逻辑IO为:15000(建临时表对原表扫描) + 8056(对临时表的扫描) = 23000多
2)若是有主键
2a)直接count花费时间为:00:00:00.43,执行计划中对原表的全表扫描消失,只对主键索引来了一次INDEX FAST FULL SCA
N,逻辑读为:12061
2b)若是创建临时表,总时间为:00:00:02.40 + 00:00:00.46,大概是3秒半不到点,原来没主键情况下的表扫描被优化成了主
键索引的INDEX FAST FULL SCAN,总的逻辑IO:12000 + 8056,大概为 20000稍多
结论:无论是执行时间还是IO,当原表上有主键时,达到最优(2a),执行时间为:00:00:00.43,逻辑IO为:12061;而若是使用临时表,甚至不如直接count全表(1a)。
这个测试里也可以看到:500万级的统计,即使直接count全表,也不会慢到哪去,前提当然是列并不多,dba_objects这样的表的行长度应该说还是比较有代表性的,楼主有些千万级别的表,但他的问题不在于count了全表,而是先一步试图收集那些表的统计信息,想通过user_tables里保存的统计信息来记录统计数据条数,收集统计信息会对原表做复杂的统计,可能包含更多次的表扫描,这样的处理,将问题大大复杂化了。
[/quote]
ctas 的速度会超出想象。
实际上在监控表上创建物化视图日志应该是最方便的方法了——除非应用做出配合,插入两份数据,但是我想想,连物化视图日志也无法配合创建,那么这就属于馊主意了。
其他方法就更加麻烦咯,比如logminer解析redo日志,动作更大,更需要源数据库端的配合,维护成本更高~