SQL Server 2016 ->> T-SQL新特性

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 partitions 1 to 2
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 partition 1
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 partitions 1 and 2
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.

未添加查询提示

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.

其实最后两者在时间上的差别基本没有,做法上的最大差别也显而易见且可想而知。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‘;  -- from select * from sys.time_zone_info

9)两个新的字符串函数 STRING_SPLIT和 STRING_ESCAPE。前者是个表函数,输入text和分隔符就可以分割字符串变成表返回。问题是分隔符只支持1个字符长度的字符。而后者是为了帮助json格式的数据转义特殊字符,比如斜杠。

10)新的数据库选项MIXED_PAGE_ALLOCATION 可以指定数据库是否默认情况下是否首先对索引分配混合分区,SQL SERVER 2016以前的版本某人情况下是分配混合分区先。

时间: 2024-08-25 20:38:52

SQL Server 2016 ->> T-SQL新特性的相关文章

SQL Server 2016 Failover + ALwaysOn

我们前面写了很多关于SQL Server相关的文章,近期公司为了提高服务的可用性,就想到了部署AlwaysOn,之前的环境只是部署了SQL Server Failover Cluster,所以决定将云端放一台SQL Server来配置ALwaysOn,具体思路就是在本地的SQL Server Failover Cluster中再增加一个节点,然后将新家的节点放到Azure云端,然后在这两个实例之间配置AlwaysOn,部署后,有个问题就是集群之间无法自动故障转移,需要手动干预才可以具体后期我们再

SQL Server 2016 白皮书

随着SQL Server 2016正式版发布日临近,相关主要特性通过以下预览学习: Introducing Microsoft SQL Server 2016 e-bookSQL Server 2016 Deeper Insights Across DataSQL Server 2016 Hyper-scale CloudSQL Server 2016 In-memory OLTPSQL Server 2016 In-memory OLTP and Columnstore Feature Com

SQL Server -&gt;&gt; 深入探讨SQL Server 2016新特性之 --- Temporal Table(历史表)

原文:SQL Server ->> 深入探讨SQL Server 2016新特性之 --- Temporal Table(历史表) 作为SQL Server 2016(CTP3.x)的另一个新特性,Temporal Table(历史表)记录了表历史上任何时间点所有的数据改动.Temporal Table其实早在ANSI SQL 2011就提出了,而SAP HANA, DB2和Oracle早已在它们的产品中加入/实现了这一特性.所以说微软其实是落后了几个竞争对手.既然在CTP3.0中加入了,相信

SQL Server 2016新特性:DROP IF EXISTS

原文:SQL Server 2016新特性:DROP IF EXISTS ?? 在我们写T-SQL要删除某个对象(表.存储过程等)时,一般会习惯先用IF语句判断该对象是否存在,然后DROP,比如: 旧版本: IF OBJECT_ID('dbo.PERSON','U') IS NOT NULL DROP TABLE PERSON IF EXISTS (SELECT * FROM sys.objects where name = 'PERSON') DROP TABLE PERSON SQL Ser

SQL Server -&gt;&gt; SQL Server 2016新特性之 --- Query Store

前言 SQL Server 2016引入新的查询语句性能监控.调试和优化工具/功能 -- Query Store.以前我们发现一条查询语句性能突然下降,我们要去找出问题的所在往往需要通过调用一些DMV(比如sys.dm_exec_query_stats, sys.dm_exec_sql_text和sys.dm_exec_query_plan)来获取查询计划的一些信息,比如XML格式的执行计划,查询语句的代码,执行了多少次以及一些资源和时间的的使用消耗情况.然后根据这些信息来判断这条语句是否存在性

SQL Server -&gt;&gt; SQL Server 2016新特性之 -- Dynamic Data Masking

Dynamic Data Masking是为了防止敏感数据暴露给未经授权的用户,以一种最小开销和维护成本的形式.Dynamic Data Masking用于表的字段,相当于盖住字段数据的一部分.比如一些像邮件或者工资这样敏感的数据,涉及PII的,我们可以运用这个功能.运用这个功能的步骤,首先先定义一组人(database role)可以拥有看数据的权限,然后GRANT UNMASK权限给这个角色组.微软提供了4种类型的masking给我们选择:default,email,random和custo

SQL Server 2016新特性:Live Query Statistics

SSMS可以提供可以查看正在执行的计划.live query plan可以查看一个查询的执行过程,从一个查询计划操作到另外一个查询计划操作.live query plan提供了整体的查询运行进度和操作级别的执行统计信息,比如产生的行数,执行的时间,操作进度等等.因为这些数据是实时的,不需要等待查询完成,这些统计信息对调试查询性能问题很有用.这个特性从SQL Server 2016开始,但是在2014上也可以运行了. Remark 到SQL Server 2016,有2个方法开启Statistic

SQL Server 2016 CTP2.3 的关键特性

SQL Server 2016 CTP2.3 的关键特性 数据库方面的增强 Row Level Security已经支持In-memory OLTP 表.用户现在可以对内存优化表实施row-level security策略. 另外SCHEMABINDING.predicate 函数和内联表值函数都要包含NATIVE_COMPILATION编译选项. 使用NATIVE_COMPILATION编译选项的UDFs用户定义函数可以在本地模块和交换查询中使用,就像内存优化表和磁盘表. 没有使用NATIVE

SQL Server 2016中In-Memory OLTP继CTP3之后的新改进

SQL Server 2016中In-Memory OLTP继CTP3之后的新改进 转译自:https://blogs.msdn.microsoft.com/sqlserverstorageengine/2016/03/25/whats-new-for-in-memory-oltp-in-sql-server-2016-since-ctp3/ SQL Server 2016正在对 In-Memory OLTP 功能作一系列的强化,从而使该功能使用起来更加方便,性能更优.在之前的文章中,我已经对S