【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
(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 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')
【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 存储服务或从中还原。“备份”任务和维护计划都可使用该新选项。