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

希望大家能多多献技献策,我的数据库这几天告别慢,基本上做十万取几十的一般条件查询都需要差不多五分种。都快愁死我了!
怎么办?
还有,系统的性能对oracle的影响有多大,希望大家多发言。
[126 byte] By [flyinthesky-我想飞………] at [2008-4-10]
# 1
你建立索引了没有?
kuaihuo-快活 at 2007-10-22 > top of Msdn China Tech,其他数据库开发,SQL Anywhere Studio...
# 2
可能是你没建索引,如果有的话你 explain plan 一下看看查询有没用上索引
Francky-寒星 at 2007-10-22 > top of Msdn China Tech,其他数据库开发,SQL Anywhere Studio...
# 3
首先检查索引;
如果建了索引,再用explain plan检查是否用上索引;
如果用上了索引,再看数据库的参数配置和实际机器的物理性能参数。
一般系统的性能对oracle的影响不会特别大,不可能做十万做几十这种会花几分钟。
mycode-不写代码 at 2007-10-22 > top of Msdn China Tech,其他数据库开发,SQL Anywhere Studio...
# 4
主要原因是索引,还有一个最关建的因素是你的查询中所使用的条件,首先,条件的字段应该有索引,每二,条件字段的取值应该范围大,如:性别字段的取值只能为"男"和"女",这种字段应该尽可能地不出现在And 语句。
wsh-Bingo.W at 2007-10-22 > top of Msdn China Tech,其他数据库开发,SQL Anywhere Studio...
# 5
我相信你已经建立了索引,所以建议你考虑考虑 sql 语句是否写得合理!
cabbear-疯狂变态 at 2007-10-22 > top of Msdn China Tech,其他数据库开发,SQL Anywhere Studio...
# 6
如果是频繁删除的表,还要考虑“高水位线”问题。
也就是要释放空间。
MountLion-闷头睡 at 2007-10-22 > top of Msdn China Tech,其他数据库开发,SQL Anywhere Studio...
# 7
你检索数据时是否关联太多的表,因为关联太多的表会大大的减慢速度。
dyhd-Mike at 2007-10-22 > top of Msdn China Tech,其他数据库开发,SQL Anywhere Studio...
# 8
贴个查询出来, 大家帮你挑跳毛病
sky_blue-蓝天2007 at 2007-10-22 > top of Msdn China Tech,其他数据库开发,SQL Anywhere Studio...
# 9
建立联合索引,按照你的where子句中的条件的顺序
xinpingf-白开心 at 2007-10-22 > top of Msdn China Tech,其他数据库开发,SQL Anywhere Studio...
# 10
1.对经常查询的字段建索引
2.对相关字段建簇
3.优化查询语句
mashansj-风影 at 2007-10-22 > top of Msdn China Tech,其他数据库开发,SQL Anywhere Studio...
# 11
5分钟?
你前台是什么?
goodlucky-沉浮 at 2007-10-22 > top of Msdn China Tech,其他数据库开发,SQL Anywhere Studio...
# 12
感谢大家的支持,请大家继续多发言:
另外,我以前一直做程序员,最近开始搞系统,所以有些系统配置不是很懂,所以还请大家做详细的说明。
系统用的unix前一段时间,一直没有问题,库的索引都没有问题,是我从前做程序做的,应该没有问题。最近发现有些慢,我开始认为是系统数据过多的问题,但经过清理所有效果,但效果不明显。而且过了两天又慢了下来!

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

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

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

# 13
不要使用not in这语句,这就是你的查询慢的原因。
可以用>max and <min来查。
joi-海天一色 at 2007-10-22 > top of Msdn China Tech,其他数据库开发,SQL Anywhere Studio...
# 14
还有,如果有详细资料更好了。
我的邮箱:falleave@163.com
# 15
to joi(海天一色)
我的id是用序号生成器生成的,且自动循环,所以你的办法不能满足要求!!
# 16
up!!
# 17
select count(*) from productlist where not exists (select id from product_ml where id = productlist .id);

sky_blue-蓝天2007 at 2007-10-22 > top of Msdn China Tech,其他数据库开发,SQL Anywhere Studio...
# 18
同意sky_blue,not in 不会使用索引,建议用not exists
建议适当调整数据库性能。

boby_v-泪如雨下 at 2007-10-22 > top of Msdn China Tech,其他数据库开发,SQL Anywhere Studio...
# 19
不会这么慢吧!我的数据库里记录数已经达到2千万条了,从这个表,而且还有关联两三个3、4万条数据的表,出一张报表也只用30秒之内呀!
dengyongfu-浪子 at 2007-10-22 > top of Msdn China Tech,其他数据库开发,SQL Anywhere Studio...
# 20
关键查询时要用到索引,避免大表的全表扫描,而且要注意关联表的顺序,哪个表做驱动表等!可以用plan_table分析一下查询的路径呀!
dengyongfu-浪子 at 2007-10-22 > top of Msdn China Tech,其他数据库开发,SQL Anywhere Studio...
# 21
我见议你先进行全表分析 analyze table table_name estmate...看语法,然后对所有的索引进行rebuild。最重的是要看where条件能否用上索引呀。
llzczf-流浪汉 at 2007-10-22 > top of Msdn China Tech,其他数据库开发,SQL Anywhere Studio...
# 22
以上各位的解决方法都不错,如果还是有问题的话,我这种方法试试看:
可能是操作太多,使的文件的空间粹片干扰,有一个办法是:
初始化其空间:
即:先用 exp导出该表(记住要备份好),
然后,删除该表。
最后,用imp导入到数据库中。
看看怎么样?
jamesbert-albert at 2007-10-22 > top of Msdn China Tech,其他数据库开发,SQL Anywhere Studio...
# 23
谢谢大家,我准备做先捡简单的做一些,如果效果好,马上回来送分。

另外,oracle系统哪些配置对数据查询速度有影响?!
# 24
有钱的出钱,有力的出力,没钱没力的给捧个场…………
# 25
对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
dengyongfu-浪子 at 2007-10-22 > top of Msdn China Tech,其他数据库开发,SQL Anywhere Studio...
# 26
jamesbert(嘎子)的方法就是用来释放空间的
MountLion-闷头睡 at 2007-10-22 > top of Msdn China Tech,其他数据库开发,SQL Anywhere Studio...
# 27
具体问题具体分析
backlove-我愿意 at 2007-10-22 > top of Msdn China Tech,其他数据库开发,SQL Anywhere Studio...
# 28
flyinthesky(我想飞………) (2002-1-27 0:25:07) 得0分
to joi(海天一色)
我的id是用序号生成器生成的,且自动循环,所以你的办法不能满足要求!!

id 一般是用来作唯一约束的,如果有循环产生就会有重复了,那样就失去了它的意义了
xinpingf-白开心 at 2007-10-22 > top of Msdn China Tech,其他数据库开发,SQL Anywhere Studio...

其他数据库开发 Hot Topic