This document summarizes some new features in SQL Server 2016, including:
1) The IF EXISTS clause which allows dropping objects conditionally to avoid errors if the object does not exist.
2) The TEXT SPLIT function which splits text into rows based on a delimiter to count values in comma separated lists.
3) Temporal tables which allow tracking changes to rows over time for historical analysis and the ability to query past data.
4) Columnstore indexes which store data by column rather than by row for improved query performance on analytical workloads involving aggregations and scans.
3. IF EXISTS
--in versions before 2016
IF OBJECT_ID('[dbo].[V_319AdHocObjects]') IS NOT NULL
BEGIN
DROPVIEW [dbo].[V_319AdHocObjects];
END;
GO
CREATEVIEW [dbo].[V_319AdHocObjects]
AS
SELECT name AS object_name,
SCHEMA_NAME(schema_id) AS schema_name,
x.type_desc
FROM sys.objects x
LEFT JOIN sys.dm_exec_procedure_statsAS d ON
OBJECT_NAME(d.object_id, d.database_id) = name
WHERE SCHEMA_NAME(schema_id) <> 'sys';
--in versions 2016
DROPVIEW IF EXISTS [dbo].[V_319AdHocObjects];
GO
CREATEVIEW [dbo].[V_319AdHocObjects]
AS
SELECT name AS object_name,
SCHEMA_NAME(schema_id) AS schema_name,
x.type_desc
FROM sys.objects x
LEFT JOIN sys.dm_exec_procedure_statsAS d ON
OBJECT_NAME(d.object_id, d.database_id) = name
WHERE SCHEMA_NAME(schema_id) <> 'sys';
4. TEXT Split
SELECT [ID],
[REPORTING_SEGMENT]
FROM [Ad_Hoc].[dbo].[Service_Requests];
-- use 2016 new scirpt string_split to get number of IDs per reporting_Setment
SELECT value AS reporting_seg,
COUNT([ID])AS countofrequests
FROM [Ad_Hoc].[dbo].[Service_Requests]
CROSS APPLY string_split([REPORTING_SEGMENT], ',')
GROUP BY value;
5. TemporalTables
USE [Ad_Hoc]
GO
CREATETABLE [dbo].[DataAccuracy_GPM_Temporal](
[ID] int Identity(1,1) Primary Key,
[DataType] [varchar](20) NULL,
[System Name] [varchar](20) NULL,
[Date] [date] NULL,
[Model Field] [nvarchar](255) NULL,
[SourceValue] [money] NULL,
[GPTValue] [money] NULL,
[ModelValue] [decimal](14, 2) NULL
,SysStartTime datetime2GENERATEDALWAYS AS ROW
START HIDDEN NOT NULL
,SysEndTime datetime2GENERATEDALWAYS AS ROW
END HIDDEN NOT NULL
,PERIOD FOR SYSTEM_TIME (SysStartTime,SysEndTime))
WITH (SYSTEM_VERSIONING = ON
(HISTORY_TABLE=dbo.DataAccuracy_GPM_History));
Select [ID]
,[DataType]
,[System Name]
,[Date]
,[Model Field]
,[SourceValue]
,[GPTValue]
,[ModelValue]
,[SysStartTime]
,[SysEndTime]
--ChangeTimezone
--,convert(smalldatetime,[SysStartTime]ATTIME ZONE
'UTC'ATTIME ZONE 'Eastern StandardTime') as
'SystemStartTimeEST'
--,Case when [SysEndTime] = '9999-12-31
23:59:59.9999999' then [SysEndTime]ATTIME ZONE 'UTC'
--ELSE convert(smalldatetime, [SysEndTime]ATTIME
ZONE 'UTC'ATTIME ZONE 'Eastern StandardTime') end as
'SystemEndTimeEST'
from [dbo].[DataAccuracy_GPM_Temporal]
-- For SYSTEM_TIME FROM '2017-06-05 19:12:45.8094962'
to '2017-06-05 19:18:45.8094962'
-- For SYSTEM_TIME CONTAINED IN ( '2017-06-05
19:12:45.8094962', '2017-06-05 19:18:45.8094962')
6. Columnstore Indexes
--create normal rowstore index
CREATECLUSTERED INDEX [ClusteredIndex-RequestID]ON
[dbo].[Service_Requests_NormalIndex];
GO
--result normal index remember to show plan
SET STATISTICSTIME ON
SELECT [REQ_TYPE]
,count([ID])
FROM [Ad_Hoc].[dbo].[Service_Requests_NormalIndex]
group by [REQ_TYPE];
SET STATISTICSTIME OFF
go
-- create columnstore index
CREATECLUSTERED COLUMNSTORE INDEX [SR_ColumnStoreIndex]
ON Service_Requests_ColumnStoreIndex;
GO
--result
SET STATISTICSTIME ON
SELECT [REQ_TYPE]
,count([ID])
FROM [Ad_Hoc].[dbo].[Service_Requests_ColumnStoreIndex]
group by [REQ_TYPE];
SET STATISTICSTIME OFF
go