SQL> select instr('df中国太阳dfdsfsdf','中国太阳') from dual;INSTR('DF中国太阳DFDSFSDF','中 ------------------------------ 3SQL> select * from other where (NAME,'中国太阳');
正常情况下,like '%a' 不会使用索引 可以尝试一下反向索引. create index idx_rev_name on other(reverse(name))
/--改一下:select * from other where instr(NAME,'中国太阳');
反向索引?能说详细些吗? 全文索引和文本搜索(Oracle Text)是同一个吗?
select * from other where instr(NAME,'中国太阳')>1;
比如:'中国太阳'这几个汉字位置一点都没有规律吗?如有规律,也可采用substr函数。
这个问题不错,刚才学习并总结了一下关于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表,并忍受一定的查询延时
这个问题不错,刚才学习并总结了一下 关于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表,并忍受一定的查询延时
SQL> select instr('df中国太阳dfdsfsdf','中国太阳') from dual;INSTR('DF中国太阳DFDSFSDF','中
------------------------------
3SQL> select * from other where (NAME,'中国太阳');
可以尝试一下反向索引.
create index idx_rev_name on other(reverse(name))
/--改一下:select * from other where instr(NAME,'中国太阳');
全文索引和文本搜索(Oracle Text)是同一个吗?
select * from other where instr(NAME,'中国太阳')>1;
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表,并忍受一定的查询延时
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表,并忍受一定的查询延时