• In this case there is no difference between an assumption and a casual observation, nothing solid to proof anything.

    😎

    Here are two test harnesses, a) measures the difference between calculating the md5 on insert vs. calculated column, b) the difference between inserting an pre-calculated md5 vs. calculated column.

    The caveat here is that the input is limited to the maximum of 4000 wide characters, in real live situation one would expect larger inputs which means more complicated calculation of the md5, especially with the calculated column as it is limited to a scalar function because the apply operator cannot be used there. That will further add to the overhead of the calculated column method.

    Test Harness A

    USE TEEST;

    GO

    SET NOCOUNT ON;

    -- Test the difference between calculating an md5 hash on the insert and a calculated column for the md5

    IF OBJECT_ID(N'dbo.TBL_TEST_HASH_SAMPLE') IS NOT NULL DROP TABLE dbo.TBL_TEST_HASH_SAMPLE;

    CREATE TABLE dbo.TBL_TEST_HASH_SAMPLE

    (

    TH_ID INT IDENTITY(1,1) NOT NULL CONSTRAINT PK_DBO_TBL_TEST_HASH_SAMPLE_TH_ID PRIMARY KEY CLUSTERED

    ,TH_NSTR NVARCHAR(MAX) NOT NULL

    ,TH_MD5 BINARY(20) NOT NULL

    );

    IF OBJECT_ID(N'dbo.TBL_TEST_HASH') IS NOT NULL DROP TABLE dbo.TBL_TEST_HASH;

    CREATE TABLE dbo.TBL_TEST_HASH

    (

    TH_ID INT IDENTITY(1,1) NOT NULL CONSTRAINT PK_DBO_TBL_TEST_HASH_TH_ID PRIMARY KEY CLUSTERED

    ,TH_NSTR NVARCHAR(MAX) NOT NULL

    ,TH_MD5 BINARY(20) NOT NULL

    );

    IF OBJECT_ID(N'dbo.TBL_TEST_HASH_CALC_COL') IS NOT NULL DROP TABLE dbo.TBL_TEST_HASH_CALC_COL;

    CREATE TABLE dbo.TBL_TEST_HASH_CALC_COL

    (

    TH_ID INT IDENTITY(1,1) NOT NULL CONSTRAINT PK_DBO_TBL_TEST_HASH_CALC_COL_TH_ID PRIMARY KEY CLUSTERED

    ,TH_NSTR NVARCHAR(MAX) NOT NULL

    ,TH_MD5 AS (HASHBYTES('MD5',TH_NSTR)) PERSISTED

    );

    DECLARE @SAMPLE_SIZE INT = 100000;

    DECLARE @MAX_SIZE INT = 4000;

    -- APPROX 7.5m characters

    DECLARE @LONG_STR NVARCHAR(MAX) =

    (

    SELECT

    NCHAR(32) + SMSG.text

    FROM sys.messages SMSG

    WHERE SMSG.language_id IN (1031, 1033,1036,3082,1040,2068)

    FOR XML PATH('')

    );

    DECLARE @MAX_START INT = LEN(@LONG_STR) - (@MAX_SIZE + 1);

    ;WITH T(N) AS (SELECT N FROM (VALUES (0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) AS X(N))

    , NUMS(N) AS (SELECT TOP(@SAMPLE_SIZE) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS N FROM T T1,T T2,T T3,T T4,T T5,T T6,T T7,T T8,T T9)

    ,STRDATA(TEST_STR) AS

    (

    SELECT

    SUBSTRING(@LONG_STR ,(ABS(CHECKSUM(NEWID())) % @MAX_START),1 + (ABS(CHECKSUM(NEWID())) % @MAX_SIZE)) AS TEST_STR

    FROM NUMS NM

    )

    INSERT INTO dbo.TBL_TEST_HASH_SAMPLE(TH_NSTR,TH_MD5)

    SELECT

    SD.TEST_STR

    ,HASHBYTES('MD5',SD.TEST_STR)

    FROM STRDATA SD;

    DECLARE @timer TABLE (T_TXT VARCHAR(50) NOT NULL, T_TS DATETIME2(7) NOT NULL DEFAULT (SYSDATETIME()));

    DECLARE @NVARCHAR_BUCKET NVARCHAR(MAX) = N'';

    DECLARE @BINARY_BUCKET BINARY(20) = 0x00;

    -- ROUND ONE

    INSERT INTO @timer(T_TXT) VALUES ('DRY RUN');

    SELECT

    @NVARCHAR_BUCKET = TS.TH_NSTR

    ,@BINARY_BUCKET = TS.TH_MD5

    FROM dbo.TBL_TEST_HASH_SAMPLE TS

    INSERT INTO @timer(T_TXT) VALUES ('DRY RUN');

    INSERT INTO @timer(T_TXT) VALUES ('CALC COL');

    INSERT INTO dbo.TBL_TEST_HASH_CALC_COL(TH_NSTR)

    SELECT

    TS.TH_NSTR

    FROM dbo.TBL_TEST_HASH_SAMPLE TS;

    INSERT INTO @timer(T_TXT) VALUES ('CALC COL');

    INSERT INTO @timer(T_TXT) VALUES ('INSERT');

    INSERT INTO dbo.TBL_TEST_HASH(TH_NSTR,TH_MD5)

    SELECT

    TS.TH_NSTR

    ,HASHBYTES('MD5',TS.TH_NSTR)

    FROM dbo.TBL_TEST_HASH_SAMPLE TS;

    INSERT INTO @timer(T_TXT) VALUES ('INSERT');

    -- ROUND TWO

    INSERT INTO @timer(T_TXT) VALUES ('DRY RUN');

    SELECT

    @NVARCHAR_BUCKET = TS.TH_NSTR

    ,@BINARY_BUCKET = TS.TH_MD5

    FROM dbo.TBL_TEST_HASH_SAMPLE TS

    INSERT INTO @timer(T_TXT) VALUES ('DRY RUN');

    INSERT INTO @timer(T_TXT) VALUES ('CALC COL');

    INSERT INTO dbo.TBL_TEST_HASH_CALC_COL(TH_NSTR)

    SELECT

    TS.TH_NSTR

    FROM dbo.TBL_TEST_HASH_SAMPLE TS;

    INSERT INTO @timer(T_TXT) VALUES ('CALC COL');

    INSERT INTO @timer(T_TXT) VALUES ('INSERT');

    INSERT INTO dbo.TBL_TEST_HASH(TH_NSTR,TH_MD5)

    SELECT

    TS.TH_NSTR

    ,HASHBYTES('MD5',TS.TH_NSTR)

    FROM dbo.TBL_TEST_HASH_SAMPLE TS;

    INSERT INTO @timer(T_TXT) VALUES ('INSERT');

    -- ROUND THREE

    TRUNCATE TABLE dbo.TBL_TEST_HASH_CALC_COL;

    TRUNCATE TABLE dbo.TBL_TEST_HASH;

    INSERT INTO @timer(T_TXT) VALUES ('DRY RUN');

    SELECT

    @NVARCHAR_BUCKET = TS.TH_NSTR

    ,@BINARY_BUCKET = TS.TH_MD5

    FROM dbo.TBL_TEST_HASH_SAMPLE TS

    INSERT INTO @timer(T_TXT) VALUES ('DRY RUN');

    INSERT INTO @timer(T_TXT) VALUES ('INSERT');

    INSERT INTO dbo.TBL_TEST_HASH(TH_NSTR,TH_MD5)

    SELECT

    TS.TH_NSTR

    ,HASHBYTES('MD5',TS.TH_NSTR)

    FROM dbo.TBL_TEST_HASH_SAMPLE TS;

    INSERT INTO @timer(T_TXT) VALUES ('INSERT');

    INSERT INTO @timer(T_TXT) VALUES ('CALC COL');

    INSERT INTO dbo.TBL_TEST_HASH_CALC_COL(TH_NSTR)

    SELECT

    TS.TH_NSTR

    FROM dbo.TBL_TEST_HASH_SAMPLE TS;

    INSERT INTO @timer(T_TXT) VALUES ('CALC COL');

    -- ROUND FOUR

    INSERT INTO @timer(T_TXT) VALUES ('DRY RUN');

    SELECT

    @NVARCHAR_BUCKET = TS.TH_NSTR

    ,@BINARY_BUCKET = TS.TH_MD5

    FROM dbo.TBL_TEST_HASH_SAMPLE TS

    INSERT INTO @timer(T_TXT) VALUES ('DRY RUN');

    INSERT INTO @timer(T_TXT) VALUES ('INSERT');

    INSERT INTO dbo.TBL_TEST_HASH(TH_NSTR,TH_MD5)

    SELECT

    TS.TH_NSTR

    ,HASHBYTES('MD5',TS.TH_NSTR)

    FROM dbo.TBL_TEST_HASH_SAMPLE TS;

    INSERT INTO @timer(T_TXT) VALUES ('INSERT');

    INSERT INTO @timer(T_TXT) VALUES ('CALC COL');

    INSERT INTO dbo.TBL_TEST_HASH_CALC_COL(TH_NSTR)

    SELECT

    TS.TH_NSTR

    FROM dbo.TBL_TEST_HASH_SAMPLE TS;

    INSERT INTO @timer(T_TXT) VALUES ('CALC COL');

    -- ROUND FIVE

    INSERT INTO @timer(T_TXT) VALUES ('DRY RUN');

    SELECT

    @NVARCHAR_BUCKET = TS.TH_NSTR

    ,@BINARY_BUCKET = TS.TH_MD5

    FROM dbo.TBL_TEST_HASH_SAMPLE TS

    INSERT INTO @timer(T_TXT) VALUES ('DRY RUN');

    INSERT INTO @timer(T_TXT) VALUES ('CALC COL');

    INSERT INTO dbo.TBL_TEST_HASH_CALC_COL(TH_NSTR)

    SELECT

    TS.TH_NSTR

    FROM dbo.TBL_TEST_HASH_SAMPLE TS;

    INSERT INTO @timer(T_TXT) VALUES ('CALC COL');

    INSERT INTO @timer(T_TXT) VALUES ('INSERT');

    INSERT INTO dbo.TBL_TEST_HASH(TH_NSTR,TH_MD5)

    SELECT

    TS.TH_NSTR

    ,HASHBYTES('MD5',TS.TH_NSTR)

    FROM dbo.TBL_TEST_HASH_SAMPLE TS;

    INSERT INTO @timer(T_TXT) VALUES ('INSERT');

    -- ROUND SIX

    INSERT INTO @timer(T_TXT) VALUES ('DRY RUN');

    SELECT

    @NVARCHAR_BUCKET = TS.TH_NSTR

    ,@BINARY_BUCKET = TS.TH_MD5

    FROM dbo.TBL_TEST_HASH_SAMPLE TS

    INSERT INTO @timer(T_TXT) VALUES ('DRY RUN');

    INSERT INTO @timer(T_TXT) VALUES ('CALC COL');

    INSERT INTO dbo.TBL_TEST_HASH_CALC_COL(TH_NSTR)

    SELECT

    TS.TH_NSTR

    FROM dbo.TBL_TEST_HASH_SAMPLE TS;

    INSERT INTO @timer(T_TXT) VALUES ('CALC COL');

    INSERT INTO @timer(T_TXT) VALUES ('INSERT');

    INSERT INTO dbo.TBL_TEST_HASH(TH_NSTR,TH_MD5)

    SELECT

    TS.TH_NSTR

    ,HASHBYTES('MD5',TS.TH_NSTR)

    FROM dbo.TBL_TEST_HASH_SAMPLE TS;

    INSERT INTO @timer(T_TXT) VALUES ('INSERT');

    -- ROUND SEVEN

    TRUNCATE TABLE dbo.TBL_TEST_HASH_CALC_COL;

    TRUNCATE TABLE dbo.TBL_TEST_HASH;

    INSERT INTO @timer(T_TXT) VALUES ('DRY RUN');

    SELECT

    @NVARCHAR_BUCKET = TS.TH_NSTR

    ,@BINARY_BUCKET = TS.TH_MD5

    FROM dbo.TBL_TEST_HASH_SAMPLE TS

    INSERT INTO @timer(T_TXT) VALUES ('DRY RUN');

    INSERT INTO @timer(T_TXT) VALUES ('INSERT');

    INSERT INTO dbo.TBL_TEST_HASH(TH_NSTR,TH_MD5)

    SELECT

    TS.TH_NSTR

    ,HASHBYTES('MD5',TS.TH_NSTR)

    FROM dbo.TBL_TEST_HASH_SAMPLE TS;

    INSERT INTO @timer(T_TXT) VALUES ('INSERT');

    INSERT INTO @timer(T_TXT) VALUES ('CALC COL');

    INSERT INTO dbo.TBL_TEST_HASH_CALC_COL(TH_NSTR)

    SELECT

    TS.TH_NSTR

    FROM dbo.TBL_TEST_HASH_SAMPLE TS;

    INSERT INTO @timer(T_TXT) VALUES ('CALC COL');

    -- ROUND EIGHT

    INSERT INTO @timer(T_TXT) VALUES ('DRY RUN');

    SELECT

    @NVARCHAR_BUCKET = TS.TH_NSTR

    ,@BINARY_BUCKET = TS.TH_MD5

    FROM dbo.TBL_TEST_HASH_SAMPLE TS

    INSERT INTO @timer(T_TXT) VALUES ('DRY RUN');

    INSERT INTO @timer(T_TXT) VALUES ('INSERT');

    INSERT INTO dbo.TBL_TEST_HASH(TH_NSTR,TH_MD5)

    SELECT

    TS.TH_NSTR

    ,HASHBYTES('MD5',TS.TH_NSTR)

    FROM dbo.TBL_TEST_HASH_SAMPLE TS;

    INSERT INTO @timer(T_TXT) VALUES ('INSERT');

    INSERT INTO @timer(T_TXT) VALUES ('CALC COL');

    INSERT INTO dbo.TBL_TEST_HASH_CALC_COL(TH_NSTR)

    SELECT

    TS.TH_NSTR

    FROM dbo.TBL_TEST_HASH_SAMPLE TS;

    INSERT INTO @timer(T_TXT) VALUES ('CALC COL');

    SELECT

    T.T_TXT

    ,DATEDIFF(MICROSECOND,MIN(T.T_TS),MAX(T.T_TS)) AS DURATION

    FROM @timer T

    GROUP BY T.T_TXT

    ORDER BY DURATION;

    Results from A on 2nd Gen i5, 8Gb ram, 3rd Gen SSD, SQL Server 2016 Dev Ed.

    T_TXT DURATION

    ----------- -----------

    INSERT 59156070

    DRY RUN 59394936

    CALC COL 67620986

    Test Harness B

    USE TEEST;

    GO

    SET NOCOUNT ON;

    -- Test the difference between inserting an md5 hash and a calculated column for the md5

    IF OBJECT_ID(N'dbo.TBL_TEST_HASH_SAMPLE') IS NOT NULL DROP TABLE dbo.TBL_TEST_HASH_SAMPLE;

    CREATE TABLE dbo.TBL_TEST_HASH_SAMPLE

    (

    TH_ID INT IDENTITY(1,1) NOT NULL CONSTRAINT PK_DBO_TBL_TEST_HASH_SAMPLE_TH_ID PRIMARY KEY CLUSTERED

    ,TH_NSTR NVARCHAR(MAX) NOT NULL

    ,TH_MD5 BINARY(20) NOT NULL

    );

    IF OBJECT_ID(N'dbo.TBL_TEST_HASH') IS NOT NULL DROP TABLE dbo.TBL_TEST_HASH;

    CREATE TABLE dbo.TBL_TEST_HASH

    (

    TH_ID INT IDENTITY(1,1) NOT NULL CONSTRAINT PK_DBO_TBL_TEST_HASH_TH_ID PRIMARY KEY CLUSTERED

    ,TH_NSTR NVARCHAR(MAX) NOT NULL

    ,TH_MD5 BINARY(20) NOT NULL

    );

    IF OBJECT_ID(N'dbo.TBL_TEST_HASH_CALC_COL') IS NOT NULL DROP TABLE dbo.TBL_TEST_HASH_CALC_COL;

    CREATE TABLE dbo.TBL_TEST_HASH_CALC_COL

    (

    TH_ID INT IDENTITY(1,1) NOT NULL CONSTRAINT PK_DBO_TBL_TEST_HASH_CALC_COL_TH_ID PRIMARY KEY CLUSTERED

    ,TH_NSTR NVARCHAR(MAX) NOT NULL

    ,TH_MD5 AS (HASHBYTES('MD5',TH_NSTR)) PERSISTED

    );

    DECLARE @SAMPLE_SIZE INT = 100000;

    DECLARE @MAX_SIZE INT = 4000;

    -- APPROX 7.5m characters

    DECLARE @LONG_STR NVARCHAR(MAX) =

    (

    SELECT

    NCHAR(32) + SMSG.text

    FROM sys.messages SMSG

    WHERE SMSG.language_id IN (1031, 1033,1036,3082,1040,2068)

    FOR XML PATH('')

    );

    DECLARE @MAX_START INT = LEN(@LONG_STR) - (@MAX_SIZE + 1);

    ;WITH T(N) AS (SELECT N FROM (VALUES (0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) AS X(N))

    , NUMS(N) AS (SELECT TOP(@SAMPLE_SIZE) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS N FROM T T1,T T2,T T3,T T4,T T5,T T6,T T7,T T8,T T9)

    ,STRDATA(TEST_STR) AS

    (

    SELECT

    SUBSTRING(@LONG_STR ,(ABS(CHECKSUM(NEWID())) % @MAX_START),1 + (ABS(CHECKSUM(NEWID())) % @MAX_SIZE)) AS TEST_STR

    FROM NUMS NM

    )

    INSERT INTO dbo.TBL_TEST_HASH_SAMPLE(TH_NSTR,TH_MD5)

    SELECT

    SD.TEST_STR

    ,HASHBYTES('MD5',SD.TEST_STR)

    FROM STRDATA SD;

    DECLARE @timer TABLE (T_TXT VARCHAR(50) NOT NULL, T_TS DATETIME2(7) NOT NULL DEFAULT (SYSDATETIME()));

    DECLARE @NVARCHAR_BUCKET NVARCHAR(MAX) = N'';

    DECLARE @BINARY_BUCKET BINARY(20) = 0x00;

    -- ROUND ONE

    INSERT INTO @timer(T_TXT) VALUES ('DRY RUN');

    SELECT

    @NVARCHAR_BUCKET = TS.TH_NSTR

    ,@BINARY_BUCKET = TS.TH_MD5

    FROM dbo.TBL_TEST_HASH_SAMPLE TS

    INSERT INTO @timer(T_TXT) VALUES ('DRY RUN');

    INSERT INTO @timer(T_TXT) VALUES ('CALC COL');

    INSERT INTO dbo.TBL_TEST_HASH_CALC_COL(TH_NSTR)

    SELECT

    TS.TH_NSTR

    FROM dbo.TBL_TEST_HASH_SAMPLE TS;

    INSERT INTO @timer(T_TXT) VALUES ('CALC COL');

    INSERT INTO @timer(T_TXT) VALUES ('INSERT');

    INSERT INTO dbo.TBL_TEST_HASH(TH_NSTR,TH_MD5)

    SELECT

    TS.TH_NSTR

    ,TS.TH_MD5

    FROM dbo.TBL_TEST_HASH_SAMPLE TS;

    INSERT INTO @timer(T_TXT) VALUES ('INSERT');

    -- ROUND TWO

    INSERT INTO @timer(T_TXT) VALUES ('DRY RUN');

    SELECT

    @NVARCHAR_BUCKET = TS.TH_NSTR

    ,@BINARY_BUCKET = TS.TH_MD5

    FROM dbo.TBL_TEST_HASH_SAMPLE TS

    INSERT INTO @timer(T_TXT) VALUES ('DRY RUN');

    INSERT INTO @timer(T_TXT) VALUES ('CALC COL');

    INSERT INTO dbo.TBL_TEST_HASH_CALC_COL(TH_NSTR)

    SELECT

    TS.TH_NSTR

    FROM dbo.TBL_TEST_HASH_SAMPLE TS;

    INSERT INTO @timer(T_TXT) VALUES ('CALC COL');

    INSERT INTO @timer(T_TXT) VALUES ('INSERT');

    INSERT INTO dbo.TBL_TEST_HASH(TH_NSTR,TH_MD5)

    SELECT

    TS.TH_NSTR

    ,TS.TH_MD5

    FROM dbo.TBL_TEST_HASH_SAMPLE TS;

    INSERT INTO @timer(T_TXT) VALUES ('INSERT');

    -- ROUND THREE

    TRUNCATE TABLE dbo.TBL_TEST_HASH_CALC_COL;

    TRUNCATE TABLE dbo.TBL_TEST_HASH;

    INSERT INTO @timer(T_TXT) VALUES ('DRY RUN');

    SELECT

    @NVARCHAR_BUCKET = TS.TH_NSTR

    ,@BINARY_BUCKET = TS.TH_MD5

    FROM dbo.TBL_TEST_HASH_SAMPLE TS

    INSERT INTO @timer(T_TXT) VALUES ('DRY RUN');

    INSERT INTO @timer(T_TXT) VALUES ('INSERT');

    INSERT INTO dbo.TBL_TEST_HASH(TH_NSTR,TH_MD5)

    SELECT

    TS.TH_NSTR

    ,TS.TH_MD5

    FROM dbo.TBL_TEST_HASH_SAMPLE TS;

    INSERT INTO @timer(T_TXT) VALUES ('INSERT');

    INSERT INTO @timer(T_TXT) VALUES ('CALC COL');

    INSERT INTO dbo.TBL_TEST_HASH_CALC_COL(TH_NSTR)

    SELECT

    TS.TH_NSTR

    FROM dbo.TBL_TEST_HASH_SAMPLE TS;

    INSERT INTO @timer(T_TXT) VALUES ('CALC COL');

    -- ROUND FOUR

    INSERT INTO @timer(T_TXT) VALUES ('DRY RUN');

    SELECT

    @NVARCHAR_BUCKET = TS.TH_NSTR

    ,@BINARY_BUCKET = TS.TH_MD5

    FROM dbo.TBL_TEST_HASH_SAMPLE TS

    INSERT INTO @timer(T_TXT) VALUES ('DRY RUN');

    INSERT INTO @timer(T_TXT) VALUES ('INSERT');

    INSERT INTO dbo.TBL_TEST_HASH(TH_NSTR,TH_MD5)

    SELECT

    TS.TH_NSTR

    ,TS.TH_MD5

    FROM dbo.TBL_TEST_HASH_SAMPLE TS;

    INSERT INTO @timer(T_TXT) VALUES ('INSERT');

    INSERT INTO @timer(T_TXT) VALUES ('CALC COL');

    INSERT INTO dbo.TBL_TEST_HASH_CALC_COL(TH_NSTR)

    SELECT

    TS.TH_NSTR

    FROM dbo.TBL_TEST_HASH_SAMPLE TS;

    INSERT INTO @timer(T_TXT) VALUES ('CALC COL');

    -- ROUND FIVE

    INSERT INTO @timer(T_TXT) VALUES ('DRY RUN');

    SELECT

    @NVARCHAR_BUCKET = TS.TH_NSTR

    ,@BINARY_BUCKET = TS.TH_MD5

    FROM dbo.TBL_TEST_HASH_SAMPLE TS

    INSERT INTO @timer(T_TXT) VALUES ('DRY RUN');

    INSERT INTO @timer(T_TXT) VALUES ('CALC COL');

    INSERT INTO dbo.TBL_TEST_HASH_CALC_COL(TH_NSTR)

    SELECT

    TS.TH_NSTR

    FROM dbo.TBL_TEST_HASH_SAMPLE TS;

    INSERT INTO @timer(T_TXT) VALUES ('CALC COL');

    INSERT INTO @timer(T_TXT) VALUES ('INSERT');

    INSERT INTO dbo.TBL_TEST_HASH(TH_NSTR,TH_MD5)

    SELECT

    TS.TH_NSTR

    ,TS.TH_MD5

    FROM dbo.TBL_TEST_HASH_SAMPLE TS;

    INSERT INTO @timer(T_TXT) VALUES ('INSERT');

    -- ROUND SIX

    INSERT INTO @timer(T_TXT) VALUES ('DRY RUN');

    SELECT

    @NVARCHAR_BUCKET = TS.TH_NSTR

    ,@BINARY_BUCKET = TS.TH_MD5

    FROM dbo.TBL_TEST_HASH_SAMPLE TS

    INSERT INTO @timer(T_TXT) VALUES ('DRY RUN');

    INSERT INTO @timer(T_TXT) VALUES ('CALC COL');

    INSERT INTO dbo.TBL_TEST_HASH_CALC_COL(TH_NSTR)

    SELECT

    TS.TH_NSTR

    FROM dbo.TBL_TEST_HASH_SAMPLE TS;

    INSERT INTO @timer(T_TXT) VALUES ('CALC COL');

    INSERT INTO @timer(T_TXT) VALUES ('INSERT');

    INSERT INTO dbo.TBL_TEST_HASH(TH_NSTR,TH_MD5)

    SELECT

    TS.TH_NSTR

    ,TS.TH_MD5

    FROM dbo.TBL_TEST_HASH_SAMPLE TS;

    INSERT INTO @timer(T_TXT) VALUES ('INSERT');

    -- ROUND SEVEN

    TRUNCATE TABLE dbo.TBL_TEST_HASH_CALC_COL;

    TRUNCATE TABLE dbo.TBL_TEST_HASH;

    INSERT INTO @timer(T_TXT) VALUES ('DRY RUN');

    SELECT

    @NVARCHAR_BUCKET = TS.TH_NSTR

    ,@BINARY_BUCKET = TS.TH_MD5

    FROM dbo.TBL_TEST_HASH_SAMPLE TS

    INSERT INTO @timer(T_TXT) VALUES ('DRY RUN');

    INSERT INTO @timer(T_TXT) VALUES ('INSERT');

    INSERT INTO dbo.TBL_TEST_HASH(TH_NSTR,TH_MD5)

    SELECT

    TS.TH_NSTR

    ,TS.TH_MD5

    FROM dbo.TBL_TEST_HASH_SAMPLE TS;

    INSERT INTO @timer(T_TXT) VALUES ('INSERT');

    INSERT INTO @timer(T_TXT) VALUES ('CALC COL');

    INSERT INTO dbo.TBL_TEST_HASH_CALC_COL(TH_NSTR)

    SELECT

    TS.TH_NSTR

    FROM dbo.TBL_TEST_HASH_SAMPLE TS;

    INSERT INTO @timer(T_TXT) VALUES ('CALC COL');

    -- ROUND EIGHT

    INSERT INTO @timer(T_TXT) VALUES ('DRY RUN');

    SELECT

    @NVARCHAR_BUCKET = TS.TH_NSTR

    ,@BINARY_BUCKET = TS.TH_MD5

    FROM dbo.TBL_TEST_HASH_SAMPLE TS

    INSERT INTO @timer(T_TXT) VALUES ('DRY RUN');

    INSERT INTO @timer(T_TXT) VALUES ('INSERT');

    INSERT INTO dbo.TBL_TEST_HASH(TH_NSTR,TH_MD5)

    SELECT

    TS.TH_NSTR

    ,TS.TH_MD5

    FROM dbo.TBL_TEST_HASH_SAMPLE TS;

    INSERT INTO @timer(T_TXT) VALUES ('INSERT');

    INSERT INTO @timer(T_TXT) VALUES ('CALC COL');

    INSERT INTO dbo.TBL_TEST_HASH_CALC_COL(TH_NSTR)

    SELECT

    TS.TH_NSTR

    FROM dbo.TBL_TEST_HASH_SAMPLE TS;

    INSERT INTO @timer(T_TXT) VALUES ('CALC COL');

    SELECT

    T.T_TXT

    ,DATEDIFF(MICROSECOND,MIN(T.T_TS),MAX(T.T_TS)) AS DURATION

    FROM @timer T

    GROUP BY T.T_TXT

    ORDER BY DURATION;

    Results from B on 2nd Gen i5, 8Gb ram, 3rd Gen SSD, SQL Server 2016 Dev Ed.

    T_TXT DURATION

    ---------- -----------

    INSERT 41015984

    DRY RUN 43208396

    CALC COL 49214666