【问题标题】:index on oracle 11g questionoracle 11g问题索引
【发布时间】:2010-11-09 14:41:23
【问题描述】:

我的表 (MEN) 有 900,000 条记录。

在此表中,我有字段 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

【问题讨论】:

    标签: sql oracle oracle11g ora-00904


    【解决方案1】:

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

    【讨论】:

    • 好的,如果我还有一个索引,例如在 MEN (IP) 上创建索引 my_in2;预言机如何知道使用什么索引?
    • 它会选择它认为最好的那个。它通过查看表的统计信息来确定这一点,这就是为什么有时您必须更新表/索引的统计信息才能让它使用正确的索引。
    【解决方案2】:

    在您的查询中

    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 但大多数时候提示不是必需的(甚至会导致查询运行速度变慢),应该避免使用。
    【解决方案3】:

    这不是有效的 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 表示关注explain plan,但应该是explain plan for select * from MEN...,然后是select * from table(dbms_xplan.display()) 或类似名称。
    猜你喜欢
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    • 2018-03-07
    • 2016-07-07
    • 1970-01-01
    相关资源
    最近更新 更多