一. 建议不用“*”来代替所有列名
执行连接时使用完全限定的列引用
在查询中包含表别名,并在查询中使用每列的别名,这样称为完全限定的列引用。
--SUBHEAD、SUMMARY没有使用完全限定的列引用,数据库必须从两个表来获取这两个字段
SELECT S.ID AS SID, S.NAME, C.TITLE, SUBHEAD, SUMMARY
FROM TEST_CONTENT C, TEST_SORT S
WHERE C.SORT_ID = S.ID
AND C.SORT_ID = 170
--全部使用
SELECT S.ID AS SID, S.NAME, C.TITLE, C.SUBHEAD, C.SUMMARY
FROM TEST_CONTENT C, TEST_SORT S
WHERE C.SORT_ID = S.ID
AND C.SORT_ID = 170
二.添加表索引
B-Tree索引,Bitmap索引
三.使用Where而不是Having
这样可以不为过滤掉的行进行分组。
四.使用UNION ALL而不是UNION
UNION ALL不会删除重复行,UNION要删除重复行。
五.使用Exists而不是In,用Not Exists替代Not In,用Exists替代Distinct
SELECT C.ID, C.TITLE, C.SUBHEAD, C.SUMMARY
FROM TEST_CONTENT C
WHERE C.SORT_ID IN (SELECT ID FROM TEST_SORT);
SELECT C.ID, C.TITLE, C.SUBHEAD, C.SUMMARY
FROM TEST_CONTENT C
WHERE EXISTS (SELECT 1 FROM TEST_SORT S WHERE S.ID = C.SORT_ID);
六. 用Truncate代替Delete
在确保完整性的情况下多用Commit
尽量减少表的查询次数
七.
八.使用Grouping Sets而不是Cube
九.使用绑定变量
Oracle数据库软件会缓存已经执行的SQL语句,如果以后执行相同的SQL语句就重用缓存。但有一个规则,要重用缓存语句,SQL语句要完全相同。
1.SQL语句中所有字符必须相同。
2.SQL语句中所有字母的大小写必须相同。
3.SQL语句中的所有空格必须相同。
4.如果语句中提供不同的列值,可以使用绑定变量,而不是常量列值。
十.Oracle优化器
1)语法检查:检查SQL语句拼写是否正确。
2)语义分析:核实所有与数据字典不一致的表和列的名字。
3)概要存储检查:检查数据字典,以确定该SQL语句的概要是否已经存在。
4)生成执行计划:使用基于成本的优化规则和数据字典中的统计表来决定最佳执行计划。
5)建立二进制代码:基于执行计划,Oracle生成二进制执行代码。
6)Oracle11g数据库在执行SQL语句时,都是使用基于代价(或者成本)的优化器。
CBO是基于代价(Cost-Based Optimizer)的意思,CBO计算各种可能执行计划的代价,即Cost。这里的代价主要指CPU和内存。优化器主要参照的是表及索引的统计信息,这些统计信息起初在库内是没有的,是在做analyze后才出现的,要及时更新这些信息。
十一.执行计划
查看执行计划,优化SQL