[阅读: 714] 2006-02-14 12:21:03
为什么Oracle不自动做Analyze?
如果Analyze的利大于弊的话,为什么Oracle不自己做?它完全可以做到实时的/定时的(调度表)/策略的(系统非繁忙时/数据量变化到一定程度时)。我认为Oracle不自动去做是与设计思想有关的,它追求尽量的稳妥,同时也让用户自己去承担Analyze的风险(有点不负责任吧,它在文档中也几乎没有提及作Analyze的风险)。
Analyze 的风险:
先来看两个极端的例子:
例1,假设现有系统已经是最优系统,那么在作了Analyze后,最好的情况是系统效率没有变化,即收益为0。正常的情况是某些原本最佳化的SQL, 在Analyze后由于Cost的变化,Oracle内部优化器选择了一个不同原先最佳的执行计划的新执行计划,性能反而下降了,或者说收益<0。
结论:对于最佳系统,作Analyze后的总体收益<=0。
例2,假设现有系统为最差系统,那么在作了Analyze后,最坏的情况是系统效率没有变化,即收益为0。正常的情况是某些原本最差的SQL,在Analyze后由于Cost的变化,Oracle内部优化器选择了一个不同原先最差的执行计划的新执行计划,性能上升了,或者说收益>0。
结论:对于最差系统,作Analyze后的总体收益>=0。
那么对于正常的系统--介于最佳和最差系统之间的系统,作Analyze后的情况会是什么样呢?收益:a.原先性能很差的SQL性能提高了。b.一部分性能不错的SQL,性能又再一步提高了(少数)。损失:a.一部分性能很差的SQL,性能更差了(少数)。b.一部分性能不错的SQL,性能下降了--------注意这一点。
结论:对于正常系统,作Analyze后的收益不可知!!!!!!!!!!!!!
正是这个不可知产生了风险。对于一个生产系统,在作Analyze前,你可以明确的知道瓶颈在那里(虽然系统性能在逐渐下降中),但在Analyze后,你只能祈求上帝了,因为你根本不知道什么地方性能会下降,什么地方性能会上升(系统性能产生了不可预知的急剧变化)。假设只有一条SQL的性能下降了,999条性能提高了,那么你的系统的性能提高了吗?未必,下降的那条可能每天需要运行几千万次:),整体性能可能还是下降了。想看性能下降的例子?请看 http://www.itpub.net/showthread.php?s=&threadid=27994
总结:作Analyze的风险在于你不知道Analyze后,那一部分的性能会提高,那一部分的性能会下降,也不知道整体的性能会下降还是提高。或者说作Analyze会把系统性能推入一个不可预知的状态。
现在你知道为什么oracle不自动作Analyze了吧:)
执行力=流程+计划+组织
把理想变成计划,
把计划变成步骤,
把步骤变成行动,
把行动变成成果。
好語說盡人必易之。規矩行盡人必繁之。福若受盡緣必孤。勢若使盡禍必至。