php防止sql注入的函数 SQL语句性能优化.doc
文本预览下载声明
php防止sql注入的函数 SQL语句性能优化
导读:就爱阅读网友为您分享以下“SQL语句性能优化”资讯,希望对您有所帮助,感谢您对92的支持!
SQL语句性能优化
编码过程一些注意事项:
1、Oracle的From子句表的顺序:记录越多的表放在越前面(左);
右边的表位驱动表,驱动表越小,最终扫描的数据越少。
Oracle解析器按照从右向左的顺序处理From子句中的表名,最右的表将被最先处理。如果有3个以上的表连接查询,那就需要选择交叉表(intersection table)作为基础表,交叉表是指那个被其它表所引用的表。
2、Oracle的where子句表达式的顺序:过滤掉最大数目记录的条件放到where子句的末尾。Oracle的执行计划的条件过滤从最后向前进行,过滤数据最多的在最后可以提高数据库的查询速度。
3、Select子句中避免使用*’,Oracle在解析的过程中会将*’一次转换成所有的列名,这个工作是通过查询数据字典完成的,这样将耗费更多的事件;
4、在执行结果等效的情况下,使用Truncate代替Delete;
当删除表中记录时,在通常情况下,回滚段用来存放可以被恢复的信息,如果没有
commit事务,oracle会将数据恢复到删除之前的状态。使用truncate时,回滚段不再存放任何可恢复的信息,数据不能被恢复。
5、为了在查询过程中要尽量使用索引,对于like语句避免使用右匹配或者中间匹配的模糊查询;
6、将过滤条件尽可能放到Where子句中,而不是放到Having子句中;
Having子句是用来对分组后的结果进行过滤,限制分组后的查询结果。Having子句会再检索出所有记录之后才对结果集进行过滤,而且在使用Having子句时一般需要执行排序、统计等操作。执行这些操作时,SQL优化器会进行一些额外的工作,这就需要消耗额外的时间。
7、在SQL语句中,要减少对表的查询,特别是在含有子查询的SQL子句中;
8、使用表的别名可以减少解析的时间并避免引起歧义;
9、使用EXISTS替代IN,用NOT EXISTS替代NOT IN;
10、通常情况下,采用表连接的方式比exists更有效率;
11、当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT. 一般可以考虑用EXIST替换,EXISTS使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果。例子:
(低效):
SELECT DISTINCT DEPT_NO,DEPT_NAME FROM DEPT D,EMP E
WHERE D.DEPT_NO=E.DEPT_NO;
(高效):
SELECT DEPT_NO,DEPT_NAME FROM DEPT D WHERE EXISTS(SELECT ‘X’ FROM EMP E WHERE E.DEPT_NO=D.DEPT_NO);
12、使用gt;=’替代gt;’,这样DBMS可直接跳到等于的记录上,可能会避免向前的扫描工作;
13、用union替代or,通常情况下, 用UNION替换WHERE子句中的OR时,将会起到较好的效果. 对索引列使用OR将造成全表扫描.
注意, 以上规则只针对多个索引列有效. 如果有column没有被索引, 查询效率可能会因为你没有选择OR而降低.
在下面的例子中, LOC_ID 和REGION上都建有索引.
高效:
SELECT LOC_ID , LOC_DESC , REGION
FROM LOCATION
WHERE LOC_ID = 10
UNION
SELECT LOC_ID , LOC_DESC , REGION
FROM LOCATION
WHERE REGION = “MELBOURNE”
低效:
SELECT LOC_ID , LOC_DESC , REGION
FROM LOCATION
WHERE LOC_ID = 10 OR REGION = “MELBOURNE”
如果你坚持要用OR, 那就需要返回记录最少的索引列写在最前面.
14、避免在索引列上使用计算,如where语句中的表达式sal *12 gt; 2500应该改为 sal 〉 2500/12;
15、避免在索引列上使用IS NULL和IS NOT NULL工作,这样index将不被使用;
16、如果必要,使用函数索引,如对Upper(name)建立索引;
17、避免在索引列上使用Not,这样将执行全表扫描;
18、如果可能,用union-all替换union语句:当SQL语句需要UNION两个查询结果集合时,这两个结果集合会以UNION-ALL的方式被合并, 然后在输出最终结果前进行排序. 如果用UNION ALL替
显示全部