sql优化(oracle)- 第一部分 知识准备

第一部分 知识准备                                              
    1.  sql执行过程                              
    2.  sql 共享                              
    3.  绑定变量                        
    4.  数据表访问方式         
    5.  sql 执行顺序           
    6.  索引使用             
                      

1. sql执行过程
1)执行过程
  当一个oracle实例接收到一条sql后,执行过程如下:

  1) create  a cursor  创建游标
  2) parse the statement 分析语句
  3)  describe results of a query 描述查询的结果集
  4)define output of a query 定义查询的输出数据
  5)bind any variables 绑定变量
  6)parallelize the statement 并行执行语句
  7)run the statement 运行语句
  8)fetch rows of a query 取查询结果
  9)close the cursor 关闭游标

2.SQL 共享
  1. 为不重复解析相同的SQL语句,oracle 将执行过的SQL语句存放在内存的共享池(shared buffer pool)中,可以被所有数据库用户共享
  2. 当执行一个SQL语句时,如果它和之前执行过的语句完全相同(注意同义词和表是不同对象),oracle就能获得已经被解析的语句;

3.bind variables绑定变量
1)解决重编译问题
eg1:
 insert into tab1(col1,col2) values (val1,val2); --普通方式
 insert into tab1(col1,col2) values (:v1,:v2); --绑定变量,只需编译一次

eg2:使用PreparedStatement
 PreparedStatement ps = con.prepareStatement("insert into tab1 (col1, col2) values (?,?)");

2)共享游标
好处:减少解析;提高内存使用率;动态内存调整
假如输入如下两个sql:
 select * from tab1 where id = :c;
 select * from tab1 where id = :d;
这两句sql会被转化为:
 select * from tab1 where id = :b;

4.访问数据表方式
1)全表扫描——顺序访问表中每条记录
  oracle采用一个读入多个数据块的方式优化全表扫描
2)通过rowid访问表——rowid包含了表中记录的物理位置信息, 基于rowid访问方式可以提高访问表的效率
  oracle通过索引实现了数据和存放数据位置rowid之间的联系,通常索引提供了快速访问rowid的方法

5. select sql执行顺序
1)select子句

  (8)SELECT (9)DISTINCT  (11)<Top Num> <select list>
   (1)FROM <left_table>
   (3)<join_type> JOIN <right_table>
   (2)ON <join_condition>
   (4)WHERE <where_condition>
   (5)GROUP BY <group_by_list>
   (6)WITH <CUBE | RollUP>
   (7)HAVING <having_condition>
   (10)ORDER BY <order_by_list>

2)执行顺序说明
  1)FROM [left table]——from前的表做笛卡尔集 ——虚拟表VT1
  2) ON <join condition>——筛选——VT2
  3) [join type] JOIN [right table]——连接——VT3
  4) WHERE ——where筛选——VT4
  5)GROUP BY ——按照GROUP BY子句中的列对VT4中行分组——VT5
  6)CUBE|ROLLUP——分组,eg:ROLLUP(A, B),首先会对(A、B)进行GROUP BY,然后对(A)进行GROUP BY,最后对全表GROUP BY
                    CUBE(A,B), 首先对(A、B)GROUP BY, 然后(A)、(B) GROUP BY, 最后全表GROUP BY;
                         ——VT6

  7) HAVING——HAVING筛选——VT7
  8)SELECT——VT8
  9) DISTINCT——移除重复的行——VT9
  10)ORDER BY——按照order by子句中的列将VT9中列表排序,生成游标——VC10
  11) TOP ——从VC10的开始处选择一定数量或者比例的行——VT11,返回结果

3)注意事项
  1. 只有ORDER BY 子句中可以使用select列表中列的别名
     如果要在其他地方使用需要使用如下方式:
      SELECT * FROM (SELECT NAME, SALARY AS s FROM EMP ) vt WHERE vt.s<5000;
  2.  使用了ORDER BY子句的查询不能用作表表达式(视图、内联表值函数、子查询、派生表和共用表达式),如下的语句都会产生错误
    create table tab1 as select * from student order by score;
    select * from (select * from student order by score);

时间: 2024-10-19 01:17:48

sql优化(oracle)- 第一部分 知识准备的相关文章

SQL优化技巧(Oracle)

SQL优化技巧(1): Where子句中的连接顺序:oracle采用自下而 上的顺序解析where子句,根据这个原理,表 之间的连接必须写在其他where条件之前,那些可以过滤掉大量记录的条件 必须写在where子句的末尾. 例如 低效:select * from report_sale_account e where hsje>5000 and dzxl = '000001' and 25<(select count(*) from report_sale_account where cod

sql优化(oracle)

永不放弃,一切皆有可能!!! 只为成功找方法,不为失败找借口! sql优化(oracle) 目录 第一部分知识准备                            第二部分 常用sql用法和注意事项                                第三部分  sql优化总结 1.  sql执行过程  1. exists 和 in                                                      1. 优化一般原则 2.  sql 共享

基于oracle的sql优化方法论

Oracle数据库里SQL优化的终极目标就是要缩短目标SQL语句的执行时间.要达到上述目的,我们通常只有如下三种方法可以选择: 1.降低目标SQL语句的资源消耗: 2.并行执行目标SQL语句: 3.平衡系统的资源消耗. "方法1:降低目标SQL语句的资源消耗"以缩短执行时间,这是最常用的SQL优化方法.这种方法的核心是要么通过在不更改业务逻辑的情况下改写SQL来降低目标SQL语句的资源消耗,要么不改SQL但通过调整执行计划或相关表的数据来降低目标SQL语句的资源消耗. 方法2:并行执行

[terry笔记]Oracle SQL 优化之sql tuning advisor (STA)

前言:经常可以碰到优化sql的需求,开发人员直接扔过来一个SQL让DBA优化,然后怎么办? 当然,经验丰富的DBA可以从各种方向下手,有时通过建立正确索引即可获得很好的优化效果,但是那些复杂SQL错综复杂的表关联,却让DBA们满头大汗. 如下特别介绍一种oracle官方提供的科学优化方法STA,经过实践,不敢说此特性绝对有效,但是可以开阔思路,并且从中学到许多知识,不再用“猜”的方式去创建索引了. SQL优化器SQL Tuning Advisor (STA),是oracle的sql优化补助工具.

oracle 11g亿级复杂SQL优化一例(数量级性能提升)

自从16年之后,因为工作原因,项目中就没有再使用oracle了,最近最近支持一个项目,又要开始负责这块事情了.最近在跑性能测试,配置全部调好之后,不少sql还存在性能低下的问题,主要涉及执行计划的不合理,以及相关pga隐含参数的优化.可能因为几年不接触的原因,略微有些生疏需要review了.这里以最近优化过的某个比较典型的例子为例(这里只讲思路.因为涉及到核心机密,不给出最终结果,16C [email protected]/45GB内存/fio 85/15 iops 8500/1500 配置,优

oracle sql优化技巧

数据库方面一直是自己的薄弱项,现在以本文慢慢积累总结oracle sql优化的一些技巧. 1.首先大家很容易想到的一切优化技巧--索引,索引有啥用?索引在表数据量很大时添加索引确实能加快查询速度,通过索引查询能很好地避免全表扫描. 但应该也要注意的时这是在数据量较大的时候.同时数据较小时,反而浪费索引空间.另外,添加索引之后数据的插入,更新反而会变慢,在插入或修改记录 时需要新建索引并排序. 索引创建语句: create [unique] index xxx on A(column 1,colu

Oracle优化器的基础知识(二)

一. 表连接 顾名思义,表连接就是指多个表之间用连接条件连接在一起,使用表连接的目标SQL的目的就是从多个表获取存储在这些表中的不同维度的数据.体现在SQL语句上,含表连接的目标SQL的from部分会出现多个表,而这些SQL的where条件部分则会定义具体的表连接条件. 当优化器解析含表连接的目标SQL时,它除了会根据目标SQL的SQL文本的写法来决定表连接的类型之外,还必须决定如下三件事情才能得到最终的执行计划. 1.表连接顺序 不管目标SQL中有多少个表做表连接,Oracle在实际执行该SQ

SQL性能优化(Oracle)

首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的,比如一条SQL语句如果用来从一个 10万条记录的表中查1条记录,那查询优化器会选择"索引查找"方式,如果该表进行了归档,当前只剩下5000条记录了,那查询优化器就会改变方案,采用 "全表扫描"方式. 可见,执行计划并不是固定的,它是"个性化的".产生一个正确的"执行计划"有两点很重要: (1)

oracle sql优化

第一掌 避免对列的操作 任何对列的操作都可能导致全表扫描,这里所谓的操作包括数据库函数.计算表达式等等,查询时要尽可能将操作移至等式的右边,甚至去掉函数. 例1:下列SQL条件语句中的列都建有恰当的索引,但30万行数据情况下执行速度却非常慢: select * from record where  substrb(CardNo,1,4)='5378'(13秒) select * from record where  amount/30< 1000(11秒) select * from recor