从操作系统命令TOP到数据库的优化

简介:
对于一个刚开始学习数据库优化的新手DBA来说,当用户反馈系统比较慢时,他会非常紧张,面对数据库,他无从下手,不知道从哪里开始着手来优化数据库,查找系统

存在的问题。

今天我们通过操作系统命令TOP,来优化数据,我们如何把操作系统与数据库关联起来哪,我们主要是通过操作系统TOP命令找到最消耗资源OS PID进程。

通过OS PID与V$PROCESS动态性能试图进行管理。我们知道V$PROCESS是被认为从操作系统到数据库的入口,而进入数据库内部,进程需要创建回话(SESSION)执行数据库操作的SQL语句,一般情况下,一个进程只会创建一个回话,但是在特殊的情况下,一个进程也可以创建多个数据库回话。回话的信息是通过动态性能试图V$SESSION来进行管理和体现的。

那么我们通过一个实验来看一下,如何完成从操作系统命令到数据库内部的操作,我们模拟一个出现故障的场景,我们通过操作系统命令TOP,进行观察,找到操作系统进程占CPU资源比较高的进程。

1.首先我们建立一个测试表t1,向表中插入一些数据。

SQL>create table t1 as select * from emp;
SQL>insert into t1 as select * from t1;
SQL>/
SQL>/
SQL>/
SQL>/

使表T1大约有几万条记录。
2.开3,4个会话,其中表t1有几万行的数据,同时运行,立刻查询上面的语句

declare
v1 emp.sal%type;
begin
for n in 1..100 loop
for k in 1..100 loop
select count(*) into v1 from t1;
end loop;
dbms_lock.sleep(1);
end loop;
end;
/

3.通过操作系统命令TOP找到消耗CPU资源的进程

top - 12:57:42 up 19 min,  2 users,  load average: 1.18, 0.35, 0.23
Tasks: 132 total,   2 running, 130 sleeping,   0 stopped,   0 zombie
Cpu(s): 20.5%us,  5.9%sy,  0.0%ni, 73.1%id,  0.5%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1034664k total,   883716k used,   150948k free,   125584k buffers
Swap:  4120664k total,        0k used,  4120664k free,   609440k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                  
 5182 oracle    19   0  368m  50m  48m S 37.9  5.0   0:03.57 oracle                                                   
    1 root      15   0  2160  652  564 S  0.0  0.1   0:02.30 init                                                     
    2 root      RT  -5     0    0    0 S  0.0  0.0   0:00.05 migration/0                                              
    3 root      34  19     0    0    0 S  0.0  0.0   0:00.00 ksoftirqd/0                                              
    4 root      RT  -5     0    0    0 S  0.0  0.0   0:00.04 migration/1                                              
    5 root      34  19     0    0    0 S  0.0  0.0   0:00.00 ksoftirqd/1                                              
    6 root      10  -5     0    0    0 S  0.0  0.0   0:00.04 events/0                                                 
    7 root      10  -5     0    0    0 S  0.0  0.0   0:00.00 events/1                                                 
    8 root      11  -5     0    0    0 S  0.0  0.0   0:00.01 khelper                                                  
    9 root      10  -5     0    0    0 S  0.0  0.0   0:00.00 kthread                                                  
   13 root      10  -5     0    0    0 S  0.0  0.0   0:00.10 kblockd/0                                                
   14 root      10  -5     0    0    0 S  0.0  0.0   0:00.02 kblockd/1                                                
   15 root      16  -5     0    0    0 S  0.0  0.0   0:00.00 kacpid                                                   
  179 root      12  -5     0    0    0 S  0.0  0.0   0:00.00 cqueue/0                                                 
  180 root      12  -5     0    0    0 S  0.0  0.0   0:00.00 cqueue/1                                                 
  183 root      11  -5     0    0    0 S  0.0  0.0   0:00.00 khubd                                                    
  185 root      10  -5     0    0    0 S  0.0  0.0   0:00.00 kseriod                                                  
  252 root      18   0     0    0    0 S  0.0  0.0   0:00.00 khungtaskd                                               
  253 root      17   0     0    0    0 S  0.0  0.0   0:00.00 pdflush                                                  
  254 root      15   0     0    0    0 S  0.0  0.0   0:00.03 pdflush

4.我们看到进程PID等于5182,我们下面的一个脚本,关联V$PROCESS试图和V$SESSION试图、V$SQLTEST试图,可以找出这个进程正在执行的SQL语句,这里只需要一个“发动”条件,就是进程(PID):

SQL>SELECT /*+ ORDERED */
 sql_text
  FROM v$sqltext a
 WHERE (a.hash_value, a.address) IN
       (SELECT DECODE(sql_hash_value, 0, prev_hash_value, sql_hash_value),
               DECODE(sql_hash_value, 0, prev_sql_addr, sql_address)
          FROM v$session b
         WHERE b.paddr =
               (SELECT addr FROM v$process c WHERE c.spid = '&pid'))
 ORDER BY piece ASC;
/
提示输入变量值。
Enter value for pid: 5182

old   9:  (SELECT addr FROM v$process c WHERE c.spid = '&pid'))
new   9:  (SELECT addr FROM v$process c WHERE c.spid = '5182'))

SQL_TEXT
----------------------------------------------------------------
declare v1  number; begin for n in 1..100 loop for k in 1..100 l
oop select count(*) into v1 from t1; end loop; dbms_lock.sleep(1
); end loop; end;

注:这里我们使用了3个动态性能试图,获取到了执行的SQL语句。我们的逻辑是:
1)首先输入一个PID,这个PID即是process id,也就是在TOP命令中看到的PID.
2)通过PID和v$process.spid相关,我们可以获得process的详细信息。
3)通过v$process.addr和v$session.paddr相关联,可以获取session的相关详细信息。
4)再结合v$sqltest,即可获得当前session正在执行的SQL语句。
总结:
1.首先我们通过操作系统命令TOP找到了PID.
2.我们结合3个试图,就找打了当前正在疯狂消耗CPU的罪魁祸首,那么下面的工作就是如何优化这个SQL,我们可以进一步通过
dbms_system包跟踪改进程,或者通过AWR获取该SQL的执行计划。来改变SQL的执行计划,达到优化的目的。

本文转自ICT时空 dbasdk博客,原文链接: 从操作系统命令TOP到数据库的优化 ,如需转载请自行联系原博主。

相关文章
|
JavaScript 关系型数据库 MySQL
❤Nodejs 第六章(操作本地数据库前置知识优化)
【4月更文挑战第6天】本文介绍了Node.js操作本地数据库的前置配置和优化,包括处理接口跨域的CORS中间件,以及解析请求数据的body-parser、cookie-parser和multer。还讲解了与MySQL数据库交互的两种方式:`createPool`(适用于高并发,通过连接池管理连接)和`createConnection`(适用于低负载)。
17 0
|
21天前
|
存储 关系型数据库 MySQL
轻松入门MySQL:数据库设计之范式规范,优化企业管理系统效率(21)
轻松入门MySQL:数据库设计之范式规范,优化企业管理系统效率(21)
|
1月前
|
SQL 缓存 PHP
PHP技术探究:优化数据库查询效率的实用方法
本文将深入探讨PHP中优化数据库查询效率的实用方法,包括索引优化、SQL语句优化以及缓存机制的应用。通过合理的优化策略和技巧,可以显著提升系统性能,提高用户体验,是PHP开发者不容忽视的重要议题。
|
1月前
|
SQL 关系型数据库 MySQL
|
21天前
|
存储 关系型数据库 MySQL
MySQL数据库性能大揭秘:表设计优化的高效策略(优化数据类型、增加冗余字段、拆分表以及使用非空约束)
MySQL数据库性能大揭秘:表设计优化的高效策略(优化数据类型、增加冗余字段、拆分表以及使用非空约束)
|
2天前
|
SQL XML 数据库
sql导入数据库命令
在SQL Server中,数据库导入可通过多种方式实现:1) 使用SSMS的“导入数据”向导从各种源(如Excel、CSV)导入;2) BULK INSERT语句适用于导入文本文件;3) bcp命令行工具进行批量数据交换;4) OPENROWSET函数直接从外部数据源(如Excel)插入数据。在操作前,请记得备份数据库,并可能需对数据进行预处理以符合SQL Server要求。注意不同方法可能依版本和配置而异。
|
7天前
|
SQL 数据库 HIVE
Hive【基础知识 05】常用DDL操作(数据库操作+创建表+修改表+清空删除表+其他命令)
【4月更文挑战第8天】Hive【基础知识 05】常用DDL操作(数据库操作+创建表+修改表+清空删除表+其他命令)
19 0
|
8天前
|
SQL 缓存 Java
Java数据库连接池:优化数据库访问性能
【4月更文挑战第16天】本文探讨了Java数据库连接池的重要性和优势,它能减少延迟、提高效率并增强系统的可伸缩性和稳定性。通过选择如Apache DBCP、C3P0或HikariCP等连接池技术,并进行正确配置和集成,开发者可以优化数据库访问性能。此外,批处理、缓存、索引优化和SQL调整也是提升性能的有效手段。掌握数据库连接池的使用是优化Java企业级应用的关键。
|
9天前
|
SQL 关系型数据库 数据库
【后端面经】【数据库与MySQL】SQL优化:如何发现SQL中的问题?
【4月更文挑战第12天】数据库优化涉及硬件升级、操作系统调整、服务器/引擎优化和SQL优化。SQL优化目标是减少磁盘IO和内存/CPU消耗。`EXPLAIN`命令用于检查SQL执行计划,关注`type`、`possible_keys`、`key`、`rows`和`filtered`字段。设计索引时考虑外键、频繁出现在`where`、`order by`和关联查询中的列,以及区分度高的列。大数据表改结构需谨慎,可能需要停机、低峰期变更或新建表。面试中应准备SQL优化案例,如覆盖索引、优化`order by`、`count`和索引提示。优化分页查询时避免大偏移量,可利用上一批的最大ID进行限制。
36 3
|
21天前
|
缓存 监控 数据库
优化数据库查询性能的八大技巧
在今天的互联网时代,数据库是许多应用程序的核心组件之一。优化数据库查询性能是提升应用程序整体性能的关键。本文介绍了八种有效的技巧,帮助开发人员提高数据库查询性能,从而提升应用程序的响应速度和用户体验。