干货|大数据量惯用优化方法

可以写成:

IF EXISTS (SELECT * FROMtable_name WHEREcolumn_name =’xxx’)

经常需要写一个T_SQL语句比较一个父结果集和子结果集,从而找到是否存在在父结果集中有而在子结果集中没有的记录,如:

SELECTa.hdr_key FROMhdr_tbl a—-tbla表示tbl用别名a代替

WHERENOT EXISTS (SELECT * FROMdtl_tbl b WHEREa.hdr_key =b.hdr_key)

SELECTa.hdr_key FROMhdr_tbla

LEFTJOINdtl_tbl b ONa.hdr_key=b.hdr_key WHEREb.hdr_keyIS NULL

SELECThdr_key FROMhdr_tbl

WHEREhdr_key NOT IN (SELECThdr_keyFROMdtl_tbl)

三种写法都可以得到同样正确的结果,但是效率依次降低。

11. 避免频繁创建和删除临时表,以减少系统表资源的消耗。

12. 临时表并不是不可使用,适当地使用它们可以使某些例程更有效,例如,当需要重复引用大型表或常用表中的某个数据集时。但是,对于一次性事件,最好使用导出表。

13. 在新建临时表时,如果一次性插入数据量很大,那么可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果数据量不大,为了缓和系统表的资源,应先create table,然后insert。

14. 如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先 truncate table ,然后 drop table,这样可以避免系统表的较长时间锁定。

15. 在所有的存储过程和触发器的开始处设置 SET NOCOUNT ON ,在结束时设置 SET NOCOUNT OFF。无需在执行存储过程和触发器的每个语句后向客户端发送 DONE_IN_PROC消息。

16. 尽量避免大事务操作,提高系统并发能力。

17. 尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理,比如是否返回全对象,可不可以减少某些非必要字段。

18.避免使用不兼容的数据类型。例如float和int、char和varchar、binary和varbinary是不兼容的。数据类型的不兼容可能使优化器无法执行一些本来可以进行的优化操作。例如:

SELECT name FROM employee WHERE salary >60000

在这条语句中,如salary字段是money型的,则优化器很难对其进行优化,因为60000是个整型数。我们应当在编程时将整型转化成为钱币型,而不要等到运行时转化。

19. 充分利用连接条件,在某种情况下,两个表之间可能不只一个的连接条件,这时在 WHERE 子句中将连接条件完整的写上,有可能大大提高查询速度。 例:

SELECTSUM(A.AMOUNT) FROM ACCOUNT A, CARD B WHERE A.CARD_NO =B.CARD_NO

SELECTSUM(A.AMOUNT) FROM ACCOUNT A,CARD B WHERE A.CARD_NO =B.CARD_NO AND A.ACCOUNT_NO=B.ACCOUNT_NO

第二句将比第一句执行快得多。

20. 使用视图加速查询 把表的一个子集进行排序并创建视图,有时能加速查询。它有助于避免多重排序操作,而且在其他方面还能简化优化器的工作。

21. 能用DISTINCT的就不用GROUP BY

SELECTOrderIDFROM Details WHEREUnitPrice > 10 GROUP BYOrderID

可改为:

SELECT DISTINCTOrderIDFROM Details WHEREUnitPrice > 10

22. 能用UNION ALL就不要用UNION UNIONALL不执行SELECT DISTINCT函数,这样就会减少很多不必要的资源

23. 尽量不要用SELECT INTO语句。 SELECT INOT语句会导致表锁定,阻止其他用户访问该表。

随着社会的发展,信息技术的不断成熟,越来越多的信息都想保存起来,还想加以分析,所以要求插入、查询的数据量也越来越大,以前可能是几百条、几千条数据的操作,现在几万、甚至几十万条数据的查询也是很常见的操作了,所以大数据量的优化工作还需要我们深入的研究。