数据库实战经验分享
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在解析的过程中, 会将’*’ 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间
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在解析的过程中, 会将’*’ 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间
相关文章推荐
- 数据库MySQL调优实战经验总结
- 云栖社区12篇实战经验所组成的“近战”系列分享
- 网站DDOS攻击防护实战老男孩经验心得分享
- 干货分享!不得不看的【7年竞价实战经验总结】
- 数据库设计中的一些小经验,拿来分享一下(有血的教训)。
- 【经验分享】一个.Net开发组合:Powerdesigner+数据库+分层设计+.Net代码生成器+VS2005
- Centos 6.3安装Cassandra数据库经验分享
- 实战总结经验分享,同磁盘下安装多linux添加启动项到grub
- 【在线专家问答】 - QA专家 张志会 与您分享QA实战经验
- 活动 - 【在线专家问答】 - QA专家 张志会 与您分享QA实战经验
- TUP第十三期:客户端性能优化实战经验分享
- 幻影CEO分享实战SEO经验:企业网站优化如此简单
- 国内外三个不同领域巨头分享的Redis实战经验及使用场景
- app store实战操作经验分享(2)
- 占位……sqlserver——实战经验小结(常用函数+数据库排序规则定义)
- SQLServer实战经验分享--ServiceBroker安全配置和使用示例
- C#提升性能"数据库连接打开与关闭"经验分享(附:优化过的DBHelper类) 之配餐系统的开发
- 微信淘宝客实战经验分享
- FPGA系统设计实战经验分享-硬件篇