Sql oracle11g问题索引
我有一张90万条记录的桌子 在这个表中,我有字段Sql oracle11g问题索引,sql,oracle,oracle11g,ora-00904,Sql,Oracle,Oracle11g,Ora 00904,我有一张90万条记录的桌子 在这个表中,我有字段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
和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
这不是有效的SQLMy_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');
请看一下Oracle关于的文档。它将帮助您进行此SQL优化和许多其他SQL优化。在选择中不使用索引名(My_in)。数据库本身将决定如何使用索引。因此,您应该在查询中执行与第一个示例相同的选择。
select My_in from MEN where IP = '1.1.1.1' and Tdate = TO_DATE('07/04/2010', 'DD/MM/YYYY')
中的my_是索引名。如果要强制使用索引,则可以提示查询
select /*+INDEX(My_in MEN) */ * from MEN where IP = '1.1.1.1' and Tdate = TO_DATE('07/04/2010', 'DD/MM/YYYY')
好的,如果我还有一个索引,比如说,在男性(IP)上创建索引my_in2;甲骨文将如何知道使用什么索引?它将选择它认为最好的索引。它通过查看表的统计信息来确定这一点,这就是为什么有时必须更新表/索引的统计信息,以使其使用正确的索引。+1用于提请注意
explain plan
,但是它应该是explain plan for select*from MEN…
,然后是select*from table>(dbms_xplan.display())
或类似内容。+1但大多数情况下,提示不是必需的(甚至可能导致查询运行较慢),应该避免使用。