T-SQL使用经验汇总

本文提供了SQL Server数据库设计与查询优化的详细指南,包括表字段选择、查询优化技巧、执行计划管理和缓存清理等方面的内容。

表字段

1)     字段值在允许为空的情况下,尽量采用默认值

 

2)     日期类型的数据字段,尽量采用整型类型(unix timespan),其次采用datetime类型,不要使用字符串类型来存放,如:nvarchar,varchar

 

3)     数值类型的数据字段,应使用sqlserver中对应的数值类型来存放,不要使用字符串类型来存放,如:nvarchar,varchar

 

4)     字段索引不要建太多,应根据数据表承载业务数据的实际情况进行创建索引

 

Select单表或多表查询

1)     内联表位置的摆放遵循“左大右小”原则

 

2)     Select 后字段名称尽可能显式地指定,尽可能少用*号代替

 

3)     Select 字段中不要使用子查询,可寻求表关联的方式代替

 

Select或Update条件

1)     尽量少用函数进行条件筛选,如:substring、charindex、isdate等

 

2)     Where条件中的字段尽可能是索引(但不是索引越多越好)

 

3)     Where条件中各条件的位置优先级排列标准:

       函数表达式条件-> 字段比较条件 -> 字符串常量条件-> 数值常量条件

 

4)     少用in操作,采用exists操作代替

 

5)     多表关联情况下Where中条件可放在On 关联中

 

6)     Where如果有多个or操作可考虑用union all 代替

 

7)     Like条件尽量使用半模糊,如: like ‘xxx%’

 

8)     Order by 排序字段中少用函数表达式或字段

 

9)     需要在Where 条件中进行动态判断操作时,可以采类似如下写法:(‘’= @id orid=@id) 

复杂t-sql

1)     多个查询结果合并union all 优于union

2)     如果有多重子查询结果行关联查询,采用with 公用表达式

3)     Groupby 优于Distinct 关键字

4)     多重子查询嵌套,尽量将筛选条件放在里内层的子查询中

5)     Groupby 分组查询条件尽量在where中,少放在having中进行筛选,数据量超大或查询复杂度很高的情况下少用sqlserver2005版自带的partitionby等语法

6)     Groupby 分组合并统计的字段不要存在null值,对于sum求和要先isnull转换过滤

7)     在store procedure 或function中少用字符串拼装方式生成sql脚本,sql脚本条件多采用参数传入的方式,如:where id=@id ,外部应用通过数据连接请求的方式提交到sqlserver内部执行的sql脚本也应多采用参数传入的方式,如:where id=@id

8)     在包含有频繁(或并发)业务逻辑的store procedure 或 function中少用cursor操作,少用#临时表操作。对于cursor代替方案可寻求update的多表内联更新方式,对于#临时表代替方案可寻求视图或with公用表达式的方式

9)     要编写动态order by 字段时,可采用casewhen进行判断,减少拼装字符串操作

10) 表值函数内联查询优于表之间的关联查询,如

      Select a.id, b.name from table1 as a OUTER APPLY fun(a.id) b

Sqlserver优化与管理

 

执行计划

1)     系统表sys.dm_exec_cached_plans存放sqlserver执行计划缓存

 

2)     系统表函数sys.dm_exec_sql_text 通过对执行计划句柄的参数可以得到具体是哪个执行计划的名称

 

通常结合的使用示例:

 

SELECT usecounts , p.size_in_bytes , [sql].[text]

FROM sys.dm_exec_cached_plans p

OUTER APPLY sys.dm_exec_sql_text(p.plan_handle) sql

 

各字段意义和使用规则可参考sqlserver 自定的BookOnline帮助

 

DBCC命令

3)     DBCC FREEPROCCACHE 清除当前执行计划缓存

 

4)     DBCC FREESESSIONCACHE  清除当前会话状态缓存

 

5)     DBCC FREESYSTEMCACHE('All')  清除所有缓存

 

6)     DBCC DROPCLEANBUFFERS  从缓冲池中删除所有缓冲区

具体使用参考microsoft 官网的msdn

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值