oracle数据库查询特别慢的原因及对策………………

flyinthesky 2002-01-25 11:23:44
希望大家能多多献技献策,我的数据库这几天告别慢,基本上做十万取几十的一般条件查询都需要差不多五分种。都快愁死我了!!

怎么办?

还有,系统的性能对oracle的影响有多大,希望大家多发言。

...全文
2761 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
xinpingf 2002-02-04
  • 打赏
  • 举报
回复
flyinthesky(我想飞………) (2002-1-27 0:25:07) 得0分
to joi(海天一色)
我的id是用序号生成器生成的,且自动循环,所以你的办法不能满足要求!!!


id 一般是用来作唯一约束的,如果有循环产生就会有重复了,那样就失去了它的意义了
backlove 2002-02-04
  • 打赏
  • 举报
回复
具体问题具体分析
MountLion 2002-02-04
  • 打赏
  • 举报
回复
jamesbert(嘎子)的方法就是用来释放空间的
dengyongfu 2002-01-29
  • 打赏
  • 举报
回复
对init.ora文件中的参数:db_block_buffers,shared_pool_size,db_block_size这几个参数影响最大,其中db_block_size只有在建库时指定,不能修改,默认为2k,最好改成8k以上。具体配置要根据你的服务器的硬件配置来设置,可以给一个大概的配置如下:
如果服务器内存为512 M,连接100台客户机则:
增加以下参数:
open_cursors = 400
dml_locks = 500
transactions = 200
修改以下参数为下列值:
db_block_buffers = 50000
shared_pool_size = 150000000
processes = 120
log_buffer = 32768
global_names = false
job_queue_processes = 6

如果服务器内存为256 m,连接50台客户机则:
增加以下参数:
open_cursors = 400
dml_locks = 500
transactions = 150
修改以下参数为下列值:
db_block_buffers = 25000
shared_pool_size = 75000000
processes = 80
log_buffer = 32768
global_names = false
job_queue_processes = 6

如果服务器内存为128m,连接20台客户机则:
增加以下参数:
open_cursors = 400
dml_locks = 500
transactions = 100

修改以下参数为下列值:
db_block_buffers = 15000
shared_pool_size = 40000000
processes = 50
log_buffer = 32768
global_names = false
job_queue_processes = 6
flyinthesky 2002-01-28
  • 打赏
  • 举报
回复
谢谢大家,我准备做先捡简单的做一些,如果效果好,马上回来送分。

另外,oracle系统哪些配置对数据查询速度有影响?!
flyinthesky 2002-01-28
  • 打赏
  • 举报
回复
有钱的出钱,有力的出力,没钱没力的给捧个场…………
boby_v 2002-01-27
  • 打赏
  • 举报
回复
同意sky_blue,not in 不会使用索引,建议用not exists
建议适当调整数据库性能。

flyinthesky 2002-01-27
  • 打赏
  • 举报
回复
to joi(海天一色)
我的id是用序号生成器生成的,且自动循环,所以你的办法不能满足要求!!!
蓝天 2002-01-27
  • 打赏
  • 举报
回复
select count(*) from productlist where not exists (select id from product_ml where id = productlist .id);

flyinthesky 2002-01-27
  • 打赏
  • 举报
回复
up!!!
alflor 2002-01-27
  • 打赏
  • 举报
回复
以上各位的解决方法都不错,如果还是有问题的话,我这种方法试试看:
可能是操作太多,使的文件的空间粹片干扰,有一个办法是:
初始化其空间:
即:先用 exp导出该表(记住要备份好),
    然后,删除该表。
    最后,用imp导入到数据库中。
看看怎么样?
llzczf 2002-01-27
  • 打赏
  • 举报
回复
我见议你先进行全表分析 analyze table table_name estmate...看语法,然后对所有的索引进行rebuild。最重的是要看where条件能否用上索引呀。
dengyongfu 2002-01-27
  • 打赏
  • 举报
回复
关键查询时要用到索引,避免大表的全表扫描,而且要注意关联表的顺序,哪个表做驱动表等!可以用plan_table分析一下查询的路径呀!
dengyongfu 2002-01-27
  • 打赏
  • 举报
回复
不会这么慢吧!我的数据库里记录数已经达到2千万条了,从这个表,而且还有关联两三个3、4万条数据的表,出一张报表也只用30秒之内呀!
MountLion 2002-01-26
  • 打赏
  • 举报
回复
如果是频繁删除的表,还要考虑“高水位线”问题。
也就是要释放空间。
wsh 2002-01-26
  • 打赏
  • 举报
回复
主要原因是索引,还有一个最关建的因素是你的查询中所使用的条件,首先,条件的字段应该有索引,每二,条件字段的取值应该范围大,如:性别字段的取值只能为"男"和"女",这种字段应该尽可能地不出现在And 语句。
mycode 2002-01-26
  • 打赏
  • 举报
回复
首先检查索引;
如果建了索引,再用explain plan检查是否用上索引;
如果用上了索引,再看数据库的参数配置和实际机器的物理性能参数。
一般系统的性能对oracle的影响不会特别大,不可能做十万做几十这种会花几分钟。
flyinthesky 2002-01-26
  • 打赏
  • 举报
回复
还有,如果有详细资料更好了。
我的邮箱:falleave@163.com
joi 2002-01-26
  • 打赏
  • 举报
回复
不要使用not in这语句,这就是你的查询慢的原因。
可以用>max and <min来查。
flyinthesky 2002-01-26
  • 打赏
  • 举报
回复
感谢大家的支持,请大家继续多发言:
另外,我以前一直做程序员,最近开始搞系统,所以有些系统配置不是很懂,所以还请大家做详细的说明。
系统用的unix前一段时间,一直没有问题,库的索引都没有问题,是我从前做程序做的,应该没有问题。最近发现有些慢,我开始认为是系统数据过多的问题,但经过清理所有效果,但效果不明显。而且过了两天又慢了下来!

下面这条语句是我在清理一些无效数据时做的,特别慢,其中product_ml为基本表,记录数在两万左右,productlist为详细资料,及相关产品库,是操作频率特别高的库,记录数据有几十万。

select count(*) from productlist where id not in (select id from product_ml);

这么一条语句就用时近十分种!!!
最后查询出的结果为:九万多。
我不太清楚怎么会这么慢!我想问一下MountLion(人不寐),你所说的释放空间的问题, 不知能否详细说明。

加载更多回复(8)

2,596

社区成员

发帖
与我相关
我的任务
社区描述
Sybase相关技术讨论区
社区管理员
  • Sybase社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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