数据库语句优化总结

上传人:壹****1 文档编号:560802230 上传时间:2023-01-28 格式:DOC 页数:13 大小:68KB
返回 下载 相关 举报
数据库语句优化总结_第1页
第1页 / 共13页
数据库语句优化总结_第2页
第2页 / 共13页
数据库语句优化总结_第3页
第3页 / 共13页
数据库语句优化总结_第4页
第4页 / 共13页
数据库语句优化总结_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《数据库语句优化总结》由会员分享,可在线阅读,更多相关《数据库语句优化总结(13页珍藏版)》请在金锄头文库上搜索。

1、SQL语句优化的原则:1、使用索引来更快地遍历表缺省情况下建立的索引是非群集索引,但有时它并不是最佳的。在非群集索引下,数据在物理上随机存放在数据页上。合理的索引设计要建立在对各种查询的分析和预测上。一般来说:.有大量重复值、且经常有范围查询(between, , =, =)和order by、group by发生的列,可考虑建立群集索引;.经常同时存取多列,且每列都含有重复值可考虑建立组合索引;.组合索引要尽量使关键查询形成索引覆盖,其前导列一定是使用最频繁的列。索引虽有助于提高性能但不是索引越多越好,恰好相反过多的索引会导致系统低效。用户在表中每加进一个索引,维护索引集合就要做相应的更新工

2、作。2、IS NULL 与 IS NOT NULL不能用null作索引,任何包含null值的列都将不会被包含在索引中。即使索引有多列这样的情况下,只要这些列中有一列含有null,该列就会从索引中排除。也就是说如果某列存在空值,即使对该列建索引也不会提高性能。任何在where子句中使用is null或is not null的语句优化器是不允许使用索引的。3、IN和EXISTSEXISTS要远比IN的效率高。里面关系到full table scan和range scan。几乎将所有的IN操作符子查询改写为使用EXISTS的子查询。4、在海量查询时尽量少用格式转换。5、当在SQL SERVER 20

3、00中,如果存储过程只有一个参数,并且是OUTPUT类型的,必须在调用这个存储过程的时候给这个参数一个初始的值,否则会出现调用错误。6、ORDER BY和GROPU BY使用ORDER BY和GROUP BY短语,任何一种索引都有助于SELECT的性能提高。注意如果索引列里面有NULL值,Optimizer将无法优化。7、任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。8、IN、OR子句常会使用工作表,使索引失效。如果不产生大量重复值,可以考虑把子句拆开。拆开的子句中应该包含索引。9、SET SHOWPLAN_ALL ON 查看执行方案。DBC

4、C检查数据库数据完整性。DBCC(DataBase Consistency Checker)是一组用于验证 SQL Server 数据库完整性的程序。10、慎用游标在某些必须使用游标的场合,可考虑将符合条件的数据行转入临时表中,再对临时表定义游标进行操作,这样可使性能得到明显提高。一些常用的SQL语句供大家参考,希望对大家有所帮助。说明:存储过程的使用,CREATE PROC 创建存储过程,SQL2000中用sp_xxx和xp_xxx存储过程;一般来说,sp_xxx是一般的存储过程,而xp_xxx是扩展的存储过程。使用这些系统存储过程时,一般使用USE MASTER然后在使用sp_xxx或者x

5、p_xxx。说明:复制表(只复制结构,源表名:a 新表名:b)SQL: select * into b from a where 11说明:拷贝表(拷贝数据,源表名:a 目标表名:b)SQL: insert into b(a, b, c) select d,e,f from b;说明:显示文章、提交人和最后回复时间SQL: select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b说明:外连接查询(表名1:a 表名2:b

6、)SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c说明:日程安排提前五分钟提醒SQL: select * from 日程安排 where datediff(minute,f开始时间,getdate()5说明:两张关联表,删除主表中已经在副表中没有的信息SQL: delete from info where not exists ( select * from infobz where info.infid=infobz.infid说明:-SQL: SELECT A.NUM, A.NAME,

7、B.UPD_DATE, B.PREV_UPD_DATEFROM TABLE1,(SELECT X.NUM, X.UPD_DATE, Y.UPD_DATE PREV_UPD_DATEFROM (SELECT NUM, UPD_DATE, INBOUND_QTY, STOCK_ONHANDFROM TABLE2WHERE TO_CHAR(UPD_DATE,YYYY/MM) = TO_CHAR(SYSDATE, YYYY/MM) X,(SELECT NUM, UPD_DATE, STOCK_ONHANDFROM TABLE2WHERE TO_CHAR(UPD_DATE,YYYY/MM) =TO_CH

8、AR(TO_DATE(TO_CHAR(SYSDATE, YYYY/MM) | /01,YYYY/MM/DD) - 1, YYYY/MM) Y,WHERE X.NUM = Y.NUM (+)AND X.INBOUND_QTY + NVL(Y.STOCK_ONHAND,0) X.STOCK_ONHAND BWHERE A.NUM = B.NUM说明:-SQL: select * from studentinfo where not exists(select * from student where studentinfo.id=student.id) and 系名称=&strdepartment

9、name& and 专业名称=&strprofessionname& order by 性别,生源地,高考总成绩说明:从数据库中去一年的各单位电话费统计(电话费定额贺电化肥清单两个表来源)SQL: SELECT a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, yyyy) AS telyear,SUM(decode(TO_CHAR(a.telfeedate, mm), 01, a.factration) AS JAN,SUM(decode(TO_CHAR(a.telfeedate, mm), 02, a.factration) AS FRI

10、,SUM(decode(TO_CHAR(a.telfeedate, mm), 03, a.factration) AS MAR,SUM(decode(TO_CHAR(a.telfeedate, mm), 04, a.factration) AS APR,SUM(decode(TO_CHAR(a.telfeedate, mm), 05, a.factration) AS MAY,SUM(decode(TO_CHAR(a.telfeedate, mm), 06, a.factration) AS JUE,SUM(decode(TO_CHAR(a.telfeedate, mm), 07, a.fac

11、tration) AS JUL,SUM(decode(TO_CHAR(a.telfeedate, mm), 08, a.factration) AS AGU,SUM(decode(TO_CHAR(a.telfeedate, mm), 09, a.factration) AS SEP,SUM(decode(TO_CHAR(a.telfeedate, mm), 10, a.factration) AS OCT,SUM(decode(TO_CHAR(a.telfeedate, mm), 11, a.factration) AS NOV,SUM(decode(TO_CHAR(a.telfeedate,

12、 mm), 12, a.factration) AS DECFROM (SELECT a.userper, a.tel, a.standfee, b.telfeedate, b.factrationFROM TELFEESTAND a, TELFEE bWHERE a.tel = b.telfax) aGROUP BY a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, yyyy)说明:四表联查问题:SQL: select * from a left inner join b on a.a=b.b right inner join c on

13、a.a=c.c inner join d on a.a=d.d where .说明:得到表中最小的未使用的ID号SQL:SELECT (CASE WHEN EXISTS(SELECT * FROM Handle b WHERE b.HandleID = 1) THEN MIN(HandleID) + 1 ELSE 1 END) as HandleIDFROM HandleWHERE NOT HandleID IN (SELECT a.HandleID - 1 FROM Handle a)三、数据库优化1、索引问题在做性能跟踪分析过程中,经常发现有不少后台程序的性能问题是因为缺少合适索引造成的,

14、有些表甚至一个索引都没有。这种情况往往都是因为在设计表时,没去定义索引,而开发初期,由于表记录很少,索引创建与否,可能对性能没啥影响,开发人员因此也未多加重视。然一旦程序发布到生产环境,随着时间的推移,表记录越来越多,这时缺少索引,对性能的影响便会越来越大了。这个问题需要数据库设计人员和开发人员共同关注法则:不要在建立的索引的数据列上进行下列操作:避免对索引字段进行计算操作避免在索引字段上使用not,!=避免在索引列上使用IS NULL和IS NOT NULL避免在索引列上出现数据类型转换避免在索引字段上使用函数避免建立索引的列中使用空值。2、在可以使用UNION ALL的语句里,使用了UNI

15、ONUNION 因为会将各查询子集的记录做比较,故比起UNION ALL ,通常速度都会慢上许多。一般来说,如果使用UNION ALL能满足要求的话,务必使用UNION ALL。还有一种情况大家可能会忽略掉,就是虽然要求几个子集的并集需要过滤掉重复记录,但由于脚本的特殊性,不可能存在重复记录,这时便应该使用UNION ALL,如xx模块的某个查询程序就曾经存在这种情况,见,由于语句的特殊性,在这个脚本中几个子集的记录绝对不可能重复,故可以改用UNION ALL)3、对Where 语句的法则3.1 避免在WHERE子句中使用in,not in,or 或者having。可以使用 exist 和not exist代替 in和not in。可以使用表链接代替 exist。Having可以用where代替,如果无法代替可以分两步处理。例子SELECT * FROM ORDERS WHERE CUSTOMER_NAME NOT IN(SELECT CUSTOMER_NAME FROM CUSTOMER)

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 营销创新

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号