设为首页 收藏本站
查看: 1026|回复: 0

[经验分享] SQL Server 2016

[复制链接]

尚未签到

发表于 2017-7-13 14:14:29 | 显示全部楼层 |阅读模式
  1) TRUNCATE表分区而不是整表



CREATE TABLE dbo.TruncatePartitionTest
(
PrtCol INT,
Col2 NVARCHAR(300)
)
ON [myPS1](PrtCol)
GO
INSERT dbo.TruncatePartitionTest
VALUES(1,'AAA'), (11,'AAA'), (100,'AAA'), (101,'AAA')
GO

TRUNCATE TABLE dbo.TruncatePartitionTest
WITH (PARTITIONS(1 TO 2));
GO
SELECT * FROM dbo.TruncatePartitionTest
GO
TRUNCATE TABLE dbo.TruncatePartitionTest
GO
INSERT dbo.TruncatePartitionTest
VALUES(1,'AAA'), (11,'AAA'), (100,'AAA'), (101,'AAA')
GO

TRUNCATE TABLE dbo.TruncatePartitionTest
WITH (PARTITIONS(1));
GO
SELECT * FROM dbo.TruncatePartitionTest
GO
TRUNCATE TABLE dbo.TruncatePartitionTest
GO
INSERT dbo.TruncatePartitionTest
VALUES(1,'AAA'), (11,'AAA'), (100,'AAA'), (101,'AAA')
GO

TRUNCATE TABLE dbo.TruncatePartitionTest
WITH (PARTITIONS(1,2));
GO
SELECT * FROM dbo.TruncatePartitionTest
GO
  2) 新的查询提示NO_PERFORMANCE_SPOOL
  为了试验这个新的查询提示关键字,我对一个查询语句启用和不启用这个查询提示后的IO统计数据进行一个对比。
  添加了NO_PERFORMANCE_SPOOL的语句和IO统计数据



SET STATISTICS IO ON
GO
SELECT *
FROM [dbo].[vwPO]
WHERE PODATE BETWEEN '2012-01-01' AND '2014-01-31'
OPTION (NO_PERFORMANCE_SPOOL);  



(5448 row(s) affected)
Table 'Workfile'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Address'. Scan count 5, logical reads 49038, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'PurchaseOrder'. Scan count 5, logical reads 9267, physical reads 0, read-ahead reads 0, lob logical reads 17936, lob physical reads 0, lob read-ahead reads 0.
DSC0000.jpg

  未添加查询提示



SET STATISTICS IO ON
GO
SELECT *
FROM [dbo].[vwPO]
WHERE PODATE BETWEEN '2012-01-01' AND '2014-01-31';  



(5448 row(s) affected)
Table 'Workfile'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 1, logical reads 24864, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'tblAddress'. Scan count 5, logical reads 15, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
lob read-ahead reads 0.
Table 'tblPurchaseOrder'. Scan count 5, logical reads 9267, physical reads 0, read-ahead reads 0, lob logical reads 17936, lob physical reads 0, lob read-ahead reads 0.
DSC0001.jpg

  其实最后两者在时间上的差别基本没有,做法上的最大差别也显而易见且可想而知。SPOOL操作符的特点就是创建Work table来供后面的操作符使用。而既然禁用了SPOOL操作符也就意味着不使用Work table,这样上面的IO Statistics结果也反映了这一点。但是并不意味着这是好事。不使用work table意味着后面每次都需要扫描表,这种开销也蛮大的。这个例子里面因为涉及扫描的表小所以差异微乎其微。在我看来,这个功能在现实中的使用场景很少见。只能说有比没有好。本来执行计划的东西非不得已都是让SQL SERVER自己决定。微软宣称这个查询提示可以大大改善高并发场景下使用了SPOOL的查询语句性能。这点我承认。但是,在我看来,这是属于治标不治本的做法。一般使用到SPOOL的语句,很大可能是因为没有适用的索引,所以根本原因很可能是缺乏可用的索引。其次,适用了这个提示可能导致过多的表扫描,性能上未必有提升。真正应该考虑的是审查语句是否存在改写的可能性来降低复杂性从而改变执行计划使得预建的索引得以使用最终获得最优的执行计划,以及是否需要stage数据来解决高并发问题。
  3) DROP IF EXISTS 语句
  以前要DROP某张表某个存储过程总是需要IF EXISTS(SELECT * FROM sys.objects WHERE name = '' AND .....),现在终于有更加简洁的做法来实现。
  DROP  <TABLE|PROCEDURE|VIEW|FUNCTION|TRIGGER> IF EXISTS <name>
  它可以作用于下面这些数据库对象

  AGGREGATE

  PROCEDURE

  TABLE

  ASSEMBLY

  ROLE

  TRIGGER

  VIEW

  RULE

  TYPE

  DATABASE

  SCHEMA

  USER

  DEFAULT

  SECURITY POLICY

  VIEW

  FUNCTION

  SEQUENCE

  INDEX

  SYNONYM

  4) 在使用DBCC CHECKTABLE和DBCC CHECKDB这种语句的时候可以使用MAXDOP语句来避免对系统性能造成过多的影响,因为如果有业务关键作业正在工作,而服务器的处理器核心数不多,DBCC CHECKTABLE容易导致频繁的上下文切换。
  5)可以使用sp_set_session_context 来设置会话级别的上下文以及使用SESSION_CONTEXT来查看某个会话级别主键的上下文内容。



EXEC sp_set_session_context 'user_id', 4;  
SELECT SESSION_CONTEXT(N'user_id');  
  6)sp_execute_external_script 存储过程支持在SQL SERVER 2016中执行R语言脚本以及通过CREATE EXTERNAL RESOURCE POOL来为R语言创建资源池
  7)COMPRESS和DECOMPRESS函数可以使用GZIP压缩算法压缩字符串和使用ZIP算法解压缩字符串
  8)新的函数DATEDIFF_BIGINT和DATEDIFF作用是一样,不过区别是返回值是BIGINT,这样在处理millisecond这样的情况是就可以支持更长的时间差。新的函数AT TIME ZONE则可以输出带有时区的datetimeoffset



SELECT getdate() AT TIME ZONE 'China Standard Time';  
  9)两个新的字符串函数 STRING_SPLIT和 STRING_ESCAPE。前者是个表函数,输入text和分隔符就可以分割字符串变成表返回。问题是分隔符只支持1个字符长度的字符。而后者是为了帮助json格式的数据转义特殊字符,比如斜杠。
  10)新的数据库选项MIXED_PAGE_ALLOCATION 可以指定数据库是否默认情况下是否首先对索引分配混合分区,SQL SERVER 2016以前的版本某人情况下是分配混合分区先。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-393438-1-1.html 上篇帖子: Sql Server优化---统计信息维护策略 下篇帖子: SQL Server中INNER JOIN与子查询IN的性能测试
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表