对于数据库索引的概念和工作方式有待进一步了解,求指点:如何使用索引?比如在一张有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关键字不会用之后。
select id, date from tenth where id = 's008' and date = to_date('2008-11-12', 'yyyy-mm-dd hh24-mi-ss');
那建立索引之后要该写什么东西吗?因为我感觉速度一点也没有快:(,所以我肯定是那里还没搞清楚,特别是发现了index关键字不会用之后。
解决方案 »
- 请问INIT.ORA INIT<SID>.ORA SPFILE<SID>.ORA之间到底是什么关系??
- oracle一个sql的问题
- 求教大神:解决Oracle的监听问题!
- 要操作自身表的触发器问题
- group by后不会抓出的数据
- iBATIS 你懂的
- 我想建立个存储过程,但我不会!
- 使用ora9i,当创建一新表时 报错ORA-01536: 超出表空间'XX'的空间限量,如何解决?
- 为什么我取出来的星期是英文的
- 请问NVARCHAR2 与VARCHAR2有什么区别?? 为何用了NVARCHAR2字段时,插入数据报字符集不对的错?
- "<>" 这个符号在sql语句什么意思
- 关于create table as 的问题,如何加一个integer型的字段
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');
select id, date from tenth where id = 's008' and to_char(date,'yyyy-mm-dd') = '2008-11-12';
我补充一点,如果id字段是主键,那默认就是索引了。
还有,LZ说没有明显变化,最好用具体的执行时间来说话 set timing on ,看看前后时间差异多大。
这个比例值得商榷,没那么高LZ 的情况 : create index idx_test on test(id,date) compute statistics;
to_char(date,'yyyy-mm-dd') = '2008-11-12' 改成这样更慢