`
heavenslv
  • 浏览: 82569 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论
文章列表
当SQL 语句需要UNION 两个查询结果集合时,这两个结果集合会以UNION-ALL 的方式被 合并, 然后在输出最终结果前进行排序. 如果用UNION ALL 替代UNION, 这样排序就不是必要了. 效率就会因此得到提高. 举例: 低效: SELECT ACCT_NUM, BALANCE_AMT FROM DEBIT_TRANSACTIONS WHERE TRAN_DATE = ’31-DEC-95’ UNION SELECT ACCT_NUM, BALANCE_AMT FROM DEBIT_TRANSACTIONS WHERE TRAN_DATE = ’ ...
提高GROUP BY 语句的效率, 可以通过将不需要的记录在GROUP BY 之前过滤掉.下面两个 查询返回相同结果但第二个明显就快了许多. 低效: SELECT JOB , AVG(SAL) FROM EMP GROUP JOB HAVING JOB = ‘PRESIDENT’ OR JOB = ‘MANAGER’   高效: SELECT JOB , AVG(SAL) FROM EMP WHERE JOB = ‘PRESIDENT’ OR JOB = ‘MANAGER’ GROUP JOB  
使用 DECODE 函数可以避免重复扫描相同记录或重复连接相同的表. 例如: SELECT COUNT(*),SUM(SAL) FROM EMP WHERE DEPT_NO = 0020 AND ENAME LIKE ‘SMITH%’; SELECT COUNT(*),SUM(SAL) FROM EMP WHERE DEPT_NO = 0030 AND ENAME LIKE ‘SMITH%’;   你可以用DECODE 函数高效地得到相同结果 SELECT COUNT(DECODE(DEPT_NO,0020,’X’,NULL)) D0020_COUNT, ...
ORACLE 采用自下而上的顺序解析WHERE 子句,根据这个原理,表之间的连接必须写在其他 WHERE 条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE 子句的末尾. 例如: (低效,执行时间156.3 秒) SELECT … FROM EMP E WHERE SAL > 50000 AND JOB = ‘MANAGER’ AND 25 < (SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO);   (高效,执行时间10.6 秒) SELECT … FROM EMP E WHERE 25 ...
ORACLE 的解析器按照从右到左的顺序处理FROM 子句中的表名,因此FROM 子句中写在 最后的表(基础表 driving table)将被最先处理. 在FROM 子句中包含多个表的情况下,你必须选择 记录条数最少的表作为基础表.当ORACLE 处理多个表时, 会运用排序及合并的方式连接它们.首 先,扫描第一个表(FROM 子句中最后的那个表)并对记录进行派序,然后扫描第二个表(FROM 子句 中最后第二个表),最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并. 例如: 表 TAB1 16,384 条记录 表 TAB2 1 条记录 选择TAB2 作为基础表 ...
为了不重复解析相同的SQL 语句,在第一次解析之后, ORACLE 将SQL 语句存放在内存中.这 块位于系统全局区域SGA(system global area)的共享池(shared buffer pool)中的内存可以被所有的 数据库用户共享. 因此,当你执行一个SQL 语句(有时被称为一个游标)时,如果它和之前的执行过 的语句完全相同, ORACLE 就能很快获得已经被解析的语句以及最好的执行路径. ORACLE 的这 个功能大大地提高了SQL 的执行性能并节省了内存的使用.可惜的是ORACLE 只对简单的表提 供高速缓冲(cache buffering) ,这个功能并不适用于 ...
有时候会将一列和一系列值相比较。最简单的办法就是在where 子句中使用子查询。在 where 子句中可以使用两种格式的子查询。 第一种格式是使用IN 操作符: ... where column in(select * from ... where ...); 第二种格式是使用EXIST 操作符: ... where exists (select 'X' from ...where ...); 绝大多数人会使用第一种格式,因为它比较容易编写,而实际上第二种格式要远比第 一种格式的效率高。在Oracle 中可以几乎将所有的IN 操作符子查询改写为使用EXISTS 的子查询。 ...
要求在职工表中查询名字中包含 “cliton” 的人。可以采用如下的查询SQL 语句: select * from employee where last_name like '%cliton%';   这里由于通配符(%)在搜寻词首出现,所以Oracle 系统不使用last_name 的索引。在很多 情况下可能无法避免这种情况,但是一定要心中有底,通配符如此使用会降低查询速度。然而当 通配符出现在字符串其他位置时,优化器就能利用索引。   在下面的查询中索引得到了使用: select * from employee where last_name like ' ...
  public bool IsChinese(string CString) { // Console.WriteLine("{0}", CString.Length); bool BoolValue = false; for (int i = 0; i < CString.Length; i++) { if (Convert.ToInt32(Convert.ToChar(CString.Substring(i, 1))) < 128) { ...
Global site tag (gtag.js) - Google Analytics