oracle 查询速度慢,求大老们解决

martincn 2007-08-10 03:03:55
一个5000条数据的表,在pl/sql里查的时候下面显示进度条数确是50000条,即十倍,用了19秒钟,我做过表分析也没用,环境红帽和aix都一样,请各位说说可能原因。
...全文
562 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
tjuxl123 2009-12-11
  • 打赏
  • 举报
回复
在Oracle数据的存储中,可以把存储空间想象为一个水库,数据想象为水库中的水。水库中的水的位置有一条线叫做水位线,在Oracle中,这条线被称为高水位线(High-warter mark, HWM)。在数据库表刚建立的时候,由于没有任何数据,所以这个时候水位线是空的,也就是说HWM为最低值。当插入了数据以后,高水位线就会上涨,但是这里也有一个特性,就是如果你采用delete语句删除数据的话,数据虽然被删除了,但是高水位线却没有降低,还是你刚才删除数据以前那么高的水位。也就是说,这条高水位线在日常的增删操作中只会上涨,不会下跌。

在Oracle数据的存储中,可以把存储空间想象为一个水库,数据想象为水库中的水。水库中的水的位置有一条线叫做水位线,在Oracle中,这条线被称为高水位线(High-warter mark, HWM)。在数据库表刚建立的时候,由于没有任何数据,所以这个时候水位线是空的,也就是说HWM为最低值。当插入了数据以后,高水位线就会上涨,但是这里也有一个特性,就是如果你采用delete语句删除数据的话,数据虽然被删除了,但是高水位线却没有降低,还是你刚才删除数据以前那么高的水位。也就是说,这条高水位线在日常的增删操作中只会上涨,不会下跌。


下面我们来谈一下Oracle中Select语句的特性。Select语句会对表中的数据进行一次扫描,但是究竟扫描多少数据存储块呢,这个并不是说数据库中有多少数据,Oracle就扫描这么大的数据块,而是Oracle会扫描高水位线以下的数据块。现在来想象一下,如果刚才是一张刚刚建立的空表,你进行了一次Select操作,那么由于高水位线HWM在最低的0位置上,所以没有数据块需要被扫描,扫描时间会极短。而如果这个时候你首先插入了一千万条数据,然后再用delete语句删除这一千万条数据。由于插入了一千万条数据,所以这个时候的高水位线就在一千万条数据这里。后来删除这一千万条数据的时候,由于delete语句不影响高水位线,所以高水位线依然在一千万条数据这里。这个时候再一次用select语句进行扫描,虽然这个时候表中没有数据,但是由于扫描是按照高水位线来的,所以需要把一千万条数据的存储空间都要扫描一次,也就是说这次扫描所需要的时间和扫描一千万条数据所需要的时间是一样多的。所以有时候有人总是经常说,怎么我的表中没有几条数据,但是还是这么慢呢,这个时候其实奥秘就是这里的高水位线了。


那有没有办法让高水位线下降呢,其实有一种比较简单的方法,那就是采用TRUNCATE语句进行删除数据。采用TRUNCATE语句删除一个表的数据的时候,类似于重新建立了表,不仅把数据都删除了,还把HWM给清空恢复为0。所以如果需要把表清空,在有可能利用TRUNCATE语句来删除数据的时候就利用TRUNCATE语句来删除表,特别是那种数据量有可能很大的临时存储表。


在手动段空间管理(Manual Segment Space Management)中,段中只有一个HWM,但是在Oracle9iRelease1才添加的自动段空间管理(Automatic Segment Space Management)中,又有了一个低HWM的概念出来。为什么有了HWM还又有一个低HWM呢,这个是因为自动段空间管理的特性造成的。在手段段空间管理中,当数据插入以后,如果是插入到新的数据块中,数据块就会被自动格式化等待数据访问。而在自动段空间管理中,数据插入到新的数据块以后,数据块并没有被格式化,而是在第一次在第一次访问这个数据块的时候才格式化这个块。所以我们又需要一条水位线,用来标示已经被格式化的块。这条水位线就叫做低HWM。一般来说,低HWM肯定是低于等于HWM的。

lzwlyan 2009-12-11
  • 打赏
  • 举报
回复
你用truncate table tablename 将表的高水位线置零,应该就不会出现你说的那个现象了。。。高水位线的大小决定了你查询表所遍历的空间大小。如果你的高水位线是10000,即使你表中没有数据,那么还是会遍历10000数据所占用的空间
martincn 2007-08-10
  • 打赏
  • 举报
回复
各位 My Objects下 还是一样的 再接再厉 帮想想办法
tiaodongdeyinfu 2007-08-10
  • 打赏
  • 举报
回复
而且表结构也一样,哈哈。。。。这就奇怪了啊。。。
tiaodongdeyinfu 2007-08-10
  • 打赏
  • 举报
回复
难道有重复的表名?在别的表空间里也有这样一个表?选择一下在:My Objects下查询看看,可能在别的表空间里也有这样一个表。
liuzi123 2007-08-10
  • 打赏
  • 举报
回复
接分
martincn 2007-08-10
  • 打赏
  • 举报
回复
5000条
mingxuan3000 2007-08-10
  • 打赏
  • 举报
回复
5000 条,“查询显示所有”按钮,也不要到20妙

非常奇怪的问题

select count(*) from tstockinfo 看看有多少
ATGC 2007-08-10
  • 打赏
  • 举报
回复
"对 是立即返回第一页 就是查询显示所有的时候 数字一直在变到50000行 要20秒钟"
=============================================================================
你点击了“查询显示所有”按钮,那是当然要20妙了,因为显示了所有的记录
但是你说的,物理上只有5000记录,而显示了50000记录,就不可思议了
sdl_goahead 2007-08-10
  • 打赏
  • 举报
回复
未见过这样的情况,顶一下.
martincn 2007-08-10
  • 打赏
  • 举报
回复
对 是立即返回第一页 就是查询显示所有的时候 数字一直在变到50000行 要20秒钟
ATGC 2007-08-10
  • 打赏
  • 举报
回复
如果仅仅是select * from tstockinfo
正常情况下,PL/SQL Developer将立刻返回第一页
martincn 2007-08-10
  • 打赏
  • 举报
回复
select * from tstockinfo 就怎么简单的语句 刚用了20多秒 真是见鬼了
InFerNaL_LioN 2007-08-10
  • 打赏
  • 举报
回复
灵异现象??
mingxuan3000 2007-08-10
  • 打赏
  • 举报
回复
查询?5000-〉50000?
把语句写出来呀

17,377

社区成员

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

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