1.1 性能优化推荐
1.1.1 采用 Select count(1) 获取数据量。
1.1.2 避免使用IN,建议采用EXIST 进行多数据条件检索
1.1.3 对数据唯一行无要求时,尽量避免使用DISTINCT 语句
1.1.4 如需要有限的记录,通过TOP N代替SET ROWCOUNT来控制排序取值
1.1.5 尽量避免在GROUP BY中使用HAVING 语句
1.1.6 GROUP BY的语句要尽量简单,不要进行GROUP BY语句的嵌套,避免在GROUP BY中包含多余的列
1.1.7 如果WHERE条件语句有多个AND条件,尽量加入带有索引列,如果没有可以建立多列复合INDEX
1.1.8 对唯一性无要求时,避免使用UNION,而是用UNION ALL 。
1.1.9 为了提高性能,应优先使用连接,然后使用子查询或嵌套查询,表之间的连接使用INNER JOIN,LEFT JOIN 和RIGHT JOIN,不使用CROSS
JOIN和多列表方式(有特殊要求除外)
1.1.10 多表关联避免超过5个,可以通过临时表(表变量),简化复杂的关联
1.1.11 应用程序中,对于需要用多语句才能完成的操作必须通过存储过程的方式实现;避免在应用程序中创建临时表
1.1.12 视图中连接表的数量不能超过8个
1.1.13 视图增加连接表时,必须在设计文档里说明,且经过视图创建者确认通过。不得随意增加连接表,以免影响其他系统程序的运行效率
1.1.14 在一张表中可以完成的查询、更新、删除等操作,避免使用视图
1.1.15 反复关联同一张表查询数据时,效率较低。新建临时表,把反复关联的数据,更新到临时表后再关联。
反例:
SELECT a.duty_userid,b.empCname AS duty_name,c.empCname AS chk_name ,e.empCname AS app_name
FROM ord2_klsz_so_master a
JOIN empGeneral b ON a.duty_user=b.userid
JOIN empGeneral c ON a.user_id=c.userid
JOIN empGeneral d ON a.app_user_id=d.userid
WHERE ....
正例:
CREATE #tmpDutyEmp
(duty_user_id varchar(30),duty_name varchar(30),chk_user_id varchar(30),chk_user_name varchar(30),app_user_id varchar
(30),app_user_name varchar(30))
INSERT INTO #tmpDutyEmp(duty_userid,duty_name)
SELECT duty_userid ,duty_name
FROM ord2_klsz_so_master a
JOIN empGeneral b ON a.duty_userid=b.userid
...
UPDATE
SET chk_user_name =b.empCname
FROM #tmpDutyEmp a
JOIN empGeneral b ON a.chk_user_id=b.empCname
...
1.1.16 尽量避免关联子查询,当子查询为大数据量的表时,效率极低。应先把查询的数据,写入临时表,再用临时表关联。
反例:
SELECT order_code,...
FROM ord2_klsz_so_master a
JOIN (SELECT order_code FROM ord2_klsz_so_detail WHERE item_model=’KLQ6100’)
正例:
CREATE #tmp_order_detail(order_code....)
SELECT order_code,...
FROM ord2_klsz_so_master a
JOIN #tmp_order_detail b ON a.order_code=b.order_code
WHERE ...