diff --git a/samples/features/intelligent-query-processing/Intelligent QP Demos Enlarging WideWorldImportersDW.sql b/samples/features/intelligent-query-processing/Intelligent QP Demos Enlarging WideWorldImportersDW.sql index fcea7bba8a..9ebea812d3 100644 --- a/samples/features/intelligent-query-processing/Intelligent QP Demos Enlarging WideWorldImportersDW.sql +++ b/samples/features/intelligent-query-processing/Intelligent QP Demos Enlarging WideWorldImportersDW.sql @@ -1,109 +1,109 @@ --- ***************************************************** -- --- Purpose of this script: make WideWorldImportersDW --- bigger - so you can see more impactful --- Intelligent QP demonstrations (aka.ms/iqp) --- --- Script last updated 05/03/2019 --- --- Database backup source: aka.ms/wwibak --- --- Initial database file to restore before beginning this script: --- WideWorldImportersDW-Full.bak --- ***************************************************** -- - -USE WideWorldImportersDW; -GO - -/* - Assumes a fresh restore of WideWorldImportersDW -*/ - -IF OBJECT_ID('Fact.OrderHistory') IS NULL BEGIN - SELECT [Order Key], [City Key], [Customer Key], [Stock Item Key], [Order Date Key], [Picked Date Key], [Salesperson Key], [Picker Key], [WWI Order ID], [WWI Backorder ID], Description, Package, Quantity, [Unit Price], [Tax Rate], [Total Excluding Tax], [Tax Amount], [Total Including Tax], [Lineage Key] - INTO Fact.OrderHistory - FROM Fact.[Order]; -END; - -ALTER TABLE Fact.OrderHistory -ADD CONSTRAINT PK_Fact_OrderHistory PRIMARY KEY NONCLUSTERED([Order Key] ASC, [Order Date Key] ASC)WITH(DATA_COMPRESSION=PAGE); -GO - -CREATE INDEX IX_Stock_Item_Key -ON Fact.OrderHistory([Stock Item Key]) -INCLUDE(Quantity) -WITH(DATA_COMPRESSION=PAGE); -GO - -CREATE INDEX IX_OrderHistory_Quantity -ON Fact.OrderHistory([Quantity]) -INCLUDE([Order Key]) -WITH(DATA_COMPRESSION=PAGE); -GO - -/* - Reality check... Starting count should be 231,412 -*/ -SELECT COUNT(*) FROM Fact.OrderHistory; -GO - -/* - Make this table bigger (exec as desired) - Notice the "GO 4" -*/ -INSERT Fact.OrderHistory([City Key], [Customer Key], [Stock Item Key], [Order Date Key], [Picked Date Key], [Salesperson Key], [Picker Key], [WWI Order ID], [WWI Backorder ID], Description, Package, Quantity, [Unit Price], [Tax Rate], [Total Excluding Tax], [Tax Amount], [Total Including Tax], [Lineage Key]) -SELECT [City Key], [Customer Key], [Stock Item Key], [Order Date Key], [Picked Date Key], [Salesperson Key], [Picker Key], [WWI Order ID], [WWI Backorder ID], Description, Package, Quantity, [Unit Price], [Tax Rate], [Total Excluding Tax], [Tax Amount], [Total Including Tax], [Lineage Key] -FROM Fact.OrderHistory; -GO 4 - -/* - Should be 3,702,592 -*/ -SELECT COUNT(*) FROM Fact.OrderHistory; -GO - -IF OBJECT_ID('Fact.OrderHistoryExtended') IS NULL BEGIN - SELECT [Order Key], [City Key], [Customer Key], [Stock Item Key], [Order Date Key], [Picked Date Key], [Salesperson Key], [Picker Key], [WWI Order ID], [WWI Backorder ID], Description, Package, Quantity, [Unit Price], [Tax Rate], [Total Excluding Tax], [Tax Amount], [Total Including Tax], [Lineage Key] - INTO Fact.OrderHistoryExtended - FROM Fact.[OrderHistory]; -END; - -ALTER TABLE Fact.OrderHistoryExtended -ADD CONSTRAINT PK_Fact_OrderHistoryExtended PRIMARY KEY NONCLUSTERED([Order Key] ASC, [Order Date Key] ASC) -WITH(DATA_COMPRESSION=PAGE); -GO - -CREATE INDEX IX_Stock_Item_Key -ON Fact.OrderHistoryExtended([Stock Item Key]) -INCLUDE(Quantity); -GO - -/* - Should be 3,702,592 -*/ -SELECT COUNT(*) FROM Fact.OrderHistoryExtended; -GO - -/* - Make this table bigger (exec as desired) - Notice the "GO 3" -*/ -INSERT Fact.OrderHistoryExtended([City Key], [Customer Key], [Stock Item Key], [Order Date Key], [Picked Date Key], [Salesperson Key], [Picker Key], [WWI Order ID], [WWI Backorder ID], Description, Package, Quantity, [Unit Price], [Tax Rate], [Total Excluding Tax], [Tax Amount], [Total Including Tax], [Lineage Key]) -SELECT [City Key], [Customer Key], [Stock Item Key], [Order Date Key], [Picked Date Key], [Salesperson Key], [Picker Key], [WWI Order ID], [WWI Backorder ID], Description, Package, Quantity, [Unit Price], [Tax Rate], [Total Excluding Tax], [Tax Amount], [Total Including Tax], [Lineage Key] -FROM Fact.OrderHistoryExtended; -GO 3 - -/* - Should be 29,620,736 -*/ -SELECT COUNT(*) FROM Fact.OrderHistoryExtended; -GO - -UPDATE Fact.OrderHistoryExtended -SET [WWI Order ID] = [Order Key]; -GO - --- Repeat until log shrinks -CHECKPOINT -GO -DBCC SHRINKFILE (N'WWI_Log' , 0, TRUNCATEONLY) +-- ***************************************************** -- +-- Purpose of this script: make WideWorldImportersDW +-- bigger - so you can see more impactful +-- Intelligent QP demonstrations (aka.ms/iqp) +-- +-- Script last updated 05/03/2019 +-- +-- Database backup source: aka.ms/wwibak +-- +-- Initial database file to restore before beginning this script: +-- WideWorldImportersDW-Full.bak +-- ***************************************************** -- + +USE WideWorldImportersDW; +GO + +/* + Assumes a fresh restore of WideWorldImportersDW +*/ + +IF OBJECT_ID('Fact.OrderHistory') IS NULL BEGIN + SELECT [Order Key], [City Key], [Customer Key], [Stock Item Key], [Order Date Key], [Picked Date Key], [Salesperson Key], [Picker Key], [WWI Order ID], [WWI Backorder ID], Description, Package, Quantity, [Unit Price], [Tax Rate], [Total Excluding Tax], [Tax Amount], [Total Including Tax], [Lineage Key] + INTO Fact.OrderHistory + FROM Fact.[Order]; +END; + +ALTER TABLE Fact.OrderHistory +ADD CONSTRAINT PK_Fact_OrderHistory PRIMARY KEY NONCLUSTERED([Order Key] ASC, [Order Date Key] ASC)WITH(DATA_COMPRESSION=PAGE); +GO + +CREATE INDEX IX_Stock_Item_Key +ON Fact.OrderHistory([Stock Item Key]) +INCLUDE(Quantity) +WITH(DATA_COMPRESSION=PAGE); +GO + +CREATE INDEX IX_OrderHistory_Quantity +ON Fact.OrderHistory([Quantity]) +INCLUDE([Order Key]) +WITH(DATA_COMPRESSION=PAGE); +GO + +/* + Reality check... Starting count should be 231,412 +*/ +SELECT COUNT(*) FROM Fact.OrderHistory; +GO + +/* + Make this table bigger (exec as desired) + Notice the "GO 4" +*/ +INSERT Fact.OrderHistory([City Key], [Customer Key], [Stock Item Key], [Order Date Key], [Picked Date Key], [Salesperson Key], [Picker Key], [WWI Order ID], [WWI Backorder ID], Description, Package, Quantity, [Unit Price], [Tax Rate], [Total Excluding Tax], [Tax Amount], [Total Including Tax], [Lineage Key]) +SELECT [City Key], [Customer Key], [Stock Item Key], [Order Date Key], [Picked Date Key], [Salesperson Key], [Picker Key], [WWI Order ID], [WWI Backorder ID], Description, Package, Quantity, [Unit Price], [Tax Rate], [Total Excluding Tax], [Tax Amount], [Total Including Tax], [Lineage Key] +FROM Fact.OrderHistory; +GO 4 + +/* + Should be 3,702,592 +*/ +SELECT COUNT(*) FROM Fact.OrderHistory; +GO + +IF OBJECT_ID('Fact.OrderHistoryExtended') IS NULL BEGIN + SELECT [Order Key], [City Key], [Customer Key], [Stock Item Key], [Order Date Key], [Picked Date Key], [Salesperson Key], [Picker Key], [WWI Order ID], [WWI Backorder ID], Description, Package, Quantity, [Unit Price], [Tax Rate], [Total Excluding Tax], [Tax Amount], [Total Including Tax], [Lineage Key] + INTO Fact.OrderHistoryExtended + FROM Fact.[OrderHistory]; +END; + +ALTER TABLE Fact.OrderHistoryExtended +ADD CONSTRAINT PK_Fact_OrderHistoryExtended PRIMARY KEY NONCLUSTERED([Order Key] ASC, [Order Date Key] ASC) +WITH(DATA_COMPRESSION=PAGE); +GO + +CREATE INDEX IX_Stock_Item_Key +ON Fact.OrderHistoryExtended([Stock Item Key]) +INCLUDE(Quantity); +GO + +/* + Should be 3,702,592 +*/ +SELECT COUNT(*) FROM Fact.OrderHistoryExtended; +GO + +/* + Make this table bigger (exec as desired) + Notice the "GO 3" +*/ +INSERT Fact.OrderHistoryExtended([City Key], [Customer Key], [Stock Item Key], [Order Date Key], [Picked Date Key], [Salesperson Key], [Picker Key], [WWI Order ID], [WWI Backorder ID], Description, Package, Quantity, [Unit Price], [Tax Rate], [Total Excluding Tax], [Tax Amount], [Total Including Tax], [Lineage Key]) +SELECT [City Key], [Customer Key], [Stock Item Key], [Order Date Key], [Picked Date Key], [Salesperson Key], [Picker Key], [WWI Order ID], [WWI Backorder ID], Description, Package, Quantity, [Unit Price], [Tax Rate], [Total Excluding Tax], [Tax Amount], [Total Including Tax], [Lineage Key] +FROM Fact.OrderHistoryExtended; +GO 3 + +/* + Should be 29,620,736 +*/ +SELECT COUNT(*) FROM Fact.OrderHistoryExtended; +GO + +UPDATE Fact.OrderHistoryExtended +SET [WWI Order ID] = [Order Key]; +GO + +-- Repeat until log shrinks +CHECKPOINT +GO +DBCC SHRINKFILE (N'WWI_Log' , 0, TRUNCATEONLY) GO \ No newline at end of file diff --git a/samples/features/intelligent-query-processing/Intelligent QP Demos WideWorldImportersDW Public Preview - Interleaved Execution.sql b/samples/features/intelligent-query-processing/Intelligent QP Demos WideWorldImportersDW Public Preview - Interleaved Execution.sql index eb2c1161a5..176bf13a79 100644 --- a/samples/features/intelligent-query-processing/Intelligent QP Demos WideWorldImportersDW Public Preview - Interleaved Execution.sql +++ b/samples/features/intelligent-query-processing/Intelligent QP Demos WideWorldImportersDW Public Preview - Interleaved Execution.sql @@ -17,7 +17,7 @@ USE [WideWorldImportersDW]; GO -CREATE FUNCTION [Fact].[WhatIfOutlierEventQuantity](@event VARCHAR(15), @beginOrderDateKey DATE, @endOrderDateKey DATE) +CREATE OR ALTER FUNCTION [Fact].[ufn_WhatIfOutlierEventQuantity](@event VARCHAR(15), @beginOrderDateKey DATE, @endOrderDateKey DATE) RETURNS @OutlierEventQuantity TABLE ( [Order Key] [bigint], [City Key] [int] NOT NULL, @@ -122,10 +122,10 @@ GO USE [WideWorldImportersDW]; GO -SELECT [fo].[Order Key], [fo].[Description], [fo].[Package], +SELECT [fo].[Order Key], [fo].[Description], [fo].[Package], [fo].[Quantity], [foo].[OutlierEventQuantity] -FROM [Fact].[Order] AS [fo] -INNER JOIN [Fact].[WhatIfOutlierEventQuantity]('Mild Recession', +FROM [Fact].[Order] AS [fo] +INNER JOIN [Fact].[ufn_WhatIfOutlierEventQuantity]('Mild Recession', '1-01-2013', '10-15-2014') AS [foo] ON [fo].[Order Key] = [foo].[Order Key] AND [fo].[City Key] = [foo].[City Key] @@ -137,7 +137,7 @@ INNER JOIN [Fact].[WhatIfOutlierEventQuantity]('Mild Recession', AND [fo].[Picker Key] = [foo].[Picker Key] INNER JOIN [Dimension].[Stock Item] AS [si] ON [fo].[Stock Item Key] = [si].[Stock Item Key] -WHERE [si].[Lead Time Days] > 0 +WHERE [si].[Lead Time Days] > 0 AND [fo].[Quantity] > 50; GO @@ -153,10 +153,10 @@ GO USE [WideWorldImportersDW]; GO -SELECT [fo].[Order Key], [fo].[Description], [fo].[Package], +SELECT [fo].[Order Key], [fo].[Description], [fo].[Package], [fo].[Quantity], [foo].[OutlierEventQuantity] -FROM [Fact].[Order] AS [fo] -INNER JOIN [Fact].[WhatIfOutlierEventQuantity]('Mild Recession', +FROM [Fact].[Order] AS [fo] +INNER JOIN [Fact].[ufn_WhatIfOutlierEventQuantity]('Mild Recession', '1-01-2013', '10-15-2014') AS [foo] ON [fo].[Order Key] = [foo].[Order Key] AND [fo].[City Key] = [foo].[City Key] @@ -168,6 +168,6 @@ INNER JOIN [Fact].[WhatIfOutlierEventQuantity]('Mild Recession', AND [fo].[Picker Key] = [foo].[Picker Key] INNER JOIN [Dimension].[Stock Item] AS [si] ON [fo].[Stock Item Key] = [si].[Stock Item Key] -WHERE [si].[Lead Time Days] > 0 +WHERE [si].[Lead Time Days] > 0 AND [fo].[Quantity] > 50; GO diff --git a/samples/features/intelligent-query-processing/Intelligent QP Demos WideWorldImportersDW Public Preview - Scalar UDF Inlining.sql b/samples/features/intelligent-query-processing/Intelligent QP Demos WideWorldImportersDW Public Preview - Scalar UDF Inlining.sql index 8b25374f63..10253f772f 100644 --- a/samples/features/intelligent-query-processing/Intelligent QP Demos WideWorldImportersDW Public Preview - Scalar UDF Inlining.sql +++ b/samples/features/intelligent-query-processing/Intelligent QP Demos WideWorldImportersDW Public Preview - Scalar UDF Inlining.sql @@ -1,72 +1,71 @@ --- ******************************************************** -- --- Scalar UDF Inlining - --- See https://aka.ms/IQP for more background - --- Demo scripts: https://aka.ms/IQPDemos - --- Demo uses SQL Server 2019 Public Preview and also works on Azure SQL DB - --- Email IntelligentQP@microsoft.com for questions\feedback --- ******************************************************** -- -USE [master]; -GO - -ALTER DATABASE [WideWorldImportersDW] SET COMPATIBILITY_LEVEL = 150; -GO - -ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE; -GO - -USE [WideWorldImportersDW]; -GO - -/* -Adapted from SQL Server Books Online -https://docs.microsoft.com/sql/relational-databases/user-defined-functions/scalar-udf-inlining?view=sqlallproducts-allversions -*/ -CREATE OR ALTER FUNCTION - dbo.ufn_customer_category(@CustomerKey INT) -RETURNS CHAR(10) AS -BEGIN - DECLARE @total_amount DECIMAL(18,2); - DECLARE @category CHAR(10); - - SELECT @total_amount = - SUM([Total Including Tax]) - FROM [Fact].[OrderHistory] - WHERE [Customer Key] = @CustomerKey; - - IF @total_amount < 500000 - SET @category = 'REGULAR'; - ELSE IF @total_amount < 1000000 - SET @category = 'GOLD'; - ELSE - SET @category = 'PLATINUM'; - - RETURN @category; -END -GO - -SELECT * FROM sys.sql_modules -WHERE object_id = OBJECT_ID('ufn_customer_category') -GO - --- Before (show actual query execution plan for legacy behavior) -SELECT TOP 100 - [Customer Key], [Customer], - dbo.ufn_customer_category([Customer Key]) AS [Discount Price] -FROM [Dimension].[Customer] -ORDER BY [Customer Key] -OPTION (RECOMPILE,USE HINT('DISABLE_TSQL_SCALAR_UDF_INLINING')); -GO - --- After (show actual query execution plan for Scalar UDF Inlining) -SELECT TOP 100 - [Customer Key], [Customer], - dbo.ufn_customer_category([Customer Key]) AS [Discount Price] -FROM [Dimension].[Customer] -ORDER BY [Customer Key] -OPTION (RECOMPILE); -GO - +-- ******************************************************** -- +-- Scalar UDF Inlining + +-- See https://aka.ms/IQP for more background + +-- Demo scripts: https://aka.ms/IQPDemos + +-- Demo uses SQL Server 2019 Public Preview and also works on Azure SQL DB + +-- Email IntelligentQP@microsoft.com for questions\feedback +-- ******************************************************** -- +USE [master]; +GO + +ALTER DATABASE [WideWorldImportersDW] SET COMPATIBILITY_LEVEL = 150; +GO + +ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE; +GO + +USE [WideWorldImportersDW]; +GO + +/* +Adapted from SQL Server Books Online +https://docs.microsoft.com/sql/relational-databases/user-defined-functions/scalar-udf-inlining?view=sqlallproducts-allversions +*/ +CREATE OR ALTER FUNCTION + dbo.ufn_customer_category(@CustomerKey INT) +RETURNS CHAR(10) AS +BEGIN + DECLARE @total_amount DECIMAL(18,2); + DECLARE @category CHAR(10); + + SELECT @total_amount = + SUM([Total Including Tax]) + FROM [Fact].[OrderHistory] + WHERE [Customer Key] = @CustomerKey; + + IF @total_amount < 500000 + SET @category = 'REGULAR'; + ELSE IF @total_amount < 1000000 + SET @category = 'GOLD'; + ELSE + SET @category = 'PLATINUM'; + + RETURN @category; +END +GO + +SELECT * FROM sys.sql_modules +WHERE object_id = OBJECT_ID('ufn_customer_category') +GO + +-- Before (show actual query execution plan for legacy behavior) +SELECT TOP 100 + [Customer Key], [Customer], + dbo.ufn_customer_category([Customer Key]) AS [Discount Price] +FROM [Dimension].[Customer] +ORDER BY [Customer Key] +OPTION (RECOMPILE,USE HINT('DISABLE_TSQL_SCALAR_UDF_INLINING')); +GO + +-- After (show actual query execution plan for Scalar UDF Inlining) +SELECT TOP 100 + [Customer Key], [Customer], + dbo.ufn_customer_category([Customer Key]) AS [Discount Price] +FROM [Dimension].[Customer] +ORDER BY [Customer Key] +OPTION (RECOMPILE); +GO diff --git a/samples/features/intelligent-query-processing/Intelligent QP Demos WideWorldImportersDW Public Preview - TVDC.sql b/samples/features/intelligent-query-processing/Intelligent QP Demos WideWorldImportersDW Public Preview - TVDC.sql index 014c1d2eb3..91acb05cb5 100644 --- a/samples/features/intelligent-query-processing/Intelligent QP Demos WideWorldImportersDW Public Preview - TVDC.sql +++ b/samples/features/intelligent-query-processing/Intelligent QP Demos WideWorldImportersDW Public Preview - TVDC.sql @@ -1,73 +1,72 @@ --- ******************************************************** -- --- Table variable deferred compilation - --- See https://aka.ms/IQP for more background - --- Demo scripts: https://aka.ms/IQPDemos - --- This demo is on SQL Server 2019 Public Preview and works in Azure SQL DB too - --- Email IntelligentQP@microsoft.com for questions\feedback --- ******************************************************** -- - -USE [master]; -GO - -ALTER DATABASE [WideWorldImportersDW] SET COMPATIBILITY_LEVEL = 140; -GO - -ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE; -GO - -USE [WideWorldImportersDW]; -GO - -DECLARE @Order TABLE - ([Order Key] BIGINT NOT NULL, - [Quantity] INT NOT NULL - ); - -INSERT @Order -SELECT [Order Key], [Quantity] -FROM [Fact].[OrderHistory] -WHERE [Quantity] > 99; - --- Look at estimated rows, speed, join algorithm -SELECT oh.[Order Key], oh.[Order Date Key], - oh.[Unit Price], o.Quantity -FROM Fact.OrderHistoryExtended AS oh -INNER JOIN @Order AS o - ON o.[Order Key] = oh.[Order Key] -WHERE oh.[Unit Price] > 0.10 -ORDER BY oh.[Unit Price] DESC; -GO - -USE [master] -GO - -ALTER DATABASE [WideWorldImportersDW] SET COMPATIBILITY_LEVEL = 150 -GO - -USE [WideWorldImportersDW] -GO - -DECLARE @Order TABLE - ([Order Key] BIGINT NOT NULL, - [Quantity] INT NOT NULL - ); - -INSERT @Order -SELECT [Order Key], [Quantity] -FROM [Fact].[OrderHistory] -WHERE [Quantity] > 99; - --- Look at estimated rows, speed, join algorithm -SELECT oh.[Order Key], oh.[Order Date Key], - oh.[Unit Price], o.Quantity -FROM Fact.OrderHistoryExtended AS oh -INNER JOIN @Order AS o - ON o.[Order Key] = oh.[Order Key] -WHERE oh.[Unit Price] > 0.10 -ORDER BY oh.[Unit Price] DESC; -GO - +-- ******************************************************** -- +-- Table variable deferred compilation + +-- See https://aka.ms/IQP for more background + +-- Demo scripts: https://aka.ms/IQPDemos + +-- This demo is on SQL Server 2019 Public Preview and works in Azure SQL DB too + +-- Email IntelligentQP@microsoft.com for questions\feedback +-- ******************************************************** -- + +USE [master]; +GO + +ALTER DATABASE [WideWorldImportersDW] SET COMPATIBILITY_LEVEL = 140; +GO + +ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE; +GO + +USE [WideWorldImportersDW]; +GO + +DECLARE @Order TABLE + ([Order Key] BIGINT NOT NULL, + [Quantity] INT NOT NULL + ); + +INSERT @Order +SELECT [Order Key], [Quantity] +FROM [Fact].[OrderHistory] +WHERE [Quantity] > 99; + +-- Look at estimated rows, speed, join algorithm +SELECT oh.[Order Key], oh.[Order Date Key], + oh.[Unit Price], o.Quantity +FROM Fact.OrderHistoryExtended AS oh +INNER JOIN @Order AS o + ON o.[Order Key] = oh.[Order Key] +WHERE oh.[Unit Price] > 0.10 +ORDER BY oh.[Unit Price] DESC; +GO + +USE [master] +GO + +ALTER DATABASE [WideWorldImportersDW] SET COMPATIBILITY_LEVEL = 150 +GO + +USE [WideWorldImportersDW] +GO + +DECLARE @Order TABLE + ([Order Key] BIGINT NOT NULL, + [Quantity] INT NOT NULL + ); + +INSERT @Order +SELECT [Order Key], [Quantity] +FROM [Fact].[OrderHistory] +WHERE [Quantity] > 99; + +-- Look at estimated rows, speed, join algorithm +SELECT oh.[Order Key], oh.[Order Date Key], + oh.[Unit Price], o.Quantity +FROM Fact.OrderHistoryExtended AS oh +INNER JOIN @Order AS o + ON o.[Order Key] = oh.[Order Key] +WHERE oh.[Unit Price] > 0.10 +ORDER BY oh.[Unit Price] DESC; +GO diff --git a/samples/manage/sql-server-extended-security-updates/readme.md b/samples/manage/sql-server-extended-security-updates/readme.md new file mode 100644 index 0000000000..e5518f9cd9 --- /dev/null +++ b/samples/manage/sql-server-extended-security-updates/readme.md @@ -0,0 +1,18 @@ +# SQL Server 2008/2008R2 Extended Security Updates +If you’re running SQL Server 2008 or 2008 R2, these versions are reaching the end of their support lifecycle on July 9, 2019. +Each version is backed by a minimum of 10 years of support (5 years for Mainstream Support and 5 years for Extended Support) including regular security updates. +End of support means the end of security updates, which can cause security and compliance issues and put applications and business at risk. +We recommend upgrading to current versions for the most advanced security, performance, and innovation. +For customers that can’t get it all upgraded by the deadline, new options help protect applications and data during the upgrade transition: +- Migrate your existing SQL Server 2008 and 2008R2 workloads as-is to Azure and receive additional 3 years of free Extended Security Updates (if and when available) +- Purchase Extended Security Updates for your servers and remain protected for up to 3 years until you are ready to upgrade to a newer SQL Server version + +## Useful links +[SQL Server 2008/2008R2 end of support page](https://aka.ms/sqleos) +[Extended Security Updates frequently asked questions](https://aka.ms/sqleosfaq) + +## How to register a single SQL Server instance to download Extended Security Updates +Coming soon... + +## How to bulk register SQL Server instances to download Extended Security Updates +Coming soon...