oracle数据库优化辅助SQL语句_oracle

具体详情请看下文代码分析。

--查询正在执行的SQL语句

SELECT OSUSER 电脑登录身份,
PROGRAM 发起请求的程序,
USERNAME 登录系统的用户名,
SCHEMANAME,
B.Cpu_Time 花费cpu的时间,
STATUS,
B.SQL_TEXT 执行的sql,
B.
FROM V$SESSION A
LEFT JOIN V$SQL B ON A.SQL_ADDRESS = B.ADDRESS
AND A.SQL_HASH_VALUE = B.HASH_VALUE
ORDER BY b.cpu_time DESC;

--查询比较耗CPU的SQL语句
select *
from (select v.sql_id,
v.child_number,
v.sql_text,
v.elapsed_time,
v.cpu_time,
v.disk_reads,
rank() over(order by v.cpu_time desc) elapsed_rank
from v$sql v) a
where elapsed_rank <= 10;

--查询比较耗磁盘的SQL语句

select * from (select v.sql_id,
v.child_number, v.sql_text,
v.elapsed_time, v.cpu_time,
v.disk_reads,
rank() over(order by v.disk_reads desc) elapsed_rank
from v$sql v) a where elapsed_rank <= 10;

--查询比较慢的SQL语句

select * from (
select parsing_user_id,executions,sorts
command_type,disk_reads,sql_text from v$sqlarea order by disk_reads desc
)where rownum<10

--Oracle 对未提交事务的查询

select a.sid,a.blocking_session,a.last_call_et,a.event,
object_name,
dbms_rowid.rowid_create(1,data_object_id,rfile#,ROW_WAIT_BLOCK#,ROW_WAIT_ROW#) "rowid" ,
c.sql_text,c.sql_fulltext
from v$session a,v$sqlarea c ,dba_objects,v$datafile
where a.blocking_session is not null
and a.sql_hash_value = c.hash_value
and ROW_WAIT_OBJ#=object_id and file#=ROW_WAIT_FILE#;

ps:oracle常见sql语句优化

1、* 号引起的执行效率

尽量减少使用select * 来进行查询,当你查询使用*,
数据库会进行解析并将*转换为全部列。

select count(si.student_id)
from Student_info si(student_id为索引)

select count(*) from Student_info si
执行时.上面的语句明显会比下面没有用索引统计的语句要快

2、避免在索引列上使用计算.

WHERE 子句中,如果索引列是函数的一部分.优化器将不使用索引而使用全表扫描.

举例 :

低效:

SELECT … FROM DEPT WHERE SAL * 12 > 25000;

高效 :

SELECT … FROM DEPT WHERE SAL > 25000/12;

3、用 >= 替代 >

高效 :

SELECT * FROM EMP WHERE DEPTNO >=4

低效 :

SELECT * FROM EMP WHERE DEPTNO >3

两者的区别在于 , 前者 DBMS 将直接跳到第一个 DEPT 等于 4 的记录而后者将首先定位到 DEPTNO=3 的记录并且向前扫描到第一个 DEPT 大于 3 的记录 .

4 、 用 UNION 替换 OR ( 适用于索引列 )

通常情况下 , 用 UNION 替换 WHERE 子句中的 OR 将会起到较好的效果 . 对索引列使用 OR 将造成全表扫描 . 注意 , 以上规则只针对多个索引列有效 . 如果有 column 没有被索引 , 查询效率可能会因为你没有选择 OR 而降低 . 在下面的例子中 , LOC_ID 和 REGION 上都建有索引 .

高效 :

SELECT LOC_ID , LOC_DESC , REGION

FROM LOCATION

WHERE LOC_ID = 10

UNION

SELECT LOC_ID , LOC_DESC , REGION

FROM LOCATION

WHERE REGION = “MELBOURNE”

低效 :

SELECT LOC_ID , LOC_DESC , REGION

FROM LOCATION

WHERE LOC_ID = 10 OR REGION = “MELBOURNE”

如果你坚持要用 OR, 那就需要返回记录最少的索引列写在最前面 .

5、用 IN 来替换 OR

这是一条简单易记的规则,但是实际的执行效果还须检验,在 ORACLE8i 下,两者的执行路径似乎是相同的.

低效 :

SELECT …. FROM LOCATION WHERE LOC_ID = 10 OR LOC_ID = 20 OR LOC_ID = 30

高效

SELECT … FROM LOCATION WHERE LOC_IN IN (10,20,30);

6、避免在索引列上使用 IS NULL 和 IS NOT NULL

7、where执行顺序

where执行会从至下往上执行

select *

from student_info si --学生信息表

where si.school_id=10 --学院ID

and si.system_id=100--系ID

摆放where子句时,把能过滤大量数据的条件放在最下边

8、from字段中的优化:

Oracle安照从右到左的顺序加载表数据,应该把可以排除数据最多的表放到后面(基础表)。

比如,在关联查询中,把课程表放到后面,成绩表放到前面,因为课程表数据一般比较少,关联的时候可以快速的过滤掉一些成绩数据。

9、索引失效

1、运算导致的索引失效

2、类型转换导致的索引失效

3、在索引列上进行计算引起的问题

4、 Is not null引起的问题(student_id为索引)

5、Order by导致索引失效(student_id为索引)

6、自动选择索引

7、 !=导致索引失效

8、%导致的索引失效

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索oracle优化sql语句
oracle数据库语句优化、数据库语句优化、数据库查询语句优化、数据库sql语句优化、oracle数据库基本语句,以便于您获取更多的相关知识。

时间: 2024-09-10 14:25:12

oracle数据库优化辅助SQL语句_oracle的相关文章

Oracle数据库优化策略总结篇_oracle

为了提高查询效率,我们常常做一些优化策略.本文主要介绍一些Oracle数据库的一些不常见却是非常有用的优化策略,希望能对您有所帮助. SQL语句优化 这个好办,抓到挪借CPU高的SQL语句,依据索引.SQL技巧等修改一下,行之管用. SELECT时不利用函数 在做频繁的查询垄断时,尽量直接select字段名,然后利用C语言代码对查询收获做二次加工,避免让Oracle来做混杂的函数可能数学计算.因为Oracle出于通用性的琢磨,其函数及数学计算的速度远不及用C语言直接编译成机器码后计算来的快. 绑

ORACLE性能优化之SQL语句优化

文章来源:http://blog.csdn.net/jdzms23/article/details/23850783 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] SQL语句执行过程 1 SQL语句的执行步骤 2 典型SELECT语句完整的执行顺序 3 SQL语句执行过程 优化器及执行计划 1 SQL优化方法论 合理应用Hints 1Hints 索引及应用实例 1什么是索引 2索引分类 3什么时候使用索引 4改写SQL使用索引 5索引应用 其他优化技术及应用 1其他优化

Oracle 数据库如何跟踪SQL语句

问题描述 我想把前台对Oracle数据库的每一条执行的sql语句跟踪出来,如何实现?谢谢大家指导! 问题补充:unika_ly12 写道 解决方案 首先,你要以dba身份登陆数据库.第二,为某个用户开启sql跟踪.那个用户就是你要跟踪的.正在执行sql语句的那个用户.命令如下:execute dbms_system.set_sql_trace_in_session(sid,serial#,true)其中参数的意义是,sid-会话id,serial#-序列号,这两个参数可以从v$session中得

ASP.NET访问Oracle数据库:执行SQL语句过程

Web服务器的配置: 1.安装Oracle 客户端 参考<Oracle 9i & PLSQL 全简体中文版数据库安装过程(图解)>,在选择安装的时候仅安装客户端即可 2.为安装客户端的服务器配置Net 服务 参考 <Oracle 9i/10g 数据库 创建数据库 Net 配置 创建表 SQL查询 创建存储过程> 3.新建一个用户,并赋予OBA角色 1.通过PL SQL 建立用户 使用SysDBA系统用户登陆 PLSQL ,建立一个用户 赋给此用户OBA角色.

三层嵌套oracle数据库记录分页sql语句

select * from (select row_.*, rownum rownum_ from (  select * from flow_activity  t order by id desc  )row_ where rownum<=100 ) where rownum_>90   其中这个红色部分 为可变化的部分.

查询Oracle中正在执行和执行过的SQL语句_oracle

查询Oracle正在执行的sql语句及执行该语句的用户 SELECT b.sid oracleID, b.username 登录Oracle用户名, b.serial#, spid 操作系统ID, paddr, sql_text 正在执行的SQL, b.machine 计算机名 FROM v$process a, v$session b, v$sqlarea c WHERE a.addr = b.paddr AND b.sql_hash_value = c.hash_value 其它网友给出的正

oracle数据库用pl/sql中的cmd窗口写语句的时候

问题描述 oracle数据库用pl/sql中的cmd窗口写语句的时候 如图所示,如果想回去把第二行的代码删除怎么办?我用删除键根本没有用 解决方案 3 : SQL>del 2 SQL>run 可以去找找SQL/PLUS缓冲区当前命令操作相关资料 解决方案二: SQL>del 2 SQL>run 可以去找找SQL/PLUS缓冲区当前命令操作相关资料

转换数据库-数据库:Oracle数据库转换成SQL server数据库

问题描述 数据库:Oracle数据库转换成SQL server数据库 把oracle数据库转换成SQL server数据库(2008 r2)版本的,数据迁移,大概百万条数据,有什么好的办法或者是执行语句嘛: 解决方案 我只知道可以把脚本倒出来 然后在sql中执行 解决方案二: http://wenku.baidu.com/link?url=TA7z0XmVyfKHyTQqiPwE6gAdkKbFG7ngBBL75mvjbRbAGFVElPyxOLFSvNT4YskRl8KLdeVdOlHc8a6

在指定的数据库上运行SQL语句的类

数据|数据库|语句 <% '在指定的数据库上运行SQL语句的类'使用方法:'dim runs'set runs=new runsql'runs.setdbn=数据库名'if runs.ifok then' response.write runs.errs' response.end'end if'runs.setsql=sql'runs.run'if runs.ifok then' response.write runs.errs' response.end'else' response.wri