楼主: jimmylee

[精华] 为什么加上索引速度奇慢无比?

[复制链接]
hahaer 该用户已被删除
21#
发表于 2002-7-31 19:15 | 只看该作者

Re: Re: 为什么加上索引速度奇慢无比?

最初由 lwxian 发布
[B]


这不相当于全表扫描?当然慢了,建议建立如下索引:
create index index2 on cstmonilog(moni_area,moni_typeid,moni_flag,moni_time)
)


因为你看一下你的统计:
1 sorts (disk)
前面一个是没有sorts (disk)


SQL改为:
select  rowid  rID, MONI_TIME,MONI_TYPE,MONI_APERRCODE,MONI_CONSTANT,SubStr(MONI_USERINFO,1,50) MONI_USERINFO

from cstmonilog
where rowid IN
(select rid from  (select rownum rno,rowid /*+ INDEX(cstmonilog index2 ) */ rid from cstmonilog where MONI_AREA = :MoniAreaNo and MONI_TYPEID = :MoniTypeID and MONI_FLAG = '1' and rownum <:MoniNoLast
order by MONI_TIME) where rNo >=:MoniNoFirst )
order by MONI_TIME;
[/B]

这个语句出来的结果对吗? 要是对的,我想是你运气不错

使用道具 举报

回复
hahaer 该用户已被删除
22#
发表于 2002-7-31 19:25 | 只看该作者

Re: Re: Re: Re: Re: 为什么加上索引速度奇慢无比?

drop index index1;
drop index index2;


create index index1 on cstmonilog(moni_time) nologing;

set timing on
set autot traceonly

select * from (
select rownum rno, a.*
from
(select MONI_TIME,MONI_TYPE,MONI_APERRCODE,MONI_CONSTANT,SubStr(MONI_USERINFO,1,50) MONI_USERINFO
from cstmonilog
where MONI_AREA = :MoniAreaNo and MONI_TYPEID = :MoniTypeID and MONI_FLAG = '1'
order by MONI_TIME)  a where rownum <= 20
) where rno >= 5
/

保证你以秒级速度运行。

正如楼上某哥说的,你index2不建也罢。另外,从顶楼的贴子看来,执行计划与所建INDEX不一至。第一个应该是用inex1,第二应该用INDEX2。兄弟提个建议,各位如果有条件,请尽量原模原样COPY你在SQLPLUS 试验的情况。至于你为什么会加了INDEX而慢,你看看你用的是什么optimizer mode 就可以明白了。从你的语句看,我猜你的DB是8。1。5以上版本,建议采用COST OPTIMIZER。

使用道具 举报

回复
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
23#
发表于 2002-7-31 19:40 | 只看该作者

呵呵

反正我以前在50万记录中的测试
翻任意一页,都可以控制在3秒以内

使用道具 举报

回复
hahaer 该用户已被删除
24#
发表于 2002-7-31 19:44 | 只看该作者
哥们,你是怎么做的? my method is limited. I can ensure the sql I supplied can return the result very quicky if the MoniNoLast I specified is less than 5000 or a little more, but it will become slower and slower when the MoniNoLast get closed to the total number of rows in the table.

使用道具 举报

回复
论坛徽章:
2
ITPUB元老
日期:2005-02-28 12:57:00授权会员
日期:2005-10-30 17:05:33
25#
 楼主| 发表于 2002-7-31 19:57 | 只看该作者

Re: 呵呵

最初由 biti_rainy 发布
[B]反正我以前在50万记录中的测试
翻任意一页,都可以控制在3秒以内 [/B]


能否将你的做法共享出来,大家学学。

使用道具 举报

回复
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
26#
发表于 2002-7-31 20:10 | 只看该作者

没什么独特的,呵呵

忘了交代一个前提
那就是:

表的行记录不大,反正肯定不超过100字节
所以记录和索引全部都装在内存里面啦

使用道具 举报

回复
论坛徽章:
2
ITPUB元老
日期:2005-02-28 12:57:00授权会员
日期:2005-10-30 17:05:33
27#
 楼主| 发表于 2002-7-31 20:13 | 只看该作者
我的表肯定不行,每条记录的长度理论的大小将近8K.

使用道具 举报

回复
论坛徽章:
2
ITPUB元老
日期:2005-02-28 12:57:00授权会员
日期:2005-10-30 17:05:33
28#
 楼主| 发表于 2002-7-31 20:15 | 只看该作者
我测试的结果lwxian的语句速度是最快的。能否给解释一下为什么?

使用道具 举报

回复
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
29#
发表于 2002-7-31 20:31 | 只看该作者

你注意他的这个地方

select rownum rno,rowid /*+ INDEX(cstmonilog index2 ) */ rid from

还要注意在这一层的where条件中的所有字段都包含在索引中!

这是什么意思,表示所有字段和rowid都从索引里面来,而不用进行表扫描
通过索引确定了你要选取的记录的位置
然后再通过rowid去扫描表

因索引中只包含部分字段,内层使用的内存就少了

因为进行表扫描的时候不管你选取所有字段还是一个字段,都是把所有列读进内存的!

使用道具 举报

回复
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
30#
发表于 2002-7-31 20:36 | 只看该作者

这个现象也说明一个问题

那就是你的瓶颈在内存和io上

这样的话,你可以考虑把你的要排序的和内层的wher中字段单独放在一个表中
通过这些小表确定记录集
然后再通过这个结果集去大表中查询

本来想用 IOT的,一样可缓解楼上的所说的问题,但考虑到它限制了其他索引的存在,就算了

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表