SQL和PL/SQL的性能优化之三--表访问调优

1、一般来说,在where子句的条件选择性不是很高时,全表扫描是最合适的检索路径,而在条件选择很高时,索引或聚簇方法将更合适。

就IO而言,无论记录多大,每个索引访问的开销几乎都是相同的,然而,记录越长,全表扫描必须读取的数据块就越多。

1.1 优化器目标(optimizer goal) 设置为ALL_ROWS和FIRST)ROWS对是否使用索引差异很大。

1.2 基于索引的执行计划更能够从缓冲区高速缓存中的缓存块上获得益处。参数OPTIMIZER_INDEX_CACHING可用来改变优化器估算缓冲相关的行为,其值设置的高可以导致优化器降低评估中的索此读的IO开销。

1.3 基于索引的检索同样更能够从数据分布上受益。如果值在一个范围内的所有记录都在同一个块中,索引范围扫描将更加高效。

1.4 全表扫描倾向于在单个操作中一次性从磁盘读取多个块,而索引查询一次只读取一个块。

2、如果查询条件是不等,那么ORACLE通常不使用索引。如果你认为这个查询将从使用索引的方法中受益,那么请使用IN,OR或>重写查询。你仍需要使用提示或列的直方图来促成索引。

避免对索引列做空值检索。替代的方法是将列定义成非空,并设置默认值,然后用默认值进行检索,性能将大大提升。

可以使用索引查找非空值。如果大多数的值都是空的,那么索引将会程媛媛小,而且十分高效,因为空值是不会被索此的。

仅当查询字符串不以通配符(%,_)开头时,ORACLE才能够使用B*树索引高效地处理包含LIKE运算符的查询。

3、优化必要的全表扫描

A、让表变小以减少逻辑快读取数量

B、提高数据库IO的效率

C、通过缓存或抽样降低扫描的开销

D、使用并行查询为扫描分配更多资源

E、执行快速全索此扫描来代替全表扫描

F、分区,只读所选择的分区

----减少数据块数量的方式

A、重建表来降低高水位线

B、修改PCTFREE或PCTUSED参数以向每个数据块塞入更多的记录

C、减少记录长度,可能是将大的且不常访问的列迁移到独立的表中

D、压缩表中的数据

重建表:ALTER TABLE ... MOVE;

压缩表:alter table hwm_test enable row movement;--激活行迁移

alter table hwm_test shrink space;

只有当一张表包含的记录远远少于它曾经拥有的记录时,才需要重建或压缩表双重置高水位线。

减少记录长度,对LOB字段进行离线存储

create table outofline_lob_table

(id number not null primary key,

control_data char(200) not null,

lob_data blob) lob(lob_data) store as (disable storage in row);

--------压缩表:[11G] create table ...compress for all operations;--行压缩,减少行重复率

[11.2G] 可使用列压缩以减少列的重复率

compress for archive level = (1或2或3);--值越高压缩效果越好,但成本也越高。

SAMPLE子句可以用来得到近似的答案,以满足那些通常需要全表扫描的查询

select sum(amount) / sum(sum(amount))  over() pct_amount

from sh.sales sample block(5) jion sh.products using(prod_id)

group by prod_name;

并行查询---满足以下任一或全部条件,全表扫描开并行性能就可能显著提升。

A、主机上有多个处理器

B、存在空闭CPU能力,否则会对其它会话产生影响

C、表中数据分布在多个磁盘驱动器上

快速全索引扫描(提示:INDEX_FFS)  INDEX FAST FULL SCAN

优势:A、在索引范围扫描或全索引扫描中,索引块是按照键的顺序一次被读取一块。在快速全索引扫描中,块将按它们出现在磁盘中的顺序被读取,并且ORACLE能够在每次IO操作中读取多个块。

B、快速全索引扫描可以并行执行,而其它索引只能串行处理(提示:PARALLEL_INDEX)

C、索引几乎总是比相应的表小,可以减少全表扫描相应的IO数量

劣势:索此块分裂或记录删除都可能导致十分严重的空间浪费,此时FFS更慢。

原文地址:https://www.cnblogs.com/optimize/p/10119810.html

时间: 2024-10-08 08:38:25

SQL和PL/SQL的性能优化之三--表访问调优的相关文章

spark性能优化:数据倾斜调优

调优概述 有的时候,我们可能会遇到大数据计算中一个最棘手的问题--数据倾斜,此时Spark作业的性能会比期望差很多.数据倾斜调优,就是使用各种技术方案解决不同类型的数据倾斜问题,以保证Spark作业的性能. 数据倾斜发生时的现象 1.绝大多数task执行得都非常快,但个别task执行极慢.比如,总共有1000个task,997个task都在1分钟之内执行完了,但是剩余两三个task却要一两个小时.这种情况很常见. 2.原本能够正常执行的Spark作业,某天突然报出OOM(内存溢出)异常,观察异常

Ceph性能优化 之 配置参数调优

该文同时发表在盛大游戏G云微信公众号,粘贴于此,方便各位查阅 Ceph,相信很多IT朋友都听过.因为搭上了Openstack的顺风车,Ceph火了,而且越来越火.然而要用好Ceph却也不是件易事,在QQ群里就经常听到有初学者抱怨Ceph性能太烂,不好用.事实果真如此吗!如果你采用Ceph的默认配置来运行你的Ceph集群,性能自然不能如人意.俗话说,玉不琢,不成器:Ceph也有它的脾性,经过良好配置优化的Ceph性能还是不错的.下文简单分享下,盛大游戏G云在Ceph优化上的一些实际经验,如有错误之

《跨 界 之SQL、PL/SQL优化指南》目录上

优化新作,<跨 界 之SQL.PL/SQL优化指南>详细目录. 目    录 一.理论篇....................................................................10    1.1). SQL的处理过程.......................................................10    1.2). 连接方式(JOIN METHODS)................................

《跨 界 之SQL、PL/SQL优化指南》目录下

目 录 三. 常见不合理的语句........................................................100   3.1). 没有使用绑定变量....................................................100   3.2). 隐含转换............................................................101   3.3). 索引列上进行运算...........

【SQL server初级】数据库性能优化三:程序操作优化

数据库优化包含以下三部分,数据库自身的优化,数据库表优化,程序操作优化.此文为第三部分 数据库性能优化三:程序操作优化 概述:程序访问优化也可以认为是访问SQL语句的优化,一个好的SQL语句是可以减少非常多的程序性能的,下面列出常用错误习惯,并且提出相应的解决方案 一.操作符优化 1. IN.NOT IN 操作符 IN和EXISTS 性能有外表和内表区分的,但是在大数据量的表中推荐用EXISTS 代替IN . Not IN 不走索引的是绝对不能用的,可以用NOT EXISTS 代替 2. IS 

动态SQL和PL/SQL的EXECUTE选项分析

EXECUTE IMMEDIATE代替了以前Oracle8i中DBMS_SQL package包.它解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块.动态创建和执行SQL语句性能超前,EXECUTE IMMEDIATE的目标在于减小企业费用并获得较高的性能,较之以前它相当容易编码.尽管DBMS_SQL仍然可用,但是推荐使用EXECUTE IMMEDIATE,因为它获的收益在包之上. 使用技巧 1. EXECUTE IMMEDIATE将不会提交一个DML事务执行,应该显式提交. 如果通

PL/SQL不能格式化SQL:--PL/SQL Beautifier could not parse text

PL/SQL sql语句美化器点击没有反应.查看下面提示PL/SQL Beautifier could not parse text.本人此次产生的原因是sql语句语法错误. 工具栏处(如果没有此按钮,空白处右击----Customize----edit) PLD 6以上版本有对DML代码格式化的功能.在SQL Window或Program Window中选中部分代码(如果不选则对整个窗口的代码操作),在菜单中选Edit -> PL/SQL Beautifier,得到格式化的代码.对于非法的DM

SQL、PL/SQL、DDL、DML、TCL介绍

SQL:结构化查询语言(Structured Query Language) PL/SQL:过程化SQL语言(Procedural Language/SQL) DDL(Data Definition Language 数据定义语言) DML(Data Manipulation Language 数据操控语言) Tcl (最早称为"工具命令语言""Tool Command Language", 但是目前已经不是这个含义,不过我们仍然称呼它为TCL)是一种 脚本语言.

Oracle 和pl/sql以及pl/sql developer

oracle是厂家的名字,也是数据库产品的名字.比如sybase公司的sybase数据库.而微软公司的数据库产品就叫sqlserver了. pl/sql 是oracle数据库所用的sql语言的名称.微软的sqlserver的sql语言叫做t-sql,你可以认为他是他自己sql语言的“小名”,呵呵 pl/sql developer是一个开发工具,用它来写pl/sql语句.对应的sqlserver,大概就是查询分析器吧.