文档详情

php防止sql注入的函数 SQL语句性能优化.doc

发布:2017-01-07约4.66千字共42页下载文档
文本预览下载声明
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替
显示全部
相似文档