1,Oracle 使用索引更快的遍历表,如果SQL不合理,就会造成优化器删去索引而使用全表扫描,这种SQL就是劣质SQL。
FROM TABLES
WHERE TAB_NAME = ( SELECT TAB_NAME
FROM TAB_COLUMNS
WHERE VERSION = 604)
AND DB_VER= ( SELECT DB_VER
FROM TAB_COLUMNS
WHERE VERSION = 604)
高效
SELECT TAB_NAME
FROM TABLES
WHERE (TAB_NAME,DB_VER)
= ( SELECT TAB_NAME,DB_VER)
FROM TAB_COLUMNS
1.不要要Oracle 做的太多;
1)避免复杂的多表关联;
2)避免使用*;
3)避免使用好用资源的操作:Distinct、UNION、MINUS、INTERSET、ORDER BY 等。
使用EXISTS 替换 DISTINCT
使用Union ALL 替代UNION(如果必要)
2.给优化器以明确的命令;
自动选择索引
至少要包含组合索引的第一列
避免在索引上使用函数
避免使用前置通配符
避免在索引列上使用NOT
避免在索引上使用Is NULL 和 IS NOT NULL
避免出现索引列自动转换
在查询时尽量少用格式转换
3.减少访问次数;
使用DECODE 来减少处理时间
减少对表的查询
低效
SELECT TAB_NAMEFROM TABLES
WHERE TAB_NAME = ( SELECT TAB_NAME
FROM TAB_COLUMNS
WHERE VERSION = 604)
AND DB_VER= ( SELECT DB_VER
FROM TAB_COLUMNS
WHERE VERSION = 604)
高效
SELECT TAB_NAME
FROM TABLES
WHERE (TAB_NAME,DB_VER)
= ( SELECT TAB_NAME,DB_VER)
FROM TAB_COLUMNS
WHERE VERSION = 604)
4.细节上的影响。
WEHRE 字句应该将筛选、返回结果集小的放在最后;
WHERE字句使用合理的函数和表达式
ORDER BY 使用索引列,没有的要建立,
联结列不使用索引
通配符的like 语句,不应该出现在词首
WHERE 代替HAVING
NOT Exist 〉 NOT IN 的效率,都不使用索引
>= 代替 >
例子:
select * from employee where salary <> 3000;对这个查询,可以改写为不使用NOT:select * from employee where salary<3000 or salary>3000;
外部链接的用法:
外部联接"+"按其在"="的左边或右边分左联接和右联接。若不带"+"运算符的表中的一个行不直接匹配于带"+"预算符的表中的任何行,则前者的行与后者中的一个空行相匹配并被返回。利用外部联接"+",可以替代效率十分低下的 not in 运算,大大提高运行速度。例如,下面这条命令执行起来很慢:
select a.empno from emp a where a.empno not in(select empno from emp1 where job='SALE');利用外部联接,改写命令如下:select a.empno from emp a ,emp1 bwhere a.empno=b.empno(+)and b.empno is nulland b.job='SALE';这样运行速度明显提高.
多使用COMMIT,用TRUNCATE替代DELETE
COUNT(*) > COUNT(1)