10g怎么order by的时候不使用索引了?

ckc 2007-09-17 04:06:23
刚刚把数据库从817迁移到了10g,发现以前经常使用的语句变慢很多
select * from dxx order by xh desc;
我需要用这个来查询最近的数据,pl/sql developer中用这个语句很方便
一下就可以把最近的若干条数据取出来了
我已经在dxx表的xh字段上建立了索引
817中可以正常使用索引,换成10g之后不再使用索引,需要全表扫描
以前瞬间出来的结果现在需要几十秒。。。。。
有什么办法可以解决这个问题啊
...全文
652 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuyi8903 2007-09-21
  • 打赏
  • 举报
回复
这是因为,在使用index_ffs的时候,oracle本判断你的index列是否存在null

如果存在,将不使用index scan, 否则反之.这也就说话了为什么pk using index是被引用的.
ckc 2007-09-19
  • 打赏
  • 举报
回复
有没有人知道啊,或者在你自己的10g上试下告诉我是oracle固有的问题还是设置问题?
ckc 2007-09-19
  • 打赏
  • 举报
回复
嗯,默认的优化设置不同,用
select /*+rule */ * from dxx order by xh desc;
就可以了。
还有一个致命的xh上的索引没用,主键才可以!!!!!
归根结底还是oracle没有limit N这样的功能
order by的时候又不使用索引,最多只能用下主键,真要命。
liuyi8903 2007-09-19
  • 打赏
  • 举报
回复
以前在817上面是rbo的吧.

比较一下两边的优化器.
在10G下默认是CBO的.

bjt_ 2007-09-18
  • 打赏
  • 举报
回复
1
“select * from dxx where rownum<23 order by xh desc;”取前22条数据0.016秒,用到了这个索引
并不是时间短就一定代表用上了索引,这句话总共只需要处理22条记录,当然快。

2 “select * from dxx order by xh desc;取前22条数据需要30秒,没用到索引,需要全表扫描的

这个不一定的,就算用上索引,也需要处理索引的很多记录

3 建议仔细查看执行计划

ckc 2007-09-18
  • 打赏
  • 举报
回复
表没什么特殊性,是我们用来发短信的表,所以数据量很大
并不是这一张表出了问题,其它表也有类似问题
dxx表结构如下
Name Type Nullable
------ -------------- --------
XH NUMBER(10)
FSZ VARCHAR2(20) Y
FSHM VARCHAR2(20) Y
JSZ VARCHAR2(20) Y
JSHM VARCHAR2(20)
DXNR VARCHAR2(4000)
TJSJ DATE Y
FSSJ DATE Y
SJFSSJ DATE Y
WBSY VARCHAR2(15) Y
FZH NUMBER Y
BZ CHAR(5) Y
YXJ NUMBER(3) Y
XT VARCHAR2(20)
xh字段上有索引
alter table DXX
add constraint PK_DXX primary key (XH)
select count(*) from dxx 得到结果427万
select * from dxx order by xh desc;取前22条数据需要30秒,没用到索引,需要全表扫描的
select * from dxx where rownum<23 order by xh desc;取前22条数据0.016秒,用到了这个索引
select * from dxx取前22条数据也只需要0.016秒
另外,select * from dxx where rownum<23 order by xh desc这样的脚本是取xh最大的22条数据还是随便取了22条数据之后按xh排序?看了一本书上说是后一种,不过我测试好象是前一种,现在心里很没把握,不知道oracle官方有没有什么说法?

另外hongqi162(失踪的月亮)写的东西我看不懂,惭愧惭愧
GoldShield 2007-09-18
  • 打赏
  • 举报
回复
换回817去吧^_^
ckc 2007-09-18
  • 打赏
  • 举报
回复
索引是重建过的
ckc 2007-09-18
  • 打赏
  • 举报
回复
to:bjt_(bjt)
用没用到索引是我用plain看的,结果也证实了这一点
就拿select * from dxx order by xh desc这一句来说吧
相同的数据,相同的索引,在8i中很快就可以得到结果(<<1秒)
在10G中需要几十秒,这个对比是非常明显的
10G运行的机器比8i运行的机器还要好很多
8i运行在5年前买的m80机器上,4cpu12G内存
10G运行在刚刚买的p560上,8cpu16G内存
存储10G这边的也比8i的好很多,快N倍

我想问的就是在10g的环境下
select * from dxx order by xh desc
如何可以很快得出结果?就象以前8i一样?
总不至于新机器新系统下10G表现不如8i吧
kinglht 2007-09-18
  • 打赏
  • 举报
回复
数据迁移后重建一下索引,然后做个表分析试试看!
凤影 2007-09-17
  • 打赏
  • 举报
回复
把具体的表脚本和索引脚本、测试数据贴出来大家才好帮你啊。我看上你这100分了,贴一个吧。
hongqi162 2007-09-17
  • 打赏
  • 举报
回复
Oracle 10g中可以使用DBMS_ADVISOR的quick_tune获得一个索引建议,你看看这个

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧