2010-11-09 160 views
2

我有90万条记录的表(MEN)。oracle 11g问题索引

在这张表中我有字段IPTdate

当我运行查询:

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

回答

5

您不使用select中的索引名称(My_in)。数据库本身会计算出使用索引。所以你应该像你的第一个例子一样做选择。

+0

好的,如果我有一个索引例如在MEN(IP)上创建索引 my_in2; oracle如何知道使用哪个索引? – Gold 2010-11-09 14:58:22

+4

它会选择一个它认为最好的。它通过查看表的统计数据来确定这一点,这就是为什么有时必须更新表/索引的统计信息才能使用正确的索引。 – 2010-11-09 15:01:09

1

这不是有效的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

+1用于绘制注意'解释plan',但它应该是'对于选择解释计划*从MEN ...'后面跟'select * from table(dbms_xplan.display())'或类似的。 – 2010-11-09 15:44:55

1

在查询

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

+1,但大多数时候提示不是必需的(甚至可能导致查询运行速度变慢),应该避免。 – 2010-11-10 01:25:20