The complete folder structure has been changed or updated
This commit is contained in:
@@ -0,0 +1,207 @@
|
||||
SET ANSI_NULLS ON
|
||||
GO
|
||||
SET QUOTED_IDENTIFIER ON
|
||||
GO
|
||||
|
||||
-- [PRDD_ENABLE_MEMORY_OPTIMIZED_SUPPORT]
|
||||
-- =================================================================
|
||||
-- Enable memory optimization to a specific database
|
||||
-- Minimum requirement: MS SQL Server 2014
|
||||
--
|
||||
-- Returns: INT Value - 0 = Everything worked well
|
||||
-- =================================================================
|
||||
-- Copyright (c) 2025 by Digital Data GmbH
|
||||
--
|
||||
-- Digital Data GmbH • Ludwig-Rinn-Strasse 16 • D-35452 Heuchelheim
|
||||
-- Tel.: 0641/202360 • E-Mail: info-flow@digitaldata.works
|
||||
-- =================================================================
|
||||
-- Creation Date / Author: 05.03.2025 / MK
|
||||
-- Version Date / Editor: 05.03.2025 / MK
|
||||
-- Version Number: 1.0.0.0
|
||||
-- =================================================================
|
||||
-- History:
|
||||
-- 05.03.2025 / MK - First Version
|
||||
|
||||
CREATE OR ALTER PROCEDURE [dbo].[PRDD_ENABLE_MEMORY_OPTIMIZED_SUPPORT] (
|
||||
@pDATABASE_NAME SYSNAME = 'DD_ECM', -- Give the db name on which the memory optimized feature should be enabled. Default and Failsafe is "DD_ECM".
|
||||
@pELEVATE_TO_SNAPSHOT NVARCHAR(3) = 'ON' -- Set 'ON' or 'OFF'. See help text at the end of the file. Default is 'ON', Failsafe is 'unset'.
|
||||
)
|
||||
AS
|
||||
BEGIN TRY
|
||||
|
||||
SET NOCOUNT ON;
|
||||
|
||||
-- declare new vars because of parameter sniffing
|
||||
DECLARE @DATABASE_NAME SYSNAME = ISNULL(@pDATABASE_NAME,'DD_ECM'),
|
||||
@ELEVATE_TO_SNAPSHOT NVARCHAR(3) = ISNULL(@pELEVATE_TO_SNAPSHOT,'unset');
|
||||
|
||||
-- declare runtime vars
|
||||
DECLARE @MyProcedureName NVARCHAR(128) = OBJECT_NAME(@@PROCID);
|
||||
DECLARE @IsSysAdmin TINYINT = 0,
|
||||
@CompatibilityLevel SMALLINT = 0,
|
||||
@Counter TINYINT = 0,
|
||||
@MemoryOptimizedFileGroupName SYSNAME = CONCAT(@DATABASE_NAME,'_MOFG'),
|
||||
@MemoryOptimizedFileName SYSNAME = CONCAT(@DATABASE_NAME,'_MOF'),
|
||||
@MemoryOptimizedFilePath NVARCHAR(255) = NULL,
|
||||
@SQLCommand NVARCHAR(500) = NULL,
|
||||
@return_status NVARCHAR(50) = 0,
|
||||
@return_status_text NVARCHAR(MAX) = 'START ' + @MyProcedureName + ' @ ' + CONVERT(varchar(50),GETDATE(),120),
|
||||
@return_error_text NVARCHAR(MAX) = NULL;
|
||||
|
||||
PRINT '==============================='
|
||||
PRINT 'PROCEDURE - ' + @return_status_text;
|
||||
PRINT 'PARAMETER01 - @DATABASE_NAME: ' + CONVERT(NVARCHAR(200),@DATABASE_NAME);
|
||||
PRINT 'PARAMETER02 - @ELEVATE_TO_SNAPSHOT: ' + CONVERT(NVARCHAR(200),@ELEVATE_TO_SNAPSHOT);
|
||||
|
||||
-- Check if the current user is a sysadmin
|
||||
SET @IsSysAdmin = IS_SRVROLEMEMBER('sysadmin');
|
||||
|
||||
IF (@IsSysAdmin = 1) BEGIN
|
||||
|
||||
--===================================================-- Check requirements --====================================================--
|
||||
|
||||
-- Check the database compatibility level
|
||||
SET @CompatibilityLevel = (SELECT [compatibility_level] FROM [sys].[databases] WHERE [name] = @DATABASE_NAME);
|
||||
|
||||
PRINT char(10) + 'The database compatibility level must be 120 (SQL Server 2014) or higher to use MEMORY_OPTIMIZED_DATA filegroup.';
|
||||
PRINT 'The current level of the [' + @DATABASE_NAME + '] database is: ' + convert(varchar,@CompatibilityLevel);
|
||||
-----------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
-- Verify if compatibility level is 120 (SQL Server 2014) or higher
|
||||
IF (@CompatibilityLevel >= 120) BEGIN
|
||||
|
||||
--======================================================-- Add filegroup --======================================================--
|
||||
-- Check if MEMORY_OPTIMIZED_DATA filegroup already exists
|
||||
SET @Counter = (SELECT COUNT(*)
|
||||
FROM [sys].[filegroups]
|
||||
WHERE [name] = @MemoryOptimizedFileGroupName);
|
||||
|
||||
IF (@Counter = 0) BEGIN
|
||||
|
||||
-- Add MEMORY_OPTIMIZED_DATA filegroup to the database
|
||||
SET @SQLCommand = 'ALTER DATABASE [' + @DATABASE_NAME + '] ADD FILEGROUP [' + @MemoryOptimizedFileGroupName + '] CONTAINS MEMORY_OPTIMIZED_DATA;';
|
||||
PRINT char(10) + 'Executing @SQLCommand for filegroup creation: ' + char(13) + @SQLCommand;
|
||||
|
||||
BEGIN TRY
|
||||
EXEC(@SQLCommand);
|
||||
PRINT 'Filegroup ' + @MemoryOptimizedFileGroupName + ' created successfully!';
|
||||
END TRY
|
||||
BEGIN CATCH
|
||||
PRINT 'Filegroup cannot be created!';
|
||||
RETURN;
|
||||
END CATCH
|
||||
|
||||
END; ELSE BEGIN
|
||||
PRINT char(10) + 'Filegroup ' + @MemoryOptimizedFileGroupName + ' already exists!';
|
||||
END;
|
||||
-----------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
-- Determ current storage path of the mdf file, and use this path as default location for the memory optimized file
|
||||
SET @MemoryOptimizedFilePath = (SELECT DISTINCT concat(LEFT(physical_name, LEN(physical_name) - CHARINDEX('\', REVERSE(physical_name)) + 1),@MemoryOptimizedFileName) AS 'File Location'
|
||||
FROM [sys].[master_files]
|
||||
WHERE [database_id] = DB_ID(@DATABASE_NAME) and [type_desc] = 'ROWS');
|
||||
|
||||
--==================================================-- Add file to filegroup --==================================================--
|
||||
-- Check if the file already exists
|
||||
SET @Counter = (SELECT COUNT(*)
|
||||
FROM [sys].[master_files]
|
||||
WHERE [name] = @MemoryOptimizedFileName
|
||||
AND [physical_name] = @MemoryOptimizedFilePath);
|
||||
|
||||
IF (@Counter = 0) BEGIN
|
||||
|
||||
-- Add file to the MEMORY_OPTIMIZED_DATA filegroup
|
||||
SET @SQLCommand = 'ALTER DATABASE [' + @DATABASE_NAME + '] ADD FILE ( NAME = [' + @MemoryOptimizedFileName + '],
|
||||
FILENAME = N''' + @MemoryOptimizedFilePath + ''')
|
||||
TO FILEGROUP [' + @MemoryOptimizedFileGroupName + '] ';
|
||||
PRINT char(10) + 'Executing @SQLCommand for file creation: ' + char(13) + @SQLCommand;
|
||||
|
||||
BEGIN TRY
|
||||
EXEC(@SQLCommand);
|
||||
PRINT 'File ' + @MemoryOptimizedFileName + ' created successfully!';
|
||||
END TRY
|
||||
BEGIN CATCH
|
||||
PRINT 'File cannot be created!';
|
||||
RETURN;
|
||||
END CATCH
|
||||
|
||||
END; ELSE BEGIN
|
||||
PRINT char(10) + 'File ' + @MemoryOptimizedFileName + ' already exists!';
|
||||
END;
|
||||
-----------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
--===================================================-- Change working mode --===================================================--
|
||||
IF (@ELEVATE_TO_SNAPSHOT in ('ON','OFF')) BEGIN
|
||||
SET @SQLCommand = 'ALTER DATABASE [' + @DATABASE_NAME + '] SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT ' + @ELEVATE_TO_SNAPSHOT + ';';
|
||||
PRINT char(10) + 'Executing @SQLCommand to change working mode: ' + char(13) + @SQLCommand;
|
||||
|
||||
BEGIN TRY
|
||||
EXEC(@SQLCommand);
|
||||
PRINT 'Working mode "MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT" has been set to ' + @ELEVATE_TO_SNAPSHOT + '!';
|
||||
END TRY
|
||||
BEGIN CATCH
|
||||
PRINT 'Working mode "MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT" cannot be set to ' + @ELEVATE_TO_SNAPSHOT + '!';
|
||||
RETURN;
|
||||
END CATCH
|
||||
|
||||
END; ELSE BEGIN
|
||||
PRINT char(10) + 'Working mode "MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT" keeps untouched!';
|
||||
END;
|
||||
-----------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
END; ELSE BEGIN
|
||||
PRINT 'Cannot proceed!' + char(10) + 'Compatibility level does not fit!';
|
||||
END;
|
||||
|
||||
END; ELSE BEGIN
|
||||
PRINT 'Cannot proceed!' + char(10) + 'The current user must be a member of the sysadmin fixed server role to execute this script!';
|
||||
END;
|
||||
-----------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
SET @return_status = 0;
|
||||
SET @return_status_text = 'END ' + @MyProcedureName + ' @ ' + CONVERT(varchar(50),GETDATE(),120);
|
||||
|
||||
PRINT '';
|
||||
PRINT 'PROCEDURE - ' + @return_status_text;
|
||||
PRINT '===============================';
|
||||
|
||||
END TRY
|
||||
|
||||
BEGIN CATCH
|
||||
|
||||
--======================================================-- Output result --======================================================--
|
||||
SET @return_status = 1;
|
||||
SET @return_status_text = 'END ' + @MyProcedureName + ' @ ' + CONVERT(varchar(50),GETDATE(),120);
|
||||
SET @return_error_text = 'ERROR MESSAGE: ' + CONVERT(VARCHAR(500),ERROR_MESSAGE());
|
||||
|
||||
PRINT '';
|
||||
PRINT 'ERROR IN PROCEDURE: ' + @MyProcedureName;
|
||||
PRINT @return_error_text;
|
||||
|
||||
PRINT '';
|
||||
PRINT 'PROCEDURE - ' + @return_status_text;
|
||||
PRINT '===============================';
|
||||
-----------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
RETURN @return_status;
|
||||
|
||||
END CATCH
|
||||
GO
|
||||
|
||||
-- German help text for "@pELEVATE_TO_SNAPSHOT":
|
||||
-- Der Befehl ALTER DATABASE SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT ON wird in SQL Server verwendet, um die Funktion Memory-Optimized Elevate to Snapshot Isolation zu aktivieren. Dies bedeutet, dass Transaktionen, die speicheroptimierte Tabellen verwenden, standardmäßig das Snapshot-Isolationslevel nutzen, selbst wenn sie ohne explizite Angabe eines Isolationslevels gestartet werden.
|
||||
-- Das Isolationslevel "Snapshot" ermöglicht es, Daten zu lesen, ohne dabei Schreibvorgänge von anderen Transaktionen zu blockieren, und es sorgt dafür, dass jede Transaktion eine konsistente Ansicht der Daten zum Zeitpunkt ihres Beginns erhält.
|
||||
|
||||
-- Vorteile:
|
||||
-- Automatische Snapshot-Isolation: Transaktionen, die speicheroptimierte Tabellen verwenden, profitieren direkt von der Snapshot-Isolation, ohne dass dies explizit festgelegt werden muss. Das kann Fehler vermeiden und den Entwicklungsprozess vereinfachen.
|
||||
-- Konsistente Datenansicht: Die Snapshot-Isolation ermöglicht es, Daten zu lesen, ohne andere Schreibvorgänge zu blockieren. Das verbessert die Parallelität und reduziert Deadlocks.
|
||||
-- Geeignet für leselastige Anwendungen: Anwendungen, die viele Lesevorgänge durchführen und keine strengen Anforderungen an die Konsistenz von Schreibvorgängen stellen, können hiervon profitieren.
|
||||
|
||||
-- Nachteile:
|
||||
-- Speicherverbrauch: Da die Snapshot-Isolation auf Versionierung basiert, kann es zu einem höheren Speicherverbrauch kommen, vor allem bei vielen parallelen Transaktionen oder großen Datenmengen.
|
||||
-- Komplexität bei Schreiblasten: Bei stark schreibintensiven Anwendungen kann die Snapshot-Isolation möglicherweise zu Konflikten führen, da Änderungen zu einem Konfliktfehler führen, wenn zwei Transaktionen denselben Datensatz gleichzeitig ändern.
|
||||
-- Eventuelle Performanceeinbußen: In bestimmten Szenarien könnten zusätzliche Abfragen zur Versionierung die Performance leicht beeinträchtigen.
|
||||
|
||||
-- Empfehlung:
|
||||
-- Für leselastige, speicheroptimierte Anwendungen kann dies eine gute Option sein.
|
||||
-- Wenn deine Anwendung stark schreibintensiv ist oder spezifische Isolationseinstellungen erfordert, solltest du die Auswirkungen dieser Einstellung genauer testen.
|
||||
Reference in New Issue
Block a user