真的没人会吗?我是这个意思:对于一个大表,我不希望全表扫描,所以,自己建了个索引结构,(因为ORACLE的索引不是我想要的,我做的是空间索引),通过程序筛出来个记录集,比如筛出20条记录,然后再到原表中查找,SELECT * FROM 愿表 WHERE ID IN(结果集),但是效率很低啊?怎么办?????????????
摆明了有问题的SELECT语句.既然不用索引为什么要写什么SELECT * FROM 愿表 WHERE ID IN 请问ID是一个索引么???要用也要用ROWID; 你这样不用索引是错误的.我不知道你的大表数据量有多大我的两百万的表也没有用到楼主说的东西.查询起来也照样很快.如果你硬要用的话我也是建议你用索引组织表.特别是当你希望查询的时候不区分大小写的时候.速度非常快
select * from char_info t where rowid in ( SELECT rid FROM ( SELECT T1.rowid rid, rownum as linenum FROM ( SELECT a.rowid FROM char_info a where a.class = userclass and a.race = userrace and "LEVEL" = userlevel and server = servername order by a.money_g desc ) T1 WHERE rownum < Overnumber ) WHERE linenum >= Startnumber ) order by money_g desc; 这样写效果会好一些
to smallflaybird(bird鸟): 我其实就是用的ROWID,可能我没有说明白,我再重说一下: 原表结构:表一: id number xmin number ymin number xmax number ymax number 如果没有索引(其实ORACLE 也不可能对这种做索引)selelct id from 表一 where xmin<100 and ymin<100 and xmax>150 and ymax>150; 要是表是1000万条记录的话,ORACLE要计算1000万次,所以我自己做了个空间索引结构,通过程序先进行初步的筛选,筛出一个结果集后,在到原表中查找; 我现在的问题是:SELECT ID FROM 表一 ROWID in (结果集)它的速度怎么能提高一下?还有in结果集最多只能是1000个!
SELECT ID FROM 表一 ROWID in (结果集)它的速度怎么能提高一下?还有in结果集最多只能是1000个! 我现在感觉这么做不行,我看ORACLE 有扩展索引,允许自己定义类型,然后嵌入到ORACLE中,跟ORACLE自己的索引一样!但是我不知道怎么做!?
TO smallflaybird(bird鸟) :ORACLE 在解析SQL 语句的时候,它有一个最大限制,好像是64KB,我记不大清了,就是说如果你的SQL语句过长,ORACLE可能不识别了,SELECT * FROM 表 IN(集合),其中,集合的大小不能超过1000,这个我也是作试验才知道的
to v3206: 你能做R树索引,看来功底不错。只是使用in很不好,不能充分发挥数据库本身索引的功效。 建议把你临时筛选出来的结果存到一张会话级的临时表当中temporary table,然后,再使用exists操作来查询会好一点。 其实,对我来说,使用R树索引比线性四叉树好不到哪儿去,R树的维护成本实在太高了。
to ihero(阿黑哥) : 万分感谢你的支持和留言,我用EXISTS试了,我感觉这个好象有一点满足的,就把所有的都给查出来了呢?????????? 小女不明白,还望多多指教!!!!!!!!!!不胜感激!!!!!!!
原表结构: 表一: id number xmin number ymin number xmax number ymax number查询要求: select id from 表一 where xmin<100 and ymin<100 and xmax>150 and ymax>150;------------------------------------------------------------- 根据表结构,要完成你示例的查询,oracle是完全可以做到的,只要建立一个(xmin, ymin, xmax, ymax)的组合索引就可以,即使你的表有1000万条记录,查询时间也应该在毫秒级(根据结果集的大小,查询时间可能不同)。我猜你的要求可能比示例中的查询要复杂,那就可能要考虑其他的方案。根据不同的业务需求、数据特点有不同的适用方案。比如: *、如果你的表中xmin、xmax、ymin、ymax在insert纪录后是不变的,而且这些值的分布有一定规律,那么range partition table + local index就应该是一个很好的方案。 *、如果表中大部分列是静态的,那甚至可以考虑用bitmap table。我没有搞过Oracle Spatial方面的东西,不过对于新东西,我总是很感兴趣的。我看看资料,如果有了新的想法,再来和楼主探讨。
请问ID是一个索引么???要用也要用ROWID;
你这样不用索引是错误的.我不知道你的大表数据量有多大我的两百万的表也没有用到楼主说的东西.查询起来也照样很快.如果你硬要用的话我也是建议你用索引组织表.特别是当你希望查询的时候不区分大小写的时候.速度非常快
(
SELECT rid FROM
(
SELECT T1.rowid rid, rownum as linenum FROM
(
SELECT a.rowid FROM char_info a
where a.class = userclass and a.race = userrace and "LEVEL" = userlevel and server = servername
order by a.money_g desc
) T1
WHERE rownum < Overnumber
) WHERE linenum >= Startnumber
) order by money_g desc;
这样写效果会好一些
我其实就是用的ROWID,可能我没有说明白,我再重说一下:
原表结构:表一:
id number
xmin number
ymin number
xmax number
ymax number
如果没有索引(其实ORACLE 也不可能对这种做索引)selelct id from 表一 where xmin<100 and ymin<100 and xmax>150 and ymax>150;
要是表是1000万条记录的话,ORACLE要计算1000万次,所以我自己做了个空间索引结构,通过程序先进行初步的筛选,筛出一个结果集后,在到原表中查找;
我现在的问题是:SELECT ID FROM 表一 ROWID in (结果集)它的速度怎么能提高一下?还有in结果集最多只能是1000个!
我现在感觉这么做不行,我看ORACLE 有扩展索引,允许自己定义类型,然后嵌入到ORACLE中,跟ORACLE自己的索引一样!但是我不知道怎么做!?
你能做R树索引,看来功底不错。只是使用in很不好,不能充分发挥数据库本身索引的功效。
建议把你临时筛选出来的结果存到一张会话级的临时表当中temporary table,然后,再使用exists操作来查询会好一点。
其实,对我来说,使用R树索引比线性四叉树好不到哪儿去,R树的维护成本实在太高了。
万分感谢你的支持和留言,我用EXISTS试了,我感觉这个好象有一点满足的,就把所有的都给查出来了呢?????????? 小女不明白,还望多多指教!!!!!!!!!!不胜感激!!!!!!!
表一:
id number
xmin number
ymin number
xmax number
ymax number查询要求:
select id from 表一
where xmin<100
and ymin<100
and xmax>150
and ymax>150;-------------------------------------------------------------
根据表结构,要完成你示例的查询,oracle是完全可以做到的,只要建立一个(xmin, ymin, xmax, ymax)的组合索引就可以,即使你的表有1000万条记录,查询时间也应该在毫秒级(根据结果集的大小,查询时间可能不同)。我猜你的要求可能比示例中的查询要复杂,那就可能要考虑其他的方案。根据不同的业务需求、数据特点有不同的适用方案。比如:
*、如果你的表中xmin、xmax、ymin、ymax在insert纪录后是不变的,而且这些值的分布有一定规律,那么range partition table + local index就应该是一个很好的方案。
*、如果表中大部分列是静态的,那甚至可以考虑用bitmap table。我没有搞过Oracle Spatial方面的东西,不过对于新东西,我总是很感兴趣的。我看看资料,如果有了新的想法,再来和楼主探讨。