OLTP应用优化SQL方法思路思考
OLTP应用优化SQL思路:由小到大,从限制性最强返回记录最少的连接开始,基本采用嵌套循环连接技术,依次完成其它表的连接,并在访问每张表时,合理使用索引,特别是复合索引技术。具体方法步骤:(1)限制性最强的表作为驱动表,条件字段应该有索引,包括主键,唯一索引,复合索引等。(2)考虑原则:在每次连接操作之后,尽量保证返回记录数罪少,再传递给下一个链接操作。(3)每次连接基本采用嵌套循环连接技术。(4)尽量通过在被驱动表的连接字段上的索引,访问被驱动表。(5)如果被驱动表上还有其它限制性条件,可以遵循复合索引创建原则,创
学会写高级查询
在不同的数据库应用部署可以用到:-导出建序列语句 SELECT 'CREATE SEQUENCE' || a.sequence_name ||' MINVALUE' || a.min_value || 'MAXVALUE' || a.max_value || 'START WITH' || a.last_number || 'INCREMENT BY' || a.increment_by || 'CACHE' || a.cache_size ||';' FROM user_sequences a;--导出建表语句 SELECT 'CREATE TABLE ' || A.TABLE_NAME || ' AS SELECT * FROM ' || A.TABLE_NAME || ';' FROM USER_TABLES A;...类推[@more@]
关于dbms_stats.gather_table_stats
这段时间有客户的10gR2数据库经常遭遇执行计划不稳定的现象,应该是直方图信息(Histogram)+绑定变量窥视(Bind Variable Peeking)造成的问题。DROP TABLE t;CREATE TABLE t ASSELECT rownum n1,ROUND(rownum/100) n2,'xxxx' n3FROM dba_objectsWHERE rownum<=10000;对于这三种类型的字段,我们都不应该去收集直方图信息,因为没有意义。那么直方图信息之所以需要存在的根本意义在哪里?一. 我们何时该做直方图究其根本实际上就是一个数据分布的图示,这个图示是为了在生成SQL执行计划的时候给Oracle的CBO更多的信息,换句话说,就是
今天有人问了我几个问题,记录一下.
1:软解析和硬解析有什么区别?软解析有什么坏处?最好用英文表达?2:truncate和delete有什么共同之处?有什么不同之处?最好用英文表达?3:页面上,客户做查询的时候,等了10多分钟,才出现10条记录?试着如何优化?(如果a表有2千万条记录,b表也有2千万表记录,关联之后,过了10分钟之后才出现结果,而且结果就10来条记录.那应该怎么去优化?如果没有缩进,如何知道哪个是驱动,哪个是被驱动?排除join方式的优化,还有什么其他方法?4:哪些操作会导致排序操作?[@more@]
sql实现行转列
今天遇到客户需要实现行列转换的功能。号 名001 2001 3002 4002 6变为号 名1 名2001 2 3002 4 6select *from (select b.no,b.mp_no a lead(a.mp_no) over(partition by a.id order by a.mp_no desc) b from table a, table b where......) where b is not null[@more@]
sql tuning
sql调优(数据库性能80%问题):1 减少响应时间2 减少资源的使用找出有问题的sql自动:addm,顶端sql手动:v$视图,statspack执行改变:sql语句的结构索引访问结构驱动表有最好的过滤器少量行数返回到下一个步骤视图被有效的利用每个表是被高效地访问检查sql语句中的属性和表中的行数全表扫描并不意味着效率低下。避免在where 字句中转化column避免mixed-mode的表达以及提防隐式类型转换为特殊任务编写单独的sql语句和适当的使用sql建构。使用exists或in为子查询的要求。根据提示谨慎改变访问路径和连接顺序。移除不必要的索引,以加快DML索引
为什么要使用pl/sql
PL/SQL is a completely portable, high-performance transaction processing language that offers the following advantages:1:Tight Integration with SQL2:Better Performance Without PL/SQL, Oracle must process SQL statements one at a time.This can drastically reduce network traffic between the database and an application.This can drastically reduce network traffic between the database and an application.Stored procedures are cached and shared among users, which lowers memory requirements and invocat
查看SQL执行计划的方法(有待于进一步补充)
首先需要明确查看执行计划的目的:(摘自官方文档)It is important to generate and review execution plans for all of the key SQL statements in your application. Doing so lets you compare the optimizer execution plans of a SQL statement when the statement performed well to the plan when that the statement is not performing well. Having the comparison, along with information such as changes in data volumes, can assist in identifying the cause of performance degradation.答:第一种方法:explain plan for…
二个SQL tuning例子(使用case)
减少对表的扫描次数,将大大有利于执行的效率例子1(低效):select z.dept_namefrom(select item_key,dept_name,min(b.begin_date) t1 from table1 a,table2 bwhere activity_name='1';and .....group by ...) z,(select item_key,min(b.begin_date) t2 from table1 a, table2 bwhere activity_name='2'and....group by....) w,(select item_key,max(b.begin_date) t3,min(b.end_date) t4 from table1 a, table2 bwhere activity_name='3'and.....group by.....)Qwhere z.item_key = w.item_keyand w.item_key = Q.item_key例子1的(高效):s
oracle处理SQL的过程
任何SQL语句的执行,都会经过Parse,execution,fetch三个阶段.Parse阶段:检查SQL语句的语法和语义,生成SQL的执行计划,并放到share pool内.用户进程将SQL语句发送到服务器进程:(1)搜索share pool 内的library cache,检查是否存在相同的SQL.相同的话,就可以直接执行.(2)如果library cache内没有相同的SQL,那么检查该 SQL,生成执行计划,完成伪代码编译.需要若干次系统数据字典的访问.所以share pool内必须要有dictionary cache.(3)申请各种需要的系统资源,所,缓存块等操作.execution阶段:按照生成的执行计划中所安排的步骤
日常技术积累
提个问题:局部索引和全局索引区别这类问题有什么区别?全局分区索引,全局非分区索引,本地分区索引,本地非分区索引...pctfree: 一般把该参数设置为10,参数表示块中预留的空余空间比例。比如 pctfree 20 pctused 80.这样空间的空闲比不能超过20%,超过将无法作update,insert操作。也就是说当这个块大于20%的时候,这个块就不可用。只有小于这个值,这个块才可用。注意单位为:数据块。initrans: 一般把该参数设置为1或者2。表示初始化了一个block的同时能并发进行的事务数,随着事务数量增加可以达到maxtrans上界(trans = transaction)如
熟悉SQL tuning
--优化总原则:按语句执行顺序,先过滤掉最容易过滤到的记录.--优化规则:1:数据比较多的表应该先进行连接,数据比较少的表应该尽可能后进行连接。 --原理:你从一堆沙子里找针难,还是几粒沙子里面找针难。--2 from后面写表的顺序时,选择小表作为驱动表,放在右端。如果有3个以上的表连接查询,--那就需要选择交叉表作为基础表,交叉表是指被其他表所引用的表.--3 where后的条件:表之间的连接必须写在其它where条件之前.那些可以过滤掉最大数量记录--的条件必须写在where字句的末尾.一般tablename.columnname = '多少'字句放到最后面.--