Sql 效率经验总结 SQL 开发观点对于客户 - 服务器结构的数据库应用程序来说,减少网络传输的数据量直接影响到应用程序的性能。在编程时应注意尽量减少网络流量,避免不必要的数据传输。另外,数据库的加锁机制和事务处理也会直接影响到一个应用程序性能的好坏。在这里提供一些建议供大家参考。 合理使用存储过程将完成一个功能的 SQL 语句写成存储过程,不但可以减少网络流量,而且由于存储过程是预编译的,能进一步提高响应速度。 WHERE 子句在 SELECT 语句中通过使用 WHERE子句来减少返回的记录数。 去掉不需要的字段避免使用 SELECT * FROM 语句,要使用 SELECT F1 , F2 FROM 语句,去掉不需要的字段。 避免显式或隐含的类型转换避免显式或隐含的类型转换,如在 WHERE 子句中 Numeric 型和 Int 型的列的比较。 SQL SERVER在 SELECT 语句中,如果表中的大部分记录符合查询条件,尽管 WHERE 子句中的字段上有索引,但 SQL SERVER 不会使用索引,而是顺序扫描该表。 复合索引对于复合索引要注意,例如在建立复合索引时列的顺序是 F1 , F2 , F3 ,则在 WHERE 或 ORDER BY 子句中这些字段出现的顺序要与建立索引时的字段顺序一致,可以是 F1 或 F1 , F2 或 F1 , F2 ,F3 。否则 SQL SERVER 不会用到该索引。 尽快地提交事务SQL SERVER 为了支持事务一致性,对共享的资源上保留锁直至事务被提交。其他要使用相同资源的用户必须要等待。如果一个事务变长的话,锁的队列以及等待锁的用户队列将会变长,这最终导致系统吞吐量的降低。长的事务还增加了出现死锁的可能性。具体包括在事务中不能包含用户交互,避免更新同一数据两次,大批量的数据更新放在事物的后面部分等。 尽量减少对列的四则运算• 在 WHERE 子句中,尽量减少对列的四则运算。例如: select colA from tableA where salary * 12 > 12000• 应该用如下语句代替:select colA from tableA where salary > 1000• 在 WHERE 子句中,尽量用 >= 代替 > 。例如: select F1 from Table1 where a>3 (其中 a 为 int 型)• 在该例中 ,a 列上是有索引的, SQL SERVER 扫描索引页,直到 a=3 的页,然后顺序扫描,直到 a=4 ,如果 a=3 的记录很多,会有很多无效的 I/O 操作。• 应该用如下语句代替: elect F1 from Table1 where a>=4 避免在 IF EXISTS 和 IN 操作符中使用 NOT因为不使用 NOT , SQL SERVER 在得到满足条件的第一条记录后返回,而使用 NOT操作符, SQL SERVER 可能要扫描整个表。例如:if not exists (select * from tableA where…)begin statement group oneendelsebegin statement group twoend应该用如下语句代替:if exists (select * from tableA where…)begin statement group twoendelsebegin statement group oneend IF EXISTS 语句•在判断有无符合条件的记录时不要用 SELECT COUNT ( * ) 语句,而是要用 IF EXISTS 语句:例如:declare @var intselect @var = count(*) from employee where emp_id = 123if @var != 0... more sql code ...•应该用如下语句代替:if exists (select 1 from employee where emp_id = 123)begin... more sql code ...end WHERE 子句中的等于列( 1 )• 在 WHERE 子句中如果对于某列有等于的条件,则在 SELECT 子句中不应该出现该列,例如:select cust_number, cust_namefrom customer where cust_number = 612• 应该用如下语句代替:select cust_namefrom customer where cust_number = 612 WHERE 子句中的等于列( 2 )• 在 WHERE 子句中如果对于某列有等于的条件,则在ORDER BY 子句中不应该出现该列,例如:select cust_number, cust_name, cust_stfrom customer where cust_st = ‘L’order by cust_st, cust_name应该用如下语句代替:select cust_number, cust_namefro...