首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

SQL 性能调优

阅读目录 (1)选择最有效率的表名顺序(只在基于规则的优化器中有效) (2)WHERE子句中的连接顺序 (3)SELECT子句中避免使用 ‘ * ‘ (4)减少访问数据库的次数 (5)在SQL*Plus...(非oracle中)on、where、having这三个都可以加条件的子句中,on是最先执行,where次之,having最后,因为on是先把不 符合条件的记录过滤后才进行统计,它就可以减少中间运算要处理的数据...因为空值不存在于索引列中,所以WHERE子句中对索引列进行空值比较将使ORACLE停用该索引....ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序. ORDER BY中所有的列必须定义为非空. WHERE子句使用的索引和ORDER BY子句中所使用的索引不能并列....当采用下面这种SQL语句的编写,Oracle系统就可以采用基于last_name创建的索引。

3.2K10

分享:Oracle sql语句优化

因此你可以插入1000 条具有相同键值的记录,当然它们都是空!因为空值不存在于索引列中,所以WHERE 子句中对索引列进行空值比较将使ORACLE 停用该索引....IN (10,20,30); 二、SQL语句结构优化 1、选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM 子句中写在最后的表...WHERE 子句,根据这个原理,表之间的连接必须写在其他WHERE 条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE 子句的末尾. 3、SELECT 子句中避免使用' * ': ORACLE...(非oracle中)on、where、having 这三个都可以加条件的子句中,on是最先执行,where 次之,having最后,因为on是先把不符合条件的记录过滤后才进行统计,它就可以减少中间运算要处理的数据...Oracle的优化器有两种优化方式:基于规则的(RBO)和基于代价的(CBO)。 RBO:优化器遵循Oracle内部预定的规则。 CBO:依据语句执行的代价,主要指对CPU和内存的占用。

3K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Oracle SQL性能优化40条,值得收藏

    通过ROWID访问表 ROWID包含了表中记录的物理位置信息,ORACLE采用索引实现了数据和存放数据的物理位置(ROWID)之间的联系,通常索引提供了快速访问ROWID的方法,因此那些基于索引列的查询就可以得到性能上的提高...用EXISTS替代IN 在许多基于基础表的查询中,为了满足一个条件 ,往往需要对另一个表进行联接。在这种情况下,使用EXISTS(或NOT EXISTS)通常将提高查询的效率。...如果你用RBO (RULE BASED OPTIMIZER), 并且所有的连接条件都有索引对应,在这种情况下,基础表就是FROM 子句中列在最后的那个表。...在ORACLE选择执行路径时,唯一性索引的等级高于非唯一性索引。然而这个规则只有当WHERE子句中索引列和常量比较才有效。如果索引列和其他表的索引类相比较。这种子句在优化器中的等级是非常低的。...避免在索引列上使用is null和is not null 避免在索引中使用任何可以为空的列,ORACLE将无法使用该索引。

    2.7K30

    数据库性能优化之SQL语句优化

    当采用下面这种SQL语句的编写,Oracle系统就可以采用基于last_name创建的索引。...更多方面SQL优化资料分享 (1) 选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving...如果至少有一个列不为空,则记录存在于索引中.举例: 如果唯一性索引建立在表的A列和B列上, 并且表中存在一条记录的A,B值为(123,null) , ORACLE将不接受下一条具有相同A,B值(123,...因为空值不存在于索引列中,所以WHERE子句中对索引列进行空值比较将使ORACLE停用该索引....ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序. ORDER BY中所有的列必须定义为非空. WHERE子句使用的索引和ORDER BY子句中所使用的索引不能并列.

    5.7K20

    SQL 性能调优

    (1)选择最有效率的表名顺序(只在基于规则的优化器中有效) ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理...ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等; (5)在SQL*Plus , SQL*Forms和Pro*C中重新设置ARRAYSIZE...(非oracle中)on、where、having这三个都可以加条件的子句中,on是最先执行,where次之,having最后,因为on是先把不 符合条件的记录过滤后才进行统计,它就可以减少中间运算要处理的数据...因为空值不存在于索引列中,所以WHERE子句中对索引列进行空值比较将使ORACLE停用该索引....当采用下面这种SQL语句的编写,Oracle系统就可以采用基于last_name创建的索引。

    2.8K60

    SQL 性能优化 总结

    SQL 性能优化 总结 (1)选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表...(2) WHERE子句中的连接顺序:SQL Server、 ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他 WHERE条件之前, 那些可以过 滤掉最大数量记录的条件必须写在...(非oracle中)on、where、having这三个都可以加条件的子句中,on 是最先执行,where 次之,having 最后,因为on 是先把不符合条件的记录过滤后才进行统 计,它就可以减少中间运算要处理的数据...由此可见,要想过滤条件起到正确的作用,首先要明白这个条件应该在什么时候起作用,然后再决定放在那里。 (12)减少对表的查询: 在含有子查询的SQL语句中,要特别注意减少对表的查询....如果至少有一个列不为空,则记录存在于索引中.举例:如果唯一性索引建立在表的A 列和B 列上,并且表中存在一条记录的A,B 值为(123,null) , ORACLE将不接受下一条具有相同 A,B 值(123

    1.9K20

    SQL优化法则小记

    SQL优化技巧 1.选择最有效率的表名顺序(只在基于规则的优化器中有效): oracle的解析器按照从右到左的顺序处理 from 子句中的表名,from子句中写在最后的表(基础表 driving...(非 oracle 中)on、where、having 这三个都可以加条件的子句中, on 是最先执行,where 次之,having 最后,因为 on 是先把不符合条件的记录过滤后 才进行统计,它就可以减少中间运算要处理的数据...(比如部门表和雇员表)的查询时,避免在select子句中 使用 distinct....如果至少有一个列不为空,则记录存在于索引中.举例: 如 果唯一性索引建立在表的A列和B列上, 并且表中存在一条记录的 A,B 值为 (123,null) , oracle将不接受下一条具有相同 A,B...因为空值不存在于索引列中,所以 where子句中对索引列进行空值比较将使 oracle停用该索引.

    2.1K90

    85-这些SQL调优小技巧,你学废了吗?

    下面这篇文章来自某微信公众号,作者收集了oracle 较早版本的一些SQL优化"技巧",文章标题起的很是诱人....SELECT子句中避免使用 '*' 当你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用 '*' 是一个方便的方法.不幸的是,这是一个非常低效的方法。...= 'PERTH' GROUP BY REGION; (HAVING 中的条件一般用于对一些集合函数的比较,如COUNT() 等等. 除此而外,一般的条件应该写在WHERE子句中) 15....在ORACLE选择执行路径时,唯一性索引的等级高于非唯一性索引. 然而这个规则只有当WHERE子句中索引列和常量比较才有效.如果索引列和其它表的索引类相比较. 这种子句在优化器中的等级是非常低的....因为空值不存在于索引列中,所以WHERE子句中对索引列进行空值比较将使ORACLE停用该索引.

    1.2K10

    oracle数据库sql语句优化(循环语句有几种语句)

    3、选择最有效率的表名顺序(只在基于规则的优化器(RBO)中有效): ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表 (基础表也称为驱动表,driving...8、在SQL*Plus,SQL*Forms和Pro*C中重新设置ARRAYSIZE参数,可以增加每次数据库访问 的检索数据量,建议值为200。...最好能通过WHERE子句限制记录的数目。 (非oracle中)on、where、having这三个都可以加条件的子句中,on是最先执行,where次之, having最后。...如果唯一性索引建立在表的A列和B列上, 并且表中存在一条记录的A,B值为(123,null), ORACLE将不接受下一条具有相同A,B值(123,null)的记录(插入)。...因为空值不存在于索引列中,所以WHERE子句中对索引列进行空 值比较将使ORACLE停用该索引。

    2.9K10

    Java SQL语句优化经验

    . (1) 选择最有效率的表名顺序(只在基于规则的seo/' target='_blank'>优化器中有效): ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表...WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾. (3) SELECT子句中避免使用 ‘ * ‘: ORACLE...如果至少有一个列不为空,则记录存在于索引中.举例: 如果唯一性索引建立在表的A列和B列上, 并且表中存在一条记录的A,B值为(123,null) , ORACLE将不接受下一条具有相同A,B值(123,...因为空值不存在于索引列中,所以WHERE子句中对索引列进行空值比较将使ORACLE停用该索引....ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序. ORDER BY中所有的列必须定义为非空. WHERE子句使用的索引和ORDER BY子句中所使用的索引不能并列.

    2.6K100

    Oracle SQL性能优化

    (1)      选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table...(非oracle中)on、where、having这三个都可以加条件的子句中,on是最先执行,where次之,having最后,因为on是先把不 符合条件的记录过滤后才进行统计,它就可以减少中间运算要处理的数据...(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT....如果至少有一个列不为空,则记录存在于索引中.举例: 如果唯一性索引建立在表的A列和B列上, 并且表中存在一条记录的A,B值为(123,null) , ORACLE将不接受下一条具有相同A,B值(123...因为空值不存在于索引列中,所以WHERE子句中对索引列进行空值比较将使ORACLE停用该索引.

    2.8K70

    oracle怎么使用触发器,Oracle触发器的使用

    启动和关闭例程 Oracle错误信息 用户登陆和关闭会话 特定表和视图的DML操作 DDL语句 2、触发条件(可选) 触发条件是指使用when子句指定一个boolean表达式,当表达式返回true时,则执行触发器相应代码...3、触发操作 触发操作是指包含SQL语句和其他执行代码的PL/SQL块,不仅可以使用PL/SQL开发,也可以使用java或c语言开发,当触发条件为true时,会自动执行触发操作的相应代码。...如果有3个以上的表连接查询, 那就需要选择交叉表(intersection …… 1.在ORACLE中实现SELECT TOP N 由于ORACLE不支持SELECT TOP语句,所以在ORACLE中经常是用...简单地说,实现方法如下所示: SELECT 列名1...列名n from (SELECT 列 …… 数据字典dict总是属于Oracle用户sys的。...分区表通过对分区列的判断,把分区列不同的记录,放到不同的分区中。分区完全对应用透明。 Oracle的分区表可以包括多个分区,每个分区都是一个独立的段(SEGMENT),可以存放到不同的表空间中。

    2.4K30

    SQL优化快速入门

    这儿将基于黄德承大神的Oracle SQL语句优化一书,选取其中比较实用和通用的部分进行介绍。 ?...任何SQL语句,只要在where子句中实用了is null或is not null,那么Oracle优化器不会使用索引。...选择最优效率的表名顺序(Oracle解析器按照从右到左的顺序处理FROM子句中的表名),比如select count(*) from tab1 inner join tab2,这是优先检索表2,并将表2...在SQL SERVER中,查看执行计划,发现并没有区别 减少查询的次数(包括对表查询),将多个分离的查询合并 能够在WHERE字句中使用的条件,尽量避免放在HAVING字句中 用...用>=代替> 注意隐式转换 UNION-ALL替换UNION 在严格遵守条件的情况下(所有的列必须包含在相同的索引中并保持在索引中的排列顺序,所有的列必须定义为非空),

    1.4K90

    java面试(3)SQL优化

    应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描,可以使用union/union all 代替 in 和 not...如果开发时 间允许,基于游标的方法和基于集的方法都可以尝试一下,看哪一种方法的效果更好。...减少对表的查询: 在含有子查询的SQL语句中,要特别注意减少对表的查询.例子: SELECT TAB_NAME FROM TABLES WHERE (TAB_NAME,DB_VER) = ( SELECT...用EXISTS替代IN、用NOT EXISTS替代NOT IN: 在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率...( SELECT ‘X’ FROM EMP E WHERE E.DEPT_NO = D.DEPT_NO); sql语句用大写的;因为oracle总是先解析sql语句,把小写的字母转换成大写的再执行

    3.2K20

    深入剖析-关于分页语句的性能优化

    rn>=n; 针对正确的分页语句和错误的分页语句会产生不同的执行计划,举例如下: SQL> create table t as select * from dba_objects; Table created...从错误的执行语句框架中我们可以看到,只要不是正确分页语句框架,oracle都会扫描列是否有非空约束,由于索引是不存空值的,为了能够保证可能为空的object_id列也存在索引中,我们要在索引中添加一个组合列的常量索引,创建索引语句如下: create...注:如果有些优化器没走索引可以在sql语句中增加一个索引的hint。...3 where等值条件过滤order by分页 分页场景三: select * from t where owner=’SYS’ order by object_id 有where条件过滤,然后基于某列排序再分页

    1K90

    Oracle Sql优化

    8.如果索引不是基于函数的,那么当在Where子句中对索引列使用函数时,索引不再起作用。 9.Where子句中避免在索引列上使用计算,否则将导致索引失效而进行全表扫描。...13.Oracle从下到上处理Where子句中多个查询条件,所以表连接语句应写在其他Where条件前,可以过滤掉最大数量记录的条件必须写在Where子句的末尾。...16.当在Sql语句中连接多个表时,使用表的别名,并将之作为每列的前缀。这样可以减少解析时间。...Oracle的优化器有两种优化方式:基于规则的(RBO)和基于代价的(CBO)。 2.RBO:优化器遵循Oracle内部预定的规则。 3.CBO:依据语句执行的代价,主要指对CPU和内存的占用。...3.语句级别:通过SQL> SELECT /*+ALL+_ROWS*/ ……;来设定。

    1.4K30

    SQL索引优化

    具体到方法上,就必须熟悉数据库应用程序中的所有SQL语句,从中统计出常用的可能对性能有影响的部分SQL,分析、归纳出作为Where条件子句的字段及其组合方式;在这一基础上可以初步判断出哪些表的哪些字段应该建立索引...例1:下列SQL条件语句中的列都建有恰当的索引,但30万行数据情况下执行速度却非常慢: select * from record where substrb(CardNo,1,4)='5378'(13...去掉Where子句中的IS NULL和IS NOT NULL。...假设SQL搜索条件DisposalCourseFlag=2,利用DisposalCourseFlag列上的索引进行数据搜索效率,往往不比全表扫描的高,ORACLE因此对索引“视而不见”,从而在查询路径的选择中...(TABLE ACCESSFULL),因为只有当数据列能够等式匹配时,基于函数的索引才能生效,这样对于这种索引的计划和维护的要求都很高。

    1.1K80

    Oracle初级索引学习总结

    对于多列索引,假如一个表中的主键(ID,Name,Age三个字段联合索引),只有当Where条件中包含索引中的前一个或几个列时才会用到索引。   ...什么情况下应该为表建立索引   一般来说,满足下列条件的应该建立索引:   1、列经常被用在Where条件中或连接条件中   2、列的数据比较分散,即重复值不多   3、列包含大量的空值   4、几个列经常一起用在...Where条件或连接条件中(联合索引)   5、大部分的检索只返回大表中的小部分记录(2%~5%) 什么情况下不应该为表建立索引   不应该建立索引的情况有:   1、表的数据量不大   2、列很少用在查询条件中...explain会获得Oracle对该sql的解析(plan),可以明确地看到Oracle是如何优化该sql的。...  当where子句中有多个索引列,且包含非“=”号时,Oracle会放弃使用非“=”号的索引   当where子句中有多个索引列,且都为非“=”号时,Oracle将只使用一个索引,至于使用那个索引,

    77620

    SQL优化

    一、SQL语句编写注意问题 下面就某些SQL语句的where子句编写中需要注意的问题作详细介绍。...在这些where子句中,即使某些列存在索引,但是由于编写了劣质的SQL,系统在运行该SQL语句时也不能使用该索引,而同样使用全表扫描,这就造成了响应速度的极大降低。 1....我们一起来看一个例子,假定有一个职工表(employee),对于 一个职工的姓和名分成两列存放(FIRST_NAME和LAST_NAME),现在要查询一个叫比尔.克林顿(Bill Cliton)的职工。...select * from employss where first_name||”||last_name =’Beill Cliton'; 当采用下面这种SQL语句的编写,Oracle系统就可以采用基于...可以采用如下的查询SQL语句: select * from employee where last_name like ‘%cliton%'; 这里由于通配符(%)在搜寻词首出现,所以Oracle系统不使用

    4.8K20
    领券