真实的故事是这样的:
当你测试你的程序的时候,Oracle表现非常好,CPU只有20%。但是当你正式运行程序的时候,发现它的CPU突然飙升到了100%。这时候老板们和很多用户正在看着,系统开始很慢很慢,你重新启动Oracle,重新启动程序,甚至踢它几脚,它还是100%。然后一切结束了...
你开始痛恨Oracle ,痛恨自己不是Oracle DBA,痛恨自己为什么测试的时候不够努力,开始抓狂。
抓狂结束,冷静下来后,你重新开始测试,惊喜地发现问题居然重现了。然后一个个语句看过去,看SQL 的执行计划,发现Oracle在某条SQL里面使用了一个莫名的索引,不是你想象中的那个索引。继续测试测试,然后惊喜地发现过了一会儿,CPU降到了20%,那个SQL用到的索引就是你希望的索引。神奇的Oracle。
这就是Oracle的OPTIMIZER_MODE ,它有两种优化方法:即基于规则的RBO和基于代价的CBO。缺省是CBO,它会根据统计信息自动调整索引。问题是它有自己的有规则,你不知道它什么时候调整,不知道它真的能优化出一个垃圾结果,然后就是这样被害死的,当然这也是你学艺不精的下场。
SQLServer 有这样的情况吗,小心点吧,多读书多做实验。