【版本特性】sql server2012版本特性
【1】SQL相关
【1.1】列存储索引(Apollo)
即给列存储数据,加索引
列存储索引是一种使用列式数据格式(称为“列存储” )存储、检索和管理数据的技术。
所有关系表(除非指定为非聚集列存储索引)使用行存储作为基础数据格式。 如果不指定 CREATE TABLE
选项,则 WITH CLUSTERED COLUMNSTORE INDEX
将创建行存储表。
使用 CREATE TABLE
语句创建表时,可通过指定 WITH CLUSTERED COLUMNSTORE INDEX
选项(2016级以上才行),将表创建为列存储。 如果你已有一个行存储表并想要将其转换为列存储,可以使用 CREATE COLUMNSTORE INDEX
语句。
参考:(4.12)列存储的概念
官网:列存储索引的概念
【1.2】offset 1000 rows fetch next 50 rows only (order by 分页使用 )
意思是,从1000后,取50行,也就是取1001~1050 这50行,实践相关演示如下
SELECT LastName, FirstName, EmailAddress FROM Employee ORDER BY LastName, FirstName, EmailAddress OFFSET 14000 ROWS FETCH NEXT 50 ROWS ONLY;
【1.3】throw错误处理语句
THROW THROW <number>, <message>, <state>; Batch abort. 如果 SET XACT_ABORT ON, Transaction abort. 不会自动使用 sys.messages And re-THROW BEGIN CATCH …; THROW; END CATCH
严重性级别及其影响非常复杂
错误导致的结果及其处理流程非常复杂
不作处理
语句终止(Statement abort)
作用域终止(Scope Abort)
批处理终止(Batch abort )
事务终止(Transaction abort)
连接终止(Connection abort)
TRY/CATCH block 导致 RAISERROR 不可预测
--Throw语句尝试 --1.更简洁优雅的代码 --2.可以正确的标识出出错的行数,对于大量T-SQL来说,这点可以节省不少时间 BEGIN TRAN BEGIN TRY select 1/0; COMMIT END TRY BEGIN CATCH ROLLBACK; --RAISERROR('自定义错误消息',12,1) --THROW THROW 50001,'自定义错误消息',1; --PRINT ERROR_NUMBER+ERROR_SEVERITY()+ERROR_STATE()+ERROR_PROCEDURE()+ERROR_LINE()+ERROR_MESSAGE() END CATCH
【1.4】Sequence 语句
SQL Server2012中的SequenceNumber尝试
用户自定义的数据库对象
用于生成数字序列
独立于数据表
与数据表之间的关系通过应用程序控制
【1.5】concat、choose、format、iif、nullif
(1)concat https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2012/hh231515(v=sql.110)?redirectedfrom=MSDN 连null,连数字等类型,都可以直接用 Select CONCAT('SQL Server',2012,null,'RTM')
(2)choose choose(id,value1,value2,value3,...) choose函数可以根据传入的id值,返回值所对应的参数值。 比如传入2,那么就返回 value1,value2,value3,... 中的第二个参数值,也就是value2,下面是具体的例子。 --Choose select CHOOSE(ManagerID,'CareySon','Jack','Tony','Peter') FROM [AdventureWorks].[HumanResources].[Employee] --传统的CASE...WHEN SELECT ManagerID=case when ManagerID=1 then 'CareySon' when ManagerID=2 then 'Jack' when ManagerID=3 then 'Tony' when ManagerID=4 then 'Peter' else null end FROM [AdventureWorks].[HumanResources].[Employee]
(3)format,解决日期的时区转换、国家语言格式转换等问题 http://msdn.microsoft.com/en-us/library/hh213505(v=sql.110).aspx 参考:https://www.cnblogs.com/gered/p/12881689.html
select format(getdate(),'yyMMdd'),format(getdate(),'yyyyMMdd')
--解决了 convert(char(10),getdate(),120) 这种蹩脚的日期转换方式
format(value,format,culture) select FORMAT( getdate(), 'yyyy年MM月dd日', 'zh-cn') as 当前日期
(4)IIF(1>2,'结果1','结果2') --IIF示例 select IIF(1>2,'结果1','结果2')
(5)nullif
--nullif示例,两个表达式相等则返回null
--参考:使用nullif+isnull 解决被除数为0的问题:https://www.cnblogs.com/Nina-piaoye/p/5983480.html?tdsourcetag=s_pctim_aiomsg
nullif(expression1,expression2)
【1.6】Parse/Cast、Convert、Parse/Try_parse、cast/ry_cast
转换函数系列;
--带语言习惯转换
SELECT PARSE('Monday, 13 December 2010' AS datetime2 USING 'en-US') AS Result
--try开头,即使无法转换,也会返回null值,而不会报错。如下try_cast
SELECT Cast('Monday, 13 December 2010' AS datetime2) AS Result
SELECT try_cast('Monday, 13 December 2010' AS datetime2) AS Result
【1.7】eoMonth/datefromParts
eoMonth, dateFromParts, timeFromParts, dateTimeFromParts, dateTimeOffsetFromParts 日期函数系列; --eomonth,获取当月最后一天 select EOMONTH(getdate()) --结果:2020-05-31 --dateFromParts(year,month,day),通过传入年月日来得到一个DATE。但是如果你一旦传入的参数无法构造出一个合法的时间,就会报错。 select dateFromParts(2020,5,13) --结果:2020-05-13 select dateFromParts(2020,5,35) --报错:无法构造数据类型 date,某些参数的值无效。 /* --TIMEFROMPARTS(Hour, Minutes, Seconds, FractionsOfASecond, 3) 传入的变成HOUR, MINUTE, SECOND,MILLISECOND和MILLISECOND精确位数,然后返回的是一个TIME类型。 --有一个需要注意的是这个函数的第五个参数是不支持整型变量的,必须是显示常量传入。 */ select TIMEFROMPARTS(1, 2, 3, 4, 3) --结果:01:02:03.004,注意,如果任意一个参数为null,则结果值为null --DATETIMEFROMPARTS (@Year, @Month, @Day, @Hour, @Minutes,@Seconds, @MilliSeconds) --这个就是前面两个的结合。特点也就是传入NULL值就是结果变NULL,不合法值就报错。它没有了TIMEFROMPARTS的精确位数参数 -- DATETIMEOFFSETFROMPARTS,这个比较有意思。加入了TIMEZONE。同理,不合法报错、写null结果为null -- DATETIMEOFFSETFROMPARTS (@Year, @Month, @Day, @Hour,@Minutes, @Seconds, @FractionsOfASecond, @HourOffSet,@MinuteOffSet, 3) 参考:https://www.cnblogs.com/jenrrychen/p/5165011.html
【1.8】新增窗口函数
SQL Server 2005:排名函数有RANK、DENSE_RANK、ROW_NUMBER和NTILE。
SQL Server 2012 新增:
分布函数有PERCENT_RANK、CUME_DIST、PERCENTILE_CONT和PERCENTILE_DISC。这4个函数是从SQL Server 2012开始引入的。
偏移函数是LAG、LEAD、FIRST_VALUE、LAST_VALUE和NTH_VALUE。SQL Server 2012开始支持前4个函数,但尚未支持NTH_VALUE函数。
【2】服务器、数据库相关
如何查看SP修复的问题?
https://support.microsoft.com/en-us/help/2894115/cumulative-update-package-7-for-sql-server-2012-sp1
【2.1】alwayson高可用性(一拖三)
【2.2】包含数据库(Contained Database)
sp_configure 'show advanced options',1 reconfigure go sp_configure 'contained database authentication',1 reconfigure go
【2.3】数据库级别的恢复间隔 (Indirect CheckPoint)
Indirect Checkpoint是数据库级别的。在SQL SERVER中,包括Contained Database,SQL Server把一些设置从实例级别转到了数据库级别。
按照MSDN上对Indirect CheckPoint的描述,我对Indirect CheckPoint的理解是独立于实例级别CheckPoint的的额外线程。仅仅负责其所在的数据库。因此带来的好处可以归结如下。
1.更少的数据库恢复时间(CheckPoint间隔小了,自然恢复时间就少了)
2.更精确的恢复时间。现在不仅仅CheckPoint的范围缩小了,并且最大恢复时间是以秒为单位。
3.由于这个Indirect CheckPoint线程将其所负责数据库范围内的Dirty Page写入磁盘,所以实例级别的CheckPoint可以减少对磁盘的一次性写入量。从而减少了实例级别CheckPoint的负载
但是,设置Indirect CheckPoint保证数据库Recovery时间尽可能短的同时,由于恢复间隔可能变短,在OLTP环境下造成更多的磁盘写入,有可能给I/O造成额外的负担
【2.4】分布式重播(Distributed Replay)
主要就是可以对数据进行跟踪后,重播在多台机器。或者从多台机器收集上来重播到一台机器。
参考:sql server2012中的分布式重播(Distributed Replay)(https://www.cnblogs.com/gered/p/12916239.html)
【2.5】自定义服务器权限
DBA可以创建数据库的权限,但不能创建服务器的权限。也就是说可以自定义服务器角色了。
比如说,DBA想要一个开发组拥有某台服务器上所有数据库的读写权限,他必须手动的完成这个操作。
但是SQL Server 2012 支持针对服务器的权限设置。
【2.6】增强审计(audit)
【2.7】扩展事件(Extended Event)
概念参考:https://www.cnblogs.com/ljhdo/p/5657906.html
参考:SQL Server扩展事件-- 使用system_health默认跟踪会话监控死锁
参考:【监控笔记】【2.3】扩展事件——慢查询SQL(执行超过3S的SQL)
【2.8】备份到URL
在 SQL Server 2014 中,可以使用 SQL Server Management Studio 来备份到 Windows Azure Blob 存储服务或从中还原。“备份”任务和维护计划都可使用该新选项。
【2.9】立刻加非空列
sql server添加列为什么很快?sql server中的online 添加非空字段(sql server2012新增),立刻加列