共享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...
NOT IN与NOT EXISTS
点击(此处)折叠或打开--查询非sales部门的员工的编号、姓名、部门编号--低效的写法SELECT e.empno, e.ename, e.deptnoFROM emp eWHERE deptno NOT IN (SELECT deptno FROM dept WHERE dname = \'SALES\');点击(此处)折叠...
IN和EXISTS
很多时候需要将一列值和一系列的值做比较。最简单的办法就是在WHERE子句中使用子查询。使用子查询有IN和EXISTS两种形式。几乎所有使用IN操作符的子查询都可以改变为使用EXISTS的子查询。在绝大多数情况下EXISTS要比IN的效率高,因为EXISTS执行的是semijoin,所以在一些情况下,不必遍历子查询表中的所有行。...
NOT
在查询时经常在WHERE子句中使用一些逻辑表达式,例如>, <, =, !=等等,也可以在这些比较操作符上应用逻辑运行符(AND,OR,NOT)。但要注意使用NOT会致使查询不走索引。点击(此处)折叠或打开--使用NOT致使查询不走索引select first_name, last_name, salary from employee...
ORDER BY子句
在ORDER BY语句中出现的非索引键列或者表达式,都会使查询的性能下降。解决办法:在ORDER BY语句中不对列使用表达式,尽可以使用索引键列,如果某列不是索引键列,可以考虑在该列上创建索引。点击(此处)折叠或打开--email列上没有索引,所以需要执行相应的排序操作hr@TESTD...
带通配符的LIKE子句
当通配符出现在字符串开头时,不使用索引;出现在其它位置时,是可以使用索引的。解决办法:没有什么好的解决办法。点击(此处)折叠或打开--通配符出现在字符串的开头(不走索引),查询姓中包含字母e的员工hr@TESTDB11>select first_name, last_name from employees1 where ...
对列进行连接操作会影响索引的使用
解决办法:不对列进行连接操作,而是对要比较的字面量应用函数,从而满足列的特定要求。点击(此处)折叠或打开--创建表hr@TESTDB11>create table employees1 as select * from employees;Table created.--在first_name...
IS NULL和IS NOT NULL
在谓词中使用IS NULL或IS NOT NULL,优化器就不允许使用索引了。解决办法:根据情况,决定是否使用IS NULL或IS NOT NULL点击(此处)折叠或打开--查询走索引了scott@TESTDB11>select * from dept where deptno = 10;点击(此处)折叠或打开...
高效的SQL语句有助于减少数据库的访问次数
每当执行一条SQL语句时,Oracle需要做大量的工作,因此减少访问数据库的次数,实际上就是降低了数据库的开销。点击(此处)折叠或打开SELECT COUNT(*), SUM(sal) FROM emp WHERE deptno = 20;SELECT COUNT(*), SUM(sal) FROM emp WHERE deptno = 30;...
为什么SELECT查询中应避免使用*?
当想在SELECT语句中列出所有的列时,使用*非常方便。但这是一种低效的方法。Oracle在解析的过程中会将*依次转换为具体的列名,这是通过查询数据字典来完成的。点击(此处)折叠或打开--打开时间显示08:13:12 scott@TESTDB11>set timing on;--使用*...
执行alter system flush buffer_cache一定会产生检查点吗?
点击(此处)折叠或打开--查看数据清空buffer cache--结论:没有产生检查点sys@TESTDB11>select * from scott.emp; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO...
更新数据库允许连接的会话数量和用户数量
点击(此处)折叠或打开-相关的参数sys@TESTDB11>show parameter license;NAME TYPE VALUE------------------------------------ ----------- ------------------------------license_max_sessions integer 0l...
Oracle安装错误
Oracle安装错误:/export/home/oracle/database/install/.oui:syntax error at line 1: `(' unexpected答:安装软件与Solaris平台不对应,即32位上安装64位软件,不可以
PL/SQL Developer显示行号
简述truncate、delete和drop
使用Truncate 将会:1.清除相应索引(不是Drop,仍然保留extent) ;2.受外键参考的约束(FOREIGN KEY).当然必须先DISABLE 或DROP 相应的外键参考,才能TRUNCATE,注意没有CASCADE 选项 .3.不触发DELETE 触发器4.若使用了DROP STORAGE(缺省), 除了已指定的MINEXTENTS,其它EXTENT 重新分配NEXT_EXTENT 设置MINEXT...
常见问题汇总
1.是什么进程将数据写到redo logbuffer中的?Server process。2. Delete()操作,相对于associatearray,好像没有变化?对于关联数组和嵌套表,执行删除操作,只是做个标记。需要使用first, next方式获取下标进行输出,才能体现出来。3. undo信息内存中存储在内存中哪个区域?...
简述DBMS_TTS包
包DBMS_TTS用于检查表空间集合是否是自包含的,并在执行了检查之后,将违反自包含规则的信息写入到临时表TRANSPORT_SET_VIOLATIONS中。 在表空间传输的中,要求表空间集为自包含的,自包含表示用于传输的内部表空间集没有引用指向外部表空间集。自包含分为两种:一般自包含表空间集和完全(严格)自包含表空...
简述DBMS_TTS包
包DBMS_TTS用于检查表空间集合是否是自包含的,并在执行了检查之后,将违反自包含规则的信息写入到临时表TRANSPORT_SET_VIOLATIONS中。 在表空间传输的中,要求表空间集为自包含的,自包含表示用于传输的内部表空间集没有引用指向外部表空间集。自包含分为两种:一般自包含表空间集和完全(严格)自包含表...