小心保留字
点击(此处)折叠或打开--开发时要注意一些变量是否是系统自带的函数,否则容易出错(10下运行有问题, 11g完全没有问题)--系统当前时间为2014-01-01DROP TABLE t1;CREATE TABLE t1( arrangement_id NUMBER(9) NOT ...
关于OR
1. OR与<>连接容易出错点击(此处)折叠或打开DROP TABLE t;CREATE TABLE t(col1 INT, col2 INT);INSERT INTO t VALUES(22, 19);INSERT INTO t VALUES(21, 22);INSERT INTO t VALUES(90, 40);...
INSERT INTO错误
点击(此处)折叠或打开DROP TABLE t1;DROP TABLE t2;CREATE TABLE t1( col1 VARCHAR2(2), col2 NUMBER(10), col3 VARCHAR2(20), col4 NUMBER(2)...
提防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;...