oracle 11g问题索引
我有90万条记录的表(MEN)。oracle 11g问题索引
在这张表中我有字段IP
和Tdate
。
当我运行查询:
select * from MEN where IP = '1.1.1.1' and Tdate = TO_DATE('07/04/2010', 'DD/MM/YYYY')
需要很长的时间,直到我得到的结果。
我尽量让指数是这样的:
create index
my_in
on
MEN (IP,Tdate);
但如何运行查询得到快速的结果?
我试试这个:
select My_in from MEN where IP = '1.1.1.1' and Tdate = TO_DATE('07/04/2010', 'DD/MM/YYYY')
,并得到错误:ORA-00904
您不使用select中的索引名称(My_in)。数据库本身会计算出使用索引。所以你应该像你的第一个例子一样做选择。
这不是有效的SQL。 My_in
是您的索引的名称。
与再试一次:
select *
from MEN
where IP = '1.1.1.1'
and Tdate = TO_DATE('07/04/2010', 'DD/MM/YYYY');
另外,如果你想知道,如果服务器将使用新创建的索引使用计划,你可以检查explain
命令的输出:
explain plan for
select *
from MEN
where IP = '1.1.1.1'
and Tdate = TO_DATE('07/04/2010', 'DD/MM/YYYY');
查看关于EXPLAIN PLAN的Oracle文档。它会帮助你进行这个和许多其他的SQL优化。
+1用于绘制注意'解释plan',但它应该是'对于选择解释计划*从MEN ...'后面跟'select * from table(dbms_xplan.display())'或类似的。 – 2010-11-09 15:44:55
在查询
select My_in from MEN where IP = '1.1.1.1' and Tdate = TO_DATE('07/04/2010', 'DD/MM/YYYY')
的my_in是索引名。如果要强制使用索引,那么你就可以提示你的查询
select /*+INDEX(My_in MEN) */ * from MEN where IP = '1.1.1.1' and Tdate = TO_DATE('07/04/2010', 'DD/MM/YYYY')
+1,但大多数时候提示不是必需的(甚至可能导致查询运行速度变慢),应该避免。 – 2010-11-10 01:25:20
好的,如果我有一个索引例如在MEN(IP)上创建索引 my_in2; oracle如何知道使用哪个索引? – Gold 2010-11-09 14:58:22
它会选择一个它认为最好的。它通过查看表的统计数据来确定这一点,这就是为什么有时必须更新表/索引的统计信息才能使用正确的索引。 – 2010-11-09 15:01:09