您的位置:首页 > 数据库

数据库实战经验分享

2018-03-06 15:59 375 查看
1.查询每月的最后一天
 select to_char(last_day(to_date(201802,'yyyymm')),'yyyymmdd') from  dual; 2.-- kill 死锁
-- 执行
select object_name, machine, s.sid, s.serial#
  from v$locked_object l, dba_objects o, v$session s
 where l.object_id  =  o.object_id
   and l.session_id = s.sid;
-- kill 掉   

alter system kill session '2021,64525'; (其中24,111分别是上面查询出的sid,serial#)
3.手动修改某个表内容(尽量不要用for update,容易锁表)
    select a.*,a.rowid from tableName a;

4.创建索引
Create Index <Index-Name> On <Table_Name>(Column_Name);
复合索引: Create Index i_deptno_job on emp(deptno,job); —>在emp表的deptno、job列建立索引。

如果在where 子句中有OR 操作符或单独引用Job 列(索引列的后面列) 则将不会走索引,将会进行全表扫描。

5. 索引失效的情况:
 ① Not Null/Null 如果某列建立索引,当进行Select * from emp where depto is not null/is null。 则会是索引失效。
 ② 索引列上不要使用函数,SELECT Col FROM tbl WHERE substr(name ,1 ,3 ) = 'ABC' 
或者SELECT Col FROM tbl WHERE name LIKE '%ABC%' 而SELECT Col FROM tbl WHERE name LIKE 'ABC%' 会使用索引。 ③ 索引列上不能进行计算SELECT Col FROM tbl WHERE col / 10 > 10 则会使索引失效,应该改成
SELECT Col FROM tbl WHERE col > 10 * 10 ④ 索引列上不要使用NOT ( != 、 <> )如:SELECT Col FROM tbl WHERE col ! = 10 

应该 改成:SELECT Col FROM tbl WHERE col > 10 OR col < 10 。
   用UNION替换OR(适用于索引列)

   union 返回两个结果集,同时将两个结果集重复的项进行消除。 如果不进行消除,用UNOIN ALL.

   用EXISTS替代IN、用NOT EXISTS替代NOT IN

6.sql优化
1、 先执行From ->Where ->Group By->聚集函数->having->计算表达式->select 字段->Order By

2、 执行From 字句是从右往左进行执行。因此必须选择记录条数最少的表放在右边。这是为什么呢?  3、对于Where字句其执行顺序是从后向前执行、因此可以过滤最大数量记录的条件必须写在Where子句的末尾,而对于多表之间的连接,则写在之前。
因为这样进行连接时,可以去掉大多不重复的项。  4. SELECT子句中避免使用(*)ORACLE在解析的过程中, 会将’*’ 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: