日期:2014-05-17  浏览次数:20995 次

有关Oracle索引的使用
对于数据库索引的概念和工作方式有待进一步了解,求指点:

如何使用索引?比如在一张有10万条记录的表tenth中,建立了例如id, date这两个字段的索引,查询更快的SQL语句要怎么写呢?

小白一点,没有建立索引的时候我是这样写的:
select id, date from tenth where id = 's008' and date = to_date('2008-11-12', 'yyyy-mm-dd hh24-mi-ss');
那建立索引之后要该写什么东西吗?因为我感觉速度一点也没有快:(,所以我肯定是那里还没搞清楚,特别是发现了index关键字不会用之后。

------解决方案--------------------
关键看看你的id和date中的不同数据是多少,如果很多,并且比较平均,建立index就会很快;如果很少,那么在比较集中的记录中就不会起什么作用。


引用楼主 amour663 的帖子:
对于数据库索引的概念和工作方式有待进一步了解,求指点:

如何使用索引?比如在一张有10万条记录的表tenth中,建立了例如id, date这两个字段的索引,查询更快的SQL语句要怎么写呢?

小白一点,没有建立索引的时候我是这样写的:
select id, date from tenth where id = 's008' and date = to_date('2008-11-12', 'yyyy-mm-dd hh24-mi-ss');
那建立索引之后要该写什么东西吗?因为我感觉速度一点也没有快:(,所以我肯…

------解决方案--------------------
你的SQL语句写法没有问题,如果分别在ID和DATE这两个字段上建立了索引,那么在符合一定的条件下就会自动用到索引;如果建了索引却没有用到有很多原因决定.比如:
1: 可能你的ORACLE优化器没有选择走索引这个执行计划,而且选择走其他的.可能没有分析表.
2: 如果SELECT出的记录数占全部数据的30%-40%,那么速度会明显增加;
但如果SELECT出的记录数占全部数据越接近90%-100%,那么效率会下降得越快.
3: 小表不建议走索引, 因为可能全表扫描会比你走索引的执行计划效率更高.

如果想强制使用索引,可以使用ORACLE中的hint(暗示):
SELECT /*+INDEX(TENTH INDEX_NAME)*/ ID, DATE 
FROM TENTH 
WHERE ID = 'S008' 
AND DATE = TO_DATE('2008-11-12', 'YYYY-MM-DD HH24-MI-SS');
引用楼主 amour663 的帖子:
对于数据库索引的概念和工作方式有待进一步了解,求指点:

如何使用索引?比如在一张有10万条记录的表tenth中,建立了例如id, date这两个字段的索引,查询更快的SQL语句要怎么写呢?

小白一点,没有建立索引的时候我是这样写的:
select id, date from tenth where id = 's008' and date = to_date('2008-11-12', 'yyyy-mm-dd hh24-mi-ss');
那建立索引之后要该写什么东西吗?因为我感觉速度一点也没有快:(,所以我肯…

------解决方案--------------------
B*Tree索引是“传统的”索引。它是迄今为止在Oracle和大部分其他数据库中使用最多的索引。其结构上和二叉树相似,根据码提供对单个行或一系统行的快速访问,通常需要很少的读取就能找到正确的行。

如果LZ删除以id, date这两个字段的索引,而仅用id做索引可能更合适些。另外语句可更改为:
select id, date from tenth where id = 's008' and to_char(date,'yyyy-mm-dd') = '2008-11-12';

------解决方案--------------------
按你这个查询语句和你建的索引,如果查询返回的数据量很少,速度应该很快。

记得建完索引后先收集下统计信息再去查询。
------解决方案--------------------
楼上几位分析了索引的使用。
我补充一点,如果id字段是主键,那默认就是索引了。
还有,LZ说没有明显变化,最好用具体的执行时间来说话 set timing on ,看看前后时间差异多大。
------解决方案--------------------
如果SELECT出的记录数占全部数据的30%-40%,那么速度会明显增加; 

----------------------
这个比例值得商榷,没那么高





LZ 的情况 : create index idx_test on test(id,date) compute statistics;