T-SQL优化

1、游标处理数据的方式是一次一条记录,而不是使用基于集合的方法。是使用游标还是使用WHILE循环,要具体分析需求,如果是每条记录都要做个性化处理,则使用游标。如果不需要,则基于集合操作即可。

2、合并联接:可以在一个表上同时执行插入、更新和删除操作。合并连接执行更少的数据库读取,并且运行速度更快。
MERGE INTO 目标表
USING 源表
    ON 目标表与源表的匹配条件
WHEN MATCHED THEN
    UPDATE SET 目标表字段=源表.字段
WHEN NOT MATCHED BY TARGET THEN
    INSERT(字段1,字段2,...) VALUES(源表.字段1,源表.字段2,...)
WHEN NOT MATCHED BY SOURCE THEN
    DELETE;
GO

3、分组集:允许同时聚合多个字段分组,将所有不同的结果一起返回。
SELECT A,B,C,SUM(NUM)
FROM TABLENAME
GROUP BY GROUPING SETS((A),(B),(C),())
注:()会统计出总数,如果不需要可以去掉。每个分组列都包含在一个括号里,如果(A,B),则表示以AB进行分组

4、非重复值聚合:以COUNT(DISTINCT 字段)的形式使用DISTINCT关键字计算唯一值数。
SQL SERVER 2008计算非重复值聚合,它必须基于输入数据流创建和读取中间结果表。对于同一查询中的多个非重复值聚合来说,SQL SERVER会重复这一过程,销毁并重新创建数据流,为每个总计生成新的中间结果。
在能使用子查询的情况下不要使用非重复值聚合。

5、查询表的记录数
Count(*) : 对主键进行索引扫描或在没有主键的情况下执行全表扫描
针对于不常插入和删除的表或对记录数要求不是很精确的情况下,可以用Select Sum(row_count) From sys.dm_db_partition_stats Where object_id=object_id('表名') And index_id<=1语句进行查询

6、临时表与表变量
   a、临时表在tempdb中创建,表变量在内存中创建
   b、临时表具有会话作用域,表变量只有过程/批处理作用域
   c、临时表可以使用DDL,表变量不可以使用DDL
   d、表变量上的统计信息不会被计算
   e、表变量不参与事务或锁定,不受回滚影响
 

 

本文出自 “杨金澎” 博客,谢绝转载!

你可能感兴趣的:(SQL优化)