设为首页 加入收藏

TOP

SQL高性能查询优化语句(总结)(二)
2015-11-21 01:25:38 来源: 作者: 【 】 浏览:1
Tags:SQL 高性能 查询 优化 语句 总结
表变量来代替临时表。如果表变量包含大量数据,请注意索引非常有限(只有主键索引)。
?
13.避免频繁创建和删除临时表,以减少系统表资源的消耗。
?
14.临时表并不是不可使用,适当地使用它们可以使某些例程更有效,例如,当需要重复引用大型表或常用表中的某个数据集时。但是,对于一次性事件,最好使用导出表。
?
15.在新建临时表时,如果一次性插入数据量很大,那么可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果数据量不大,为了缓和系统表的资源,应先create table,然后insert。
?
16.如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先 truncate table ,然后 drop table ,这样可以避免系统表的较长时间锁定。
?
17.在所有的存储过程和触发器的开始处设置 SET NOCOUNT ON ,在结束时设置 SET NOCOUNT OFF 。无需在执行存储过程和触发器的每个语句后向客户端发送 DONE_IN_PROC 消息。
?
18.尽量避免大事务操作,提高系统并发能力。
?
19.尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。
20.避免使用不兼容的数据类型。例如float和int、char和varchar、binary和varbinary是不兼容的。数据类型的不兼容可能使优化器无法执行一些本来可以进行的优化操作。例如:
?
SELECT name FROM employee WHERE salary > 60000;
?
在这条语句中,如salary字段是money型的,则优化器很难对其进行优化,因为60000是个整型数。我们应当在 编程时将整型转化成为钱币型,而不要等到运行时转化。
?
21.充分利用连接条件,在某种情况下,两个表之间可能不只一个的连接条件,这时在 WHERE 子句中将连接条件完整的写上,有可能大大提高查询速度。
例:
?
SELECT SUM(A.AMOUNT) FROM ACCOUNT A,CARD B WHERE A.CARD_NO = B.CARD_NO;
SELECT SUM(A.AMOUNT) FROM ACCOUNT A,CARD B WHERE A.CARD_NO = B.CARD_NO AND A.ACCOUNT_NO = B.ACCOUNT_NO;--完整的表链接条件有可能大大提高查询速度
第二句将比第一句执行快得多。
?
22、使用视图加速查询
?
把表的一个子集进行排序并创建视图,有时能加速查询。它有助于避免多重排序 操作,而且在其他方面还能简化优化器的工作。例如:
?
SELECT cust.name,rcvbles.balance,……other columns
FROM cust,rcvbles
WHERE cust.customer_id = rcvlbes.customer_id
? ? AND rcvblls.balance>0
? ? AND cust.postcode>“98000”
ORDER BY cust.name;
?
如果这个查询要被执行多次而不止一次,可以把所有未付款的客户找出来放在一个视图中,并按客户的名字进行排序:
?
?
CREATE VIEW DBO.V_CUST_RCVLBES ? ?--创建视图 ??
AS
? ? SELECT cust.name,rcvbles.balance,……other columns
? ? FROM cust,rcvbles
? ? WHERE cust.customer_id = rcvlbes.customer_id
? ? ? ? AND rcvblls.balance>0
? ? ORDER BY cust.name;
?
然后以下面的方式在视图中查询:
?
SELECT * FROM V_CUST_RCVLBES
WHERE postcode>“98000”;
?
视图中的行要比主表中的行少,而且物理顺序就是所要求的顺序,减少了磁盘I/O,所以查询工作量可以得到大幅减少。
?
?
23、能用DISTINCT的就不用GROUP BY
?
SELECT OrderID FROM Details WHERE UnitPrice > 10 GROUP BY OrderID;
可改为:
SELECT DISTINCT OrderID FROM Details WHERE UnitPrice > 10;
?
24.能用UNION ALL就不要用UNION。
?
UNION ALL不执行SELECT DISTINCT函数,这样就会减少很多不必要的资源;
?
35.尽量不要用SELECT INTO语句。
?
SELECT INOT 语句会导致表锁定,阻止其他用户访问该表。
?
上面提到的是一些基本的提高查询速度的注意事项,但是在更多的情况下,往往需要反复试验比较不同的语句以得到最佳方案。最好的方法当然是测试,看实现相同功能的SQL语句哪个执行时间最少,但是 数据库中如果数据量很少,是比较不出来的,这时可以用查看执行计划,即:把实现相同功能的多条SQL语句考到查询分析器,按CTRL+L看查所利用的索引,表扫描次数(这两个对性能影响最大),总体上看询成本百分比即可。
首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇SQL多行字符串按条件合并 下一篇非常好的SQL格式化工具SQLPrettyP..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: