MSSQL开发中的常用技巧有哪些?

0
已邀请:
2

gogodiy - 天善智能数据库专家、Tableau爱好者 2013-07-09 回答

1.应用程序中,在保证实现功能的基础上,尽量减少对数据库的访问。
2.尽量把使用的索引列放在查询的首列。
3.尽量不要使用游标。一般而言,都能用连接查询取代游标。
4.尽可能简化查询逻辑,算法的结构尽量简单。
5.SET NOCOUNT ON。
在每个存储过程的顶部包括这一命令,以防止SQL在每次操作后报告受影响的行数。这将提供一个很小但明显的性能提升。
6.完全限定对象名称
在使用的每个对象名中包括架构名称。如果不同架构中的两个对象有相同的名称,这样会省去架构查找工作和避免潜在问题。
7.如果调用过程不需要的话,不要随意使用ORDER BY子句。因为使用ORDER BY子句后返回的其实是游标,而不是一张有效的表。因为MSSQL的理论基础是集合论,集合中的行之间没有预先定义的顺序,只是成员的一种逻辑组合,成员之间的顺序无关紧要。
8.避免使用不兼容的数据类型。
例如float和int、char和varchar、binary和varbinary是不兼容的。数据类型的不兼容可能使优化器无法执行一些本来可以进行的优化操作。例如:
SELECT name FROM employee WHERE salary > 60000
在这条语句中,如salary字段是money型的,则优化器很难对其进行优化,因为60000是个整型数。我们应当在编程时将整型转化成为钱币型,而不要等到运行时转化。
9.避免使用!=或<>、IS NULL或IS NOT NULL、IN ,NOT IN等这样的操作符,因为这会使系统无法使用索引,而只能直接搜索表中的数据,进行全表扫描。
10.尽量使用数字型字段,一部分开发人员和数据库管理人员喜欢把包含数值信息的字段设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接回逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。
11.合理利用EXISTS、NOT EXISTS取代子查询。比如判断是否存在某条记录、从父结果集中找出不存在子结果集中的记录等。
12.使用视图加速查询。
把表的一个子集进行排序并创建视图,有时能加速查询。它有助于避免多重排序操作,而且在其他方面还能简化优化器的工作。
13.能够用BETWEEN的就不要用IN。
SELECT * FROM T1 WHERE ID IN (10,11,12,13,14)
改成:
SELECT * FROM T1 WHERE ID BETWEEN 10 AND 14
因为IN会使系统无法使用索引,而只能直接搜索表中的数据。
14.不要写一些不做任何事的查询。
如:SELECT COL1 FROM T1 WHERE 1=0
SELECT COL1 FROM T1 WHERE COL1=1 AND COL1=2
这类死码不会返回任何结果集,但是会消耗系统资源。
15.尽量不要用SELECT INTO语句。
SELECT INTO语句会导致表锁定(主要是系统表sysobjects,sysindexes等),阻止其他用户访问该表。
在多用户的场景中,推荐显示申明创建临时表;而在单独使用的场景中,推荐使用SELECT INTO。
经常要使用的临时表建议修改为实表,或者使用表变量。
16.数据量小使用表变量;数据量大使用临时表。
17.注意排序规则,用CREATE TABLE建立的临时表,如果不指定字段的排序规则,会选择TEMPDB的默认排序规则,而不是当前数据库的排序规则。如果当前数据库的排序规则和TEMPDB的排序规则不同,连接的时候就会出现排序规则的冲突错误。一般可以在CREATE TABLE建立临时表时指定字段的排序规则为DATABASE_DEFAULT来避免上述问题。
18.必要时强制查询优化器使用某个索引。
SELECT * FROM T1 WHERE nextprocess = 1 AND processid IN (8,32,45)
改成:
SELECT * FROM T1 (INDEX = IX_ProcessID) WHERE nextprocess = 1 AND processid IN (8,32,45)
则查询优化器将会强行利用索引IX_ProcessID 执行查询。
19.虽然UPDATE、DELETE语句的写法基本固定,但是还是对UPDATE语句给点建议:
 尽量不要修改主键字段。
 当修改VARCHAR型字段时,尽量使用相同长度内容的值代替。
 尽量最小化对于含有UPDATE触发器的表的UPDATE操作。
 避免UPDATE将要复制到其他数据库的列。
 避免UPDATE建有很多索引的列。
 避免UPDATE在WHERE子句条件中的列。

要回复问题请先登录注册