with as 查询性能记载
With as短语也叫做子查询部分,定义一个sql片断,该sql片断会被整个sql语句所用到。With as 查询在有的时候,是为了让SQL语句的可读性更高些,有的时候也可以大幅提高sql的查询时间。对于sql中需要重复查询的表可以使用WITH AS短语,则只要执行一遍即可。如果WITH AS短语所定义的表名被调用两次以上,则优化器会自动将WITH AS短语所获取的数据放入一个TEMP表里,如果只是被调用一次,则不会。而提示materialize则是强制将WITH AS短语里的数据放入一个全局临时表里。很多查询通过这种方法都可以提高速度。with as查询特别对于UNION ALL比较
count(*)和count(1) count(primary key)的小测试
今天和网友一起讨论count(1) count(*) count(primary key)三个在性能上的优越性,测试结果区别不是很大,oracle 10G windows的生产库下,数据交换应该属于较小的。SQL> select count(*) from ycjhup.inf_apply_process; COUNT(*)---------- 191651已用时间: 00: 00: 00.42执行计划----------------------------------------------------------Plan hash value: 197964574-------------------------------------------------------------------------------------------| Id | Operation | Name
分区表和dbms_redefinition包在线重定义表
分区表很早就接触的一项技术手段。分区表虽然在逻辑上是同一张表,可是在数据库底层的segment确实多个对象,管理和维护可以只对分区表进行维护,采取将分区表存储在不同的表空间,表空间存储在不同的磁盘,改善了对表段的I/O。虽然自己所接触的生产库中并不存在分区表,但是一般超过了2Gb的表段就最好使用分区表,而且一些需要定期删除历史数据的表也可以采取分区表技术。range范围分区create table t10_partition(id number,edate date)partition by range(edate)(partition p1 values less than(to_date('2011-10-1','yyyy-mm-dd')) tab
rownum和rowid,row_number一点应用
很早之前就涉及到删除重复数据,下面的两个删除重复数据方法是自己经常用的,置于用一个新表来保留distinct *然后删除 rename等方法就不提了,因为生产库是不允许让表段invaid的。首先来张测试表吧Create table student(name varchar2(10),sc number)然后insert一系列数据。Select * from studentName sc3dd 56adf 45fda 80ffd 78dss 95cfe 74gds 92gf 99ddd 99adf 45asdf 553dd 56 一般生产库的表段是有主键约束的,但是也不排除有些接口表存在大量重复数据,此时需要alter table tablename add primary key(no),但是add主键时会检索我们
两种形式的行转列
很早之前就遇到网友说过sql查询中的行转列。刚好有两个分类别的行转列。创建一个测试表scCreate table sc(sid number ,cid varchar2(10) ,grade number)SID CID GRADE20060101 语文 98.120060102 语文 65.520060101 数学 87.620060102 数学 88.620060101 英语 65.220060102 英语 79.920060103 语文 61.220060103 数学 66.520060103 英语 83.9利用case whenSelect sid, sum(case when cid=’语文’ then grade end) 语文,sum(case when cid=’数学’ then grade end) 数学,sum(case when cid=’英语’ then grade end) 英语from sc group
trigger的一些记载和自治事务的一个练习
很早之前就接触了trigger,不过长时间不用貌似其中有些细节真记不住了。Trigger分为dml触发器,数据库级触发器,ddl触发 instead of触发先前写过两张表的同步的一个dml触发Create or replace trigger dml_trigger01After insert or update or deleteOn student01For eache rowIf inserting thenInsert into student02 values(:new.id.,:new:name);Elsif updating thenUpdate student02 set id=:new.id,name=:new.name where id=:old.id and name=:old.name;Else deleting thenDelete student02 where id=:old.id and name=:old.name;End i
分析函数rank() row_number
很早之前就听网友谈过oracle的分析函数的好处,这两天有些需求不然不觉中用到了分析函数。分析函数和聚合函数根本不同之处在于聚合函数sum average max min count等只能返回一行,而分析函数可以按组返回多行。开窗函数的理解:也就是over(partition by class order by s),开窗函数指定了分析函数工作的窗口大小。(具体开窗函数中一些幅度值限制可以参考tom的export one-on-one)create table student(name varchar2(10),class number,s number)然后插入一些数据,例如此时student表中的数据:select * from studentname class sa
merge into只扫描一次table。
oracle merge into详细介绍今天一看见sql中还有merge into的sql使用,查过资料是oracle9I新增的语法,主要是用于合并update和insert语句,由于update要带来一次全表扫描,insert又来带来一次全表的扫描merge into则可以解决上述问题,让表只进行一次扫描基本语法就是merge into table1 ausing table2 bon (a.col1=b.col2)when matched thenupdate set when not matched theninsert values现在来看看上面的一堆sql是什么意思,首先merge into是需要更新的table1,using是用来对比的关联表,on用于两张表的关联条件。下面的两个when matched
动态sql和利用动态sql解决数据字典的读取
oracle中的动态sql的一些理解,动态sql通俗说也就是执行的时候才去检查的sql。dml语句可以在pl/sql程序中加载,但是ddl语句是无法在pl/sql中执行的,这个时候就可以使用动态sql来完成ddl语句和不确定的dml语句。首先在oracle数据库开发pl/sql程序中的sql分为:静态sql语句和动态sql语句。静态sql语句是在程序编译期间就明确的,执行的是确定的对象,而动态sql在pl/sql程序编译时sql语句是不确定的。编译程序对动态语句部分不进行处理,只在程序运行时动态创建语句并分析语法然后执行。procedure中包含动态sql执行ddl语句create or replace
oracle中的递归sql查询 connect by prior实现递归
oracle中的递归sql查询,connect by prior实现递归可以使用start with...connect by子句递归查询一般用于一个表维护树形结构的应用table的具体columna b1 02 13 14 25 3如果想查找a=2及其下面的的所有数据,则:select a,b from table start with a=2 connect by prior a=b a b2 14 2其中也就是把a=2这条数据当做一个根目录开始递归查询。其中的connect by prior a=b中靠近prior的a则表示a是父节点,在另一侧表示子节点。接着找b能跟上一个父节点a相等的值也就是b=2的
update select用法
update seslect用法如果更新value是从一条select语法引出来,而且还有很多列,平常的update tablename set column_name=values where就很吃力了insert into table select * from tablename是可以同时插入对应table的多列的,其实update也是可以的表A id name 表B id_1 name_1 1 oracle 2 tkprof 2 dmp 3 sql_trace 3 logminer 1 autotrace利用表A的ID做链接更新表B的name_1为表A相对应的name,想使