楼上的仁兄:
“反而有可能变快,因为节省了该特定表的检索时间。”你用了“可能”两个字,你的意思是不是说可能会变慢,也有可能变快,
那这个度是怎么控制的?就是说我update/delete/insert时,什么时候index
该关,什么时候不该关,怎么判断?难道要分析其执行计划?还有,你说对特定的表操作可能快,而同时系统整体的速度有慢了,你的系统的处理速度是什么概念?是cpu和io等能力?我们平常说的系统快慢是通过一个个具体的事务处理速度来体现的?如果有人告诉我,你的某个事务处理的速度很快,可是你的系统很慢时候,你怎么理解?呵呵,我可能有点咬文嚼字了。但还望各位作出解释。
“反而有可能变快,因为节省了该特定表的检索时间。”你用了“可能”两个字,你的意思是不是说可能会变慢,也有可能变快,
那这个度是怎么控制的?就是说我update/delete/insert时,什么时候index
该关,什么时候不该关,怎么判断?难道要分析其执行计划?还有,你说对特定的表操作可能快,而同时系统整体的速度有慢了,你的系统的处理速度是什么概念?是cpu和io等能力?我们平常说的系统快慢是通过一个个具体的事务处理速度来体现的?如果有人告诉我,你的某个事务处理的速度很快,可是你的系统很慢时候,你怎么理解?呵呵,我可能有点咬文嚼字了。但还望各位作出解释。
例1:系统中正在有n个无索引的表在频繁更新
例2:系统中正在有n个有索引的表在频繁更新
对例1来说,例2要占用系统更多的cpu和内存资源来进行索引的维护。系统中其它的进程必然会受到影响。
如果我想对一个百万级或者是千万级的表作update/delete/insert操作时,
并且我知道我在操作的同时不会有别人在对该表作类似的操作,还有就是我对这个表的操作不是很频繁,那么这个时候我使用索引应该是比较高效的是吧?
因为我们直观的总是更多的是关心我们正在操作的事务的速度。
经常看到“如果是对大表应该是把表上的所有index都关掉,等数据处理完再打开”类似的话,是不是大家的理解也有偏差?还是大家根本也是如楼上大哥所说的,他们都是考虑的是系统的整体速度?
如果你仅仅是insert
我想有索引应该比没有索引慢但如果是delete and update就要分情况了:
大表下
1:如果delete或者update一条,有索引肯定快的多
因为这个时候需要先定位该条记录啊,如果没有索引,oracle得进行全表扫描才能确定一条记录啊2:当update和delete的记录达到表数据的某个比例之后,有索引可能就慢了
但到底比例多大,只能根据实际检验,不能空说书上说查询比例达到20%以上就不使用索引而是full scan
但这得有analyze的基础上并且在cost模式下才行的
关于最后一问:
典型的例子就是,比如使用sqlldr导入大量数据
这个时候往往drop index
等数据导完后再创建索引因为索引不光有维护的问题
生成索引的时候需要大量资源的,占用 ram(data buffer and sort_area_size)/cpu/临时表空间