在线等,ORACLE运行一段时间以后变慢

时间:2022-06-27 15:23:31
各位高手,最近公司上了一套系统,数据库用ORACLE,环境如下:
XEON 8CPU
64G RAM
800G SSD

ORACLE启动后,资源占用如下:
top - 16:29:49 up  1:16,  2 users,  load average: 0.00, 0.00, 0.00
Tasks: 315 total,   1 running, 314 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.4%us,  0.0%sy,  0.0%ni, 99.6%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  66109924k total, 65744392k used,   365532k free,     5048k buffers
Swap: 33554428k total,  3168016k used, 30386412k free,  1988304k cached

数据库里面几个数据库在运行,数据记录不算大,最大的表也不过1000万,把所有的连接都断开以后,执行一下SELECT COUNT(1) FROM TABLE大概需要1.67s,数据记录66W+条,如果把所有的都列出来,是个无尽的等待,请问有该如果查起,在线等,小弟感激不尽!

13 个解决方案

#1


数据库调优是一个长期的过程,楼主可以先有选择性的了解一些这些概念: AWR报告 、索引、执行计划、统计信息、等价SQL、等待事件。

#2


引用 1 楼 wmxcn2000 的回复:
数据库调优是一个长期的过程,楼主可以先有选择性的了解一些这些概念: AWR报告 、索引、执行计划、统计信息、等价SQL、等待事件。


谢谢,现在问题是,代码是别人的,不能动了,有没有什么方式可以快点知道原因?

#3


可以把您的问题描述的更详细一点,你最终想实现什么?
从资源利用率上看,系统处于空闲状态

#4


引用 3 楼 sych888 的回复:
可以把您的问题描述的更详细一点,你最终想实现什么?
从资源利用率上看,系统处于空闲状态


简单来说,SQL执行很慢,数据记录66W+条执行SELECT COUNT(1) FROM TABLE大概需要1.67s,如果SELECT * FROM TABLE至少一小时,想让它快起来,回到正常的速度。

#5


在线等,ORACLE运行一段时间以后变慢

#6


SELECT * FROM TABLE 慢是正常的,因为数据量太大吃内存。正常情况也不会全部查出来的吧,有何意义

#7


系统运行一段时间,系统慢的时候,系统监控数据拿出来看看

#8


说的select * from table所有都列出来是不是sqlplus刷屏输出了?这自然是很慢很慢很慢的…… 不过count一张66w的表要1.67秒还是有点慢,毕竟你这是SSD……

还是上忙时的AWR吧。要贴等待事件也先上前台进程的TOP 5,不需要一来就上后台进程的等待事件啊……

#9


引用 8 楼 minsic78 的回复:
说的select * from table所有都列出来是不是sqlplus刷屏输出了?这自然是很慢很慢很慢的…… 不过count一张66w的表要1.67秒还是有点慢,毕竟你这是SSD……

还是上忙时的AWR吧。要贴等待事件也先上前台进程的TOP 5,不需要一来就上后台进程的等待事件啊……

这是忙时的TOP
在线等,ORACLE运行一段时间以后变慢

#10


引用 8 楼 minsic78 的回复:
说的select * from table所有都列出来是不是sqlplus刷屏输出了?这自然是很慢很慢很慢的…… 不过count一张66w的表要1.67秒还是有点慢,毕竟你这是SSD……

还是上忙时的AWR吧。要贴等待事件也先上前台进程的TOP 5,不需要一来就上后台进程的等待事件啊……


感觉随机性较大,还有更慢的
在线等,ORACLE运行一段时间以后变慢

再上张配置比它低得多的MYSQL
在线等,ORACLE运行一段时间以后变慢

感觉根本就不是一个数量级的差别

#11


把oracle的实例参数文件发一个看看

#12


引用 11 楼 minsic78 的回复:
把oracle的实例参数文件发一个看看


C"J/ ��v:CC"Auorcl.__db_cache_size=51002736640
orcl.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment
orcl.__shared_io_pool_size=536870912
orcl.__streams_pool_size=268435456
*._fix_control='7345484:off'
*._partition_large_extents='FALSE'
*.aq_tm_processes=0
*.archive_lag_target=600
*.audit_file_dest='/u01/app/oracle/admin/orcl/adump'
*.audit_trail='db'
*.compatible='12.1.0.2.0'
*.control_files='/u01/app/oracle/oradata/orcl/control01.ctl','/u01/app/oracle/fast_recovery_area/orcl/contCC"=wrol02.ctl'
*.cursor_sharing='FORCE'
*.db_block_checking='OFF'
*.db_block_checksum='TRUE'
*.db_block_size=8192
*.db_cache_advice='OFF'
*.db_cache_size=48G
*.db_domain=''
*.db_files=1024
*.db_keep_cache_size=16G
*.db_name='orcl'
*.db_recovery_file_dest='/u01/app/oracle/fast_recovery_area'
*.db_recovery_file_dest_size=4560m
*.db_writer_processes=2
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'
*.fast_start_mttr_target=600
*.filesystemio_options='SETCC"`ALL'
*.global_names=FALSE
*.job_queue_processes=0
*.large_pool_size=100M
*.local_listener='LISTENER_ORCL'
*.log_archive_max_processes=4
*.log_buffer=40485760
*.log_checkpoint_interval=0
*.log_checkpoint_timeout=0
*.log_checkpoints_to_alert=TRUE
*.open_cursors=500
*.optimizer_index_cost_adj=20
*.parallel_adaptive_multi_user=TRUE
*.parallel_max_servers=8
*.parallel_min_servers=2
*.pga_aggregate_target=8G
*.processes=3000
*.recyclebin='OFF'
*.remote_login_passwordfile='EXCLUSIVE'
*.resoCC")Qurce_limit=TRUE
*.session_cached_cursors=200
*.sga_max_size=10G
*.shared_pool_reserved_size=100M
*.shared_pool_size=1500M
*.undo_management='AUTO'
*.undo_retention=3600
*.undo_tablespace='UNDOTBS1'
*.workarea_size_policy='AUTO'

#13


看下select count(*) from table的执行计划:
explain plan for select count(*) from table;
select * from table(dbms_xplan.display);

看你“忙时”的TOP,压根一点都不忙,也许是走了奇葩的执行计划?

#1


数据库调优是一个长期的过程,楼主可以先有选择性的了解一些这些概念: AWR报告 、索引、执行计划、统计信息、等价SQL、等待事件。

#2


引用 1 楼 wmxcn2000 的回复:
数据库调优是一个长期的过程,楼主可以先有选择性的了解一些这些概念: AWR报告 、索引、执行计划、统计信息、等价SQL、等待事件。


谢谢,现在问题是,代码是别人的,不能动了,有没有什么方式可以快点知道原因?

#3


可以把您的问题描述的更详细一点,你最终想实现什么?
从资源利用率上看,系统处于空闲状态

#4


引用 3 楼 sych888 的回复:
可以把您的问题描述的更详细一点,你最终想实现什么?
从资源利用率上看,系统处于空闲状态


简单来说,SQL执行很慢,数据记录66W+条执行SELECT COUNT(1) FROM TABLE大概需要1.67s,如果SELECT * FROM TABLE至少一小时,想让它快起来,回到正常的速度。

#5


在线等,ORACLE运行一段时间以后变慢

#6


SELECT * FROM TABLE 慢是正常的,因为数据量太大吃内存。正常情况也不会全部查出来的吧,有何意义

#7


系统运行一段时间,系统慢的时候,系统监控数据拿出来看看

#8


说的select * from table所有都列出来是不是sqlplus刷屏输出了?这自然是很慢很慢很慢的…… 不过count一张66w的表要1.67秒还是有点慢,毕竟你这是SSD……

还是上忙时的AWR吧。要贴等待事件也先上前台进程的TOP 5,不需要一来就上后台进程的等待事件啊……

#9


引用 8 楼 minsic78 的回复:
说的select * from table所有都列出来是不是sqlplus刷屏输出了?这自然是很慢很慢很慢的…… 不过count一张66w的表要1.67秒还是有点慢,毕竟你这是SSD……

还是上忙时的AWR吧。要贴等待事件也先上前台进程的TOP 5,不需要一来就上后台进程的等待事件啊……

这是忙时的TOP
在线等,ORACLE运行一段时间以后变慢

#10


引用 8 楼 minsic78 的回复:
说的select * from table所有都列出来是不是sqlplus刷屏输出了?这自然是很慢很慢很慢的…… 不过count一张66w的表要1.67秒还是有点慢,毕竟你这是SSD……

还是上忙时的AWR吧。要贴等待事件也先上前台进程的TOP 5,不需要一来就上后台进程的等待事件啊……


感觉随机性较大,还有更慢的
在线等,ORACLE运行一段时间以后变慢

再上张配置比它低得多的MYSQL
在线等,ORACLE运行一段时间以后变慢

感觉根本就不是一个数量级的差别

#11


把oracle的实例参数文件发一个看看

#12


引用 11 楼 minsic78 的回复:
把oracle的实例参数文件发一个看看


C"J/ ��v:CC"Auorcl.__db_cache_size=51002736640
orcl.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment
orcl.__shared_io_pool_size=536870912
orcl.__streams_pool_size=268435456
*._fix_control='7345484:off'
*._partition_large_extents='FALSE'
*.aq_tm_processes=0
*.archive_lag_target=600
*.audit_file_dest='/u01/app/oracle/admin/orcl/adump'
*.audit_trail='db'
*.compatible='12.1.0.2.0'
*.control_files='/u01/app/oracle/oradata/orcl/control01.ctl','/u01/app/oracle/fast_recovery_area/orcl/contCC"=wrol02.ctl'
*.cursor_sharing='FORCE'
*.db_block_checking='OFF'
*.db_block_checksum='TRUE'
*.db_block_size=8192
*.db_cache_advice='OFF'
*.db_cache_size=48G
*.db_domain=''
*.db_files=1024
*.db_keep_cache_size=16G
*.db_name='orcl'
*.db_recovery_file_dest='/u01/app/oracle/fast_recovery_area'
*.db_recovery_file_dest_size=4560m
*.db_writer_processes=2
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'
*.fast_start_mttr_target=600
*.filesystemio_options='SETCC"`ALL'
*.global_names=FALSE
*.job_queue_processes=0
*.large_pool_size=100M
*.local_listener='LISTENER_ORCL'
*.log_archive_max_processes=4
*.log_buffer=40485760
*.log_checkpoint_interval=0
*.log_checkpoint_timeout=0
*.log_checkpoints_to_alert=TRUE
*.open_cursors=500
*.optimizer_index_cost_adj=20
*.parallel_adaptive_multi_user=TRUE
*.parallel_max_servers=8
*.parallel_min_servers=2
*.pga_aggregate_target=8G
*.processes=3000
*.recyclebin='OFF'
*.remote_login_passwordfile='EXCLUSIVE'
*.resoCC")Qurce_limit=TRUE
*.session_cached_cursors=200
*.sga_max_size=10G
*.shared_pool_reserved_size=100M
*.shared_pool_size=1500M
*.undo_management='AUTO'
*.undo_retention=3600
*.undo_tablespace='UNDOTBS1'
*.workarea_size_policy='AUTO'

#13


看下select count(*) from table的执行计划:
explain plan for select count(*) from table;
select * from table(dbms_xplan.display);

看你“忙时”的TOP,压根一点都不忙,也许是走了奇葩的执行计划?