ORACLE 中300w条记录 ,用like慢...
这个sql语句:
select * from other where NAME like '%中国太阳%'查询用了17秒。
怎么解决这个问题?
我在网上看到建全文索引,这个可行吗?能说明一下吗?谢谢

解决方案 »

  1.   

    select * from other where instr(NAME,'中国太阳')>1;
      

  2.   

    解决这种'%xxx%'查询最好的方法是全文索引。
      

  3.   


    SQL> select instr('df中国太阳dfdsfsdf','中国太阳') from dual;INSTR('DF中国太阳DFDSFSDF','中
    ------------------------------
                                 3SQL> select * from other where (NAME,'中国太阳');
      

  4.   

    正常情况下,like '%a' 不会使用索引
    可以尝试一下反向索引.
    create index idx_rev_name on other(reverse(name))
      

  5.   


    /--改一下:select * from other where instr(NAME,'中国太阳');
      

  6.   

    反向索引?能说详细些吗?
    全文索引和文本搜索(Oracle Text)是同一个吗?
      

  7.   


    select * from other where instr(NAME,'中国太阳')>1;
      

  8.   

    比如:'中国太阳'这几个汉字位置一点都没有规律吗?如有规律,也可采用substr函数。
      

  9.   

    这个问题不错,刚才学习并总结了一下关于like的索引表:create table a as select * from dba_objects;
    create index idx_a_object_name on a(object_name);1. select * from a where a.object_name like 'some key words%';
    %在关键字的后面,可以用上索引2. select * from a where a.object_name like '%some key words';
    %在关键字的前面,idx_a_object_name这个索引就用不上了。可以用函数索引来解决:
    sql>create index idx_a_reverse_object_name on a(reverse(object_name));
    查询语句变为:
    where reverse(a.object_name) like reverse('some key words%');3. select * from a where a.object_name like '%some key words%';
    此时无法用上索引。
    tom在他的effective oracle by design 此书上有一个示例,讲述了怎么用小表来进行查询。
    sql>create table a_min as select rowid rid, object_name from a;
    sql>alter table a storage(buffer_pool recycle); --将此表放到buffer recycle中
    查询语句变成:
    SELECT /*+ use_nl(b, a) */ *
      FROM a,
    (
    select rid
      from a_min
     where object_name like '%some key words%'
    ) b
     WHERE a.rowid = b.rid;
    此时全表扫描a_min, 然后通过rowid来访问a表的数据。由于a_min是在缓冲中的,所以也非常之快。
    唯一的问题是,a_min在什么时候建立?业务是需充许在夜间建a_min表,并忍受一定的查询延时
     
      

  10.   

    这个问题不错,刚才学习并总结了一下 关于like的索引 表:create table a as select * from dba_objects; 
    create index idx_a_object_name on a(object_name); 1. select * from a where a.object_name like 'some key words%'; 
    %在关键字的后面,可以用上索引 2. select * from a where a.object_name like '%some key words'; 
    %在关键字的前面,idx_a_object_name这个索引就用不上了。可以用函数索引来解决: 
    sql>create index idx_a_reverse_object_name on a(reverse(object_name)); 
    查询语句变为: 
    where reverse(a.object_name) like reverse('%some key words'); 3. select * from a where a.object_name like '%some key words%'; 
    此时无法用上索引。 
    tom在他的effective oracle by design 此书上有一个示例,讲述了怎么用小表来进行查询。 
    sql>create table a_min as select rowid rid, object_name from a; 
    sql>alter table a storage(buffer_pool recycle); --将此表放到buffer recycle中 
    查询语句变成: 
    SELECT /*+ use_nl(b, a) */ * 
      FROM a, 

    select rid 
      from a_min 
    where object_name like '%some key words%' 
    ) b 
    WHERE a.rowid = b.rid; 
    此时全表扫描a_min, 然后通过rowid来访问a表的数据。由于a_min是在缓冲中的,所以也非常之快。 
    唯一的问题是,a_min在什么时候建立?业务是需充许在夜间建a_min表,并忍受一定的查询延时