技术开发 频道

SQL“财富”背后的习惯

  三、只返回需要的数据

  返回数据到客户端至少需要数据库提取数据、网络传输数据、客户端接收数据以及客户端处理数据等环节,如果返回不需要的数据,就会增加服务器、网络和客户端的无效劳动,其害处是显而易见的,避免这类事件需要注意。

  A、横向来看。

  (1) 不要写SELECT *的语句,而是选择你需要的字段。

  (2) 当在SQL语句中连接多个表时,请使用表的别名并把别名前缀于每个Column上。这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误。

如有表table1(ID,col1)和table2 (ID,col2)
Select A.ID, A.col1, B.col2
-- Select A.ID, col1, col2 –不要这么写,不利于将来程序扩展
from table1 A inner join table2 B on A.ID=B.ID Where

  B、纵向来看。

(1)合理写WHERE子句,不要写没有WHERE的SQL语句。
(
2)SELECT TOP N * --没有WHERE条件的用此替代。

  四、尽量少做重复的工作

  A、控制同一语句的多次执行,特别是一些基础数据的多次执行是很多程序员很少注意的。

  B、减少多次的数据转换,也许需要数据转换是设计的问题,但是减少次数是程序员可以做到的。

  C、杜绝不必要的子查询和连接表,子查询在执行计划一般解释成外连接,多余的连接表带来额外的开销。

  D、合并对同一表同一条件的多次UPDATE,比如:

UPDATE EMPLOYEE SET FNAME='HAIWER'
WHERE EMP_ID=' VPA30890F' UPDATE EMPLOYEE SET LNAME='YANG'
WHERE EMP_ID=' VPA30890F'
这两个语句应该合并成以下一个语句:
UPDATE EMPLOYEE SET FNAME='HAIWER',LNAME='YANG' WHERE EMP_ID=' VPA30890F'

  E、UPDATE操作不要拆成DELETE操作+INSERT操作的形式,虽然功能相同,但是性能差别是很大的。

  五、注意临时表和表变量的用法

  在复杂系统中,临时表和表变量很难避免,关于临时表和表变量的用法,需要注意:

  A、如果语句很复杂,连接太多,可以考虑用临时表和表变量分步完成。

  B、如果需要多次用到一个大表的同一部分数据,考虑用临时表和表变量暂存这部分数据。

  C、如果需要综合多个表的数据,形成一个结果,可以考虑用临时表和表变量分步汇总这多个表的数据。

  D、其他情况下,应该控制临时表和表变量的使用。

  E、关于临时表和表变量的选择,很多说法是表变量在内存,速度快,应该首选表变量,但是在实际使用中发现。

  (1) 主要考虑需要放在临时表的数据量,在数据量较多的情况下,临时表的速度反而更快。

  (2) 执行时间段与预计执行时间(多长)。

  F、关于临时表产生使用SELECT INTO和CREATE TABLE + INSERT INTO的选择,一般情况下SELECT INTO会比CREATE TABLE + INSERT INTO的方法快很多,但是SELECT INTO会锁定TEMPDB的系统表SYSOBJECTS、SYSINDEXES、SYSCOLUMNS,在多用户并发环境下,容易阻塞其他进程,所以我的建议是,在并发系统中,尽量使用CREATE TABLE + INSERT INTO,而大数据量的单个语句使用中,使用SELECT INTO。

0
相关文章