提防DDL提交事务
点击(此处)折叠或打开--会话Aconn luise/luise;DROP TABLE t PURGE;CREATE TABLE t AS SELECT * FROM dba_objects;SELECT COUNT(*) FROM t; COUNT(*)---------- ...
存储过程与权限(二)
2.调用者权限,AUTHID CURRENT_USER存储过程有编译和执行2个阶段。从编译阶段来看,调用者权限存储过程与定义者权限存储过程是一样的,角色都无效,都必须进行显式授权。但在执行阶段,调用者权限存储过程的role是生效可见的。点击(此处)折叠或打开CREATE USER userb IDENTIFIED BY...
存储过程与权限
在SQL中可以正常执行的语句,为什么在存储过程中却无法执行?1.定义者权限存储过程role无效,必须要有显示的授权 AUTHID DEFINER点击(此处)折叠或打开conn / AS SYSDBA;CREATE USER usera IDENTIFIED BY usera;CREATE USER luise IDENTIFIED BY luise;...
Oracle开发误区(here)
1.避免对列进行运算在编写SQL时,要尽量避免对列进行运算,要善于通过等价改写消除对列运算的SQL,这样可以避免索引无法使用,从而提高语句效率。点击(此处)折叠或打开DROP TABLE ljb_test;CREATE TABLE ljb_test(ID NUMBER, log_time DATE);...
WHERE IN LIST(续)
2.使用正则表达式解决点击(此处)折叠或打开VARIABLE str VARCHAR2(100);EXEC :str := \'XY,YZ\';SELECT COUNT(*) FROM t WHERE object_name IN (SELECT regexp_substr(:str, \'[^,]+\', 1, LEVEL) AS value_str...
WHERE IN LIST
场景:应用的前台传入一个字符串,而且此字符串具有指定的分隔符,并且长度不定,根据传入的字符串查询对应的结果。1.使用动态SQL解决将字符串拆分(例如Java的split函数),然后拼凑到SQL语句中。缺点:WHERE子句中IN列表中元素的个数必须 <= 1000;列表的数目不确定,无法使用绑定变量,影响效率。解决:首...
NULL与索引
B-Tree索引不会存储全为NULL的列(B-Tree聚簇索引可以存储全为NULL的列),但复合索引中如果有非NULL的列,就可以存储。因为B-Tree索引不存储全为NULL的列,有时会导致SQL语句不走索引而影响效率。点击(此处)折叠或打开DROP TABLE t;C...
用>=替代>
点击(此处)折叠或打开--使用>号select salary, first_name, last_name, email from employees1 where salary > 13000;点击(此处)折叠或打开--使用>=号select salary, first_name, last_name, email from employees1 wh...
避免在WHERE条件中,在索引列上进行计算或使用函数,因为这将导致索引不被使用
点击(此处)折叠或打开--在sal列上创建非唯一索引scott@TESTDB11>create index idx_emp1_sal on emp1(sal);Index created.--查询年薪 > 20,000的员工的编号、姓名、薪水、年薪--不走索引select ...
减少对表的查询
在含有子查询的SQL语句中,尤其要减少对表的查询。点击(此处)折叠或打开--查看职位和7900号员工相同, 部门和7844号员工相同的员工的编号、姓名、职位、薪水、部门编号 --表扫描的次数为3次(不建议)SELECT empno, ename, job, sal, deptno FROM emp...
用WHERE子句替换HAVING子句
HAVING子句会在分组之后对分组形成的结果进行过滤。这个过程需要聚合、排序,因此如果通过WHERE子句限制记录而省略HAVING子句,是可以提升性能的。点击(此处)折叠或打开--使用HAVINGSELECT deptno, SUM(sal) FROM emp GROUP BY deptno HAVING deptno = 20;...
识别低效执行的SQL语句
点击(此处)折叠或打开--识别低效的SQL语句SELECT executions, disk_reads, buffer_gets, ROUND((buffer_gets-disk_reads)/buffer_gets, 2) hit_ration,ROUND(disk_reads/executions, 2) READS_per_run, SQL_textFROM v$sqlarea...
使用表的别名
当SQL进行多个表的连接时,使用表的别名来修饰每个查询的列,这样可以减少解析的时间,并可减少因为列名的歧义而引起的错误。点击(此处)折叠或打开--查询员工的编号、姓名、部门编号、部门名称、薪水、薪水等级select e.empno, e.ename, e.deptno, d.deptn...
计算记录个数
关于count(*)和count(1)谁快的问题,仁者见仁,智者见智。实际如何对索引列进行计数,是最快的。count(empno)。实际测试,三者没有大的差别。
为什么要在事务结束后,立即进行COMMIT?
因为当执行COMMIT后,就会释放相应的资源:1. undo信息2. 锁3. redo log buffer的空间4. Oracle为了管理上述资源的开销
为什么当删除整个表中的数据时,需使用TRUNCATE代替DELETE
因为TRUNCATE是DDL语句,它执行时不会产生UNDO信息,因此要更快。尤其是当数据量比较大的时候。
删除重复的记录
点击(此处)折叠或打开--创建表hr@TESTDB11>create table employees2 as select * from employees;--插入重复的记录(执行4次)Table created.hr@TESTDB11>insert into employees2 select * from employees;...
共享SQL语句
为了不重复解析完全相同的SQL语句,在第一次解析之后,Oracle将解析后的SQL语句存储在内存中。SGA->Shared Pool->LibraryCache->Shared SQL Area。Oracle对Share SQL Area的共享要求两个SQL语句在文本上必须完成相同,包括空格、换行、大小写都必须完全相同。点击(此处)折叠或打开-...
使用EXISTS替换DISTINCT
当查询中包含的表之间有一对多的关系时,避免在SELECT子句中使用DISTICT,可以使用EXISTS替换。点击(此处)折叠或打开--查询emp表中目前所有员工都在哪些部门工作(包括部门编号和部门名称)--使用DISTINCT(低效)SELECT DISTINCT d.deptno, d.dname FROM dept d, ...
使用表连接替代exists
一般来讲使用表连接,要比使用EXISTS更高效。(我不这样认为,从执行计划来看,EXISTS效率更好)点击(此处)折叠或打开--查询sales部门的员工的编号、姓名、部门编号--使用exist的写法select empno, ename, deptno from emp ewhere exists (select 1...