灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:2725回复:0

[SQL Server]SQL SERVER性能调优之三(T-SQL优化)

楼主#
更多 发布于:2012-09-04 18:05

SQL SERVER性能调优之三(T-SQL优化)

(一)T-SQL原则
1、不要在OLTP服务器做统计和报表运行,应该讲Group by等类似的统计语句放到单独的服务器运行(即OLTP和OLAP分开),可以采用手工或者MS SQL复制将统计的数据分发到OLAP服务器
2、T-SQL是否返回了过多的数据?客户端真的需要这么多数据吗?返回过多的数据意味很多的IO操作,频繁的执行类似语句对IO cpu均会产生压力。  www.atcpu.com  
3、索引是否符合SAGE。
4、是否将频繁执行语句封装成了储存过程?可以减少网络流量,减少执行计划的编译时间。
5、程序员是否执行大量的游标语句?一切关系型数据库都是擅长集合运算。
6、客户端调用的SP中,是否SET NOCOUNT ON?不关闭该选项的话,服务器会发送消息给客户端,增加了网络流量。
7、事务还能更短吗?过长的事务意味持有锁的时间也越长,事务应该越短越好。
(二)优化示例(不断更新中):
1、UNION和UNION ALL比较

--建立示例表
CREATE TABLE UNION_TEST1
  (
     ID INT
  )

go
  www.atcpu.com  
CREATE TABLE UNION_TEST2
  (
     ID INT
  )

go

--插入示例数据
DECLARE @i INT

SET @i=1

WHILE @i < 1000
  BEGIN
      INSERT INTO UNION_TEST1
      SELECT @i

      INSERT INTO UNION_TEST2
      SELECT 10000+@i

      SET @i=@i + 1
  END



SELECT ID
FROM   UNION_TEST1
UNION
SELECT ID
FROM   UNION_TEST2


SELECT ID
FROM   UNION_TEST1
UNION ALL
SELECT ID
FROM   UNION_TEST2  

如果两个联合的记录没有重复数据应该使用UNION ALL。
比较执行计划(发现明显消耗影响,这个例子大概相差5倍)




2、SAGE例子
   www.atcpu.com  

--建立示例表
CREATE TABLE SAGE_test
  (
     ID INT
  )

--建立索引
CREATE INDEX idx_id
  ON sage_test(ID)


--插入示例数据
DECLARE @i INT

SET @i=1

WHILE @i < 100000
  BEGIN
      INSERT INTO SAGE_test
      SELECT @i

      SET @i=@i + 1
  END

SET statistics io ON

SELECT ID
FROM   SAGE_test
WHERE  ID = 3
  www.atcpu.com  
SELECT ID
FROM   SAGE_test
WHERE  Abs(ID) = 3  


对应的统计信息,消耗差异明显。
表 'SAGE_test'。扫描计数 1,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'SAGE_test'。扫描计数 1,逻辑读取 270 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。




喜欢0 评分0
游客

返回顶部