এটি কোনও traditionalতিহ্যবাহী উত্তর নয়, তবে আমি ভেবেছিলাম এখন পর্যন্ত উল্লিখিত কয়েকটি কৌশলগুলির মাপদণ্ড পোস্ট করা সহায়ক হবে। আমি এসকিউএল সার্ভার 2017 সিইউ 9 সহ একটি 96 টি মূল সার্ভারে পরীক্ষা করছি।
কিছু স্কেলিবিলিটি সমস্যা কিছু বিশ্বব্যাপী রাষ্ট্রের সাথে লড়াইয়ের সময়গত থ্রেডগুলির কারণে ঘটে। উদাহরণস্বরূপ, ক্লাসিক পিএফএস পৃষ্ঠা যুক্তি বিবেচনা করুন। এটি ঘটতে পারে যদি অনেক কর্মী থ্রেডের মেমরিতে একই পৃষ্ঠাটি পরিবর্তন করতে হয়। কোডটি আরও কার্যকর হওয়ার সাথে সাথে এটি দ্রুত ল্যাচটির অনুরোধ করতে পারে। এটা বিতর্ক বাড়ায়। এটিকে সহজভাবে বলতে গেলে, দক্ষ কোডটি স্কেলাবিলিটি ইস্যুতে ঝুঁকির সম্ভাবনা বেশি কারণ বিশ্বব্যাপী রাষ্ট্র আরও কঠোরভাবে বিতর্কিত হয়। ধীর কোডটি স্কেলাবিলিটি সমস্যাগুলির কারণ হ্রাস করার সম্ভাবনা কম কারণ বিশ্বব্যাপী রাষ্ট্রটি ঘন ঘন অ্যাক্সেস করে না।
HASHBYTES
স্কেলাবিলিটিটি আংশিকভাবে ইনপুট স্ট্রিংয়ের দৈর্ঘ্যের উপর ভিত্তি করে। আমার তত্ত্বটি হ'ল কেন এটি ঘটে তা হ'ল HASHBYTES
ফাংশনটি যখন ডাকা হয় তখন কিছু বৈশ্বিক রাষ্ট্রের অ্যাক্সেস প্রয়োজন । পর্যবেক্ষণ করার জন্য সহজ বিশ্বব্যাপী রাষ্ট্রটি এসকিউএল সার্ভারের কয়েকটি সংস্করণে কল প্রতি মেমরির পৃষ্ঠা বরাদ্দ করা দরকার। সবচেয়ে কঠিন লক্ষ্য করা যায় যে কোনও ধরণের ওএসের বিতর্ক রয়েছে tention ফলস্বরূপ, যদি HASHBYTES
কোডটি কম ঘন ঘন কল করা হয় তবে বিতর্ক হ্রাস পাবে। HASHBYTES
কলগুলির হার হ্রাস করার একটি উপায় হ'ল প্রতি কলটিতে হ্যাশিং কাজের পরিমাণ বাড়ানো। হ্যাশিংয়ের কাজটি আংশিকভাবে ইনপুট স্ট্রিংয়ের দৈর্ঘ্যের উপর ভিত্তি করে। স্কেল্যাবিলিটি সমস্যা পুনরুত্পাদন করার জন্য আমি অ্যাপ্লিকেশনটিতে দেখেছি আমার ডেমো ডেটা পরিবর্তন করতে হবে। একটি যুক্তিসঙ্গত খারাপ পরিস্থিতি 21 সহ একটি টেবিলBIGINT
কলাম. সারণির সংজ্ঞাটি নীচে কোডে অন্তর্ভুক্ত রয়েছে। স্থানীয় উপাদানগুলি হ্রাস করতে I'm, আমি MAXDOP 1
তুলনামূলকভাবে ছোট টেবিলগুলিতে চলমান সমবর্তী প্রশ্নগুলি ব্যবহার করছি । আমার দ্রুত বেনমার্ক কোডটি নীচে রয়েছে।
ফাংশনগুলি বিভিন্ন হ্যাশ দৈর্ঘ্য ফেরত নোট করুন। MD5
এবং SpookyHash
উভয়ই 128 বিট হ্যাশ, SHA256
একটি 256 বিট হ্যাশ।
ফলাফল ( NVARCHAR
বনাম VARBINARY
রূপান্তর এবং উপসংহার)
রূপান্তরিত, এবং কনটেনেটেটিংয়ের VARBINARY
চেয়ে সত্যই কার্যকর / পারফরম্যান্ট কিনা তা দেখার জন্য, একই টেমপ্লেট থেকে সঞ্চিত পদ্ধতির NVARCHAR
একটি NVARCHAR
সংস্করণ RUN_HASHBYTES_SHA2_256
তৈরি করা হয়েছিল ( নীচে বেনমার্কিং কোডের বিভাগে "পদক্ষেপ 5" দেখুন)। কেবলমাত্র পার্থক্যগুলি হ'ল:
- সঞ্চিত প্রক্রিয়া নামটি শেষ হয়
_NVC
BINARY(8)
জন্য CAST
ফাংশন হতে পরিবর্তন করা হয়েছিলNVARCHAR(15)
0x7C
হতে পরিবর্তন করা হয়েছিল N'|'
ফলাফল এতে:
CAST(FK1 AS NVARCHAR(15)) + N'|' +
পরিবর্তে:
CAST(FK1 AS BINARY(8)) + 0x7C +
নীচের টেবিলটিতে 1 মিনিটে সঞ্চালিত হ্যাশগুলির সংখ্যা রয়েছে। নীচে উল্লিখিত অন্যান্য পরীক্ষার জন্য পরীক্ষাগুলি আলাদা সার্ভারে ব্যবহার করা হয়েছিল।
╔════════════════╦══════════╦══════════════╗
║ Datatype ║ Test # ║ Total Hashes ║
╠════════════════╬══════════╬══════════════╣
║ NVARCHAR ║ 1 ║ 10200000 ║
║ NVARCHAR ║ 2 ║ 10300000 ║
║ NVARCHAR ║ AVERAGE ║ * 10250000 * ║
║ -------------- ║ -------- ║ ------------ ║
║ VARBINARY ║ 1 ║ 12500000 ║
║ VARBINARY ║ 2 ║ 12800000 ║
║ VARBINARY ║ AVERAGE ║ * 12650000 * ║
╚════════════════╩══════════╩══════════════╝
মাত্র গড়ের দিকে তাকালে আমরা এতে স্যুইচ করার সুবিধাটি গণনা করতে পারি VARBINARY
:
SELECT (12650000 - 10250000) AS [IncreaseAmount],
ROUND(((126500000 - 10250000) / 10250000) * 100.0, 3) AS [IncreasePercentage]
যে ফিরে:
IncreaseAmount: 2400000.0
IncreasePercentage: 23.415
ফলাফল (হ্যাশ অ্যালগরিদম এবং বাস্তবায়ন)
নীচের টেবিলটিতে 1 মিনিটে সঞ্চালিত হ্যাশগুলির সংখ্যা রয়েছে। উদাহরণস্বরূপ, CHECKSUM
৮৪ টি সমবর্তী প্রশ্নের সাথে ব্যবহারের ফলে সময় শেষ হওয়ার আগেই 2 বিলিয়ন হ্যাশ সঞ্চালিত হয়েছিল।
╔════════════════════╦════════════╦════════════╦════════════╗
║ Function ║ 12 threads ║ 48 threads ║ 84 threads ║
╠════════════════════╬════════════╬════════════╬════════════╣
║ CHECKSUM ║ 281250000 ║ 1122440000 ║ 2040100000 ║
║ HASHBYTES MD5 ║ 75940000 ║ 106190000 ║ 112750000 ║
║ HASHBYTES SHA2_256 ║ 80210000 ║ 117080000 ║ 124790000 ║
║ CLR Spooky ║ 131250000 ║ 505700000 ║ 786150000 ║
║ CLR SpookyLOB ║ 17420000 ║ 27160000 ║ 31380000 ║
║ SQL# MD5 ║ 17080000 ║ 26450000 ║ 29080000 ║
║ SQL# SHA2_256 ║ 18370000 ║ 28860000 ║ 32590000 ║
║ SQL# MD5 8k ║ 24440000 ║ 30560000 ║ 32550000 ║
║ SQL# SHA2_256 8k ║ 87240000 ║ 159310000 ║ 155760000 ║
╚════════════════════╩════════════╩════════════╩════════════╝
যদি আপনি প্রতি থ্রেড-সেকেন্ডের ক্ষেত্রে কাজের ক্ষেত্রে পরিমাপ করা একই সংখ্যাগুলি দেখতে পছন্দ করেন:
╔════════════════════╦════════════════════════════╦════════════════════════════╦════════════════════════════╗
║ Function ║ 12 threads per core-second ║ 48 threads per core-second ║ 84 threads per core-second ║
╠════════════════════╬════════════════════════════╬════════════════════════════╬════════════════════════════╣
║ CHECKSUM ║ 390625 ║ 389736 ║ 404782 ║
║ HASHBYTES MD5 ║ 105472 ║ 36872 ║ 22371 ║
║ HASHBYTES SHA2_256 ║ 111403 ║ 40653 ║ 24760 ║
║ CLR Spooky ║ 182292 ║ 175590 ║ 155982 ║
║ CLR SpookyLOB ║ 24194 ║ 9431 ║ 6226 ║
║ SQL# MD5 ║ 23722 ║ 9184 ║ 5770 ║
║ SQL# SHA2_256 ║ 25514 ║ 10021 ║ 6466 ║
║ SQL# MD5 8k ║ 33944 ║ 10611 ║ 6458 ║
║ SQL# SHA2_256 8k ║ 121167 ║ 55316 ║ 30905 ║
╚════════════════════╩════════════════════════════╩════════════════════════════╩════════════════════════════╝
সমস্ত পদ্ধতি সম্পর্কে কিছু দ্রুত চিন্তা:
CHECKSUM
: প্রত্যাশার মতো খুব ভাল স্কেল্যাবিলিটি
HASHBYTES
: স্কেলাবিলিটি ইস্যুগুলির মধ্যে কল প্রতি এক মেমরি বরাদ্দ এবং ওএসে ব্যয় করা প্রচুর পরিমাণে সিপিইউ অন্তর্ভুক্ত
Spooky
: আশ্চর্যজনকভাবে ভাল স্কেলাবিলিটি
Spooky LOB
: স্পিনলক SOS_SELIST_SIZED_SLOCK
নিয়ন্ত্রণের বাইরে চলে যায়। আমি সন্দেহ করি যে এটি সিএলআর ফাংশনগুলির মাধ্যমে এলওবি পাস করার একটি সাধারণ সমস্যা, তবে আমি নিশ্চিত নই
Util_HashBinary
: দেখে মনে হচ্ছে এটি একই স্পিনলক দ্বারা আঘাত পেয়েছে। আমি এখন পর্যন্ত এটি সন্ধান করিনি কারণ সম্ভবত এটির জন্য খুব বেশি কিছু আমি করতে পারি না:
Util_HashBinary 8k
: খুব অবাক করা ফলাফল, এখানে কী চলছে তা নিশ্চিত নয়
একটি ছোট সার্ভারে চূড়ান্ত ফলাফল পরীক্ষা করা হয়েছে:
╔═════════════════════════╦════════════════════════╦════════════════════════╗
║ Hash Algorithm ║ Hashes over 11 threads ║ Hashes over 44 threads ║
╠═════════════════════════╬════════════════════════╬════════════════════════╣
║ HASHBYTES SHA2_256 ║ 85220000 ║ 167050000 ║
║ SpookyHash ║ 101200000 ║ 239530000 ║
║ Util_HashSHA256Binary8k ║ 90590000 ║ 217170000 ║
║ SpookyHashLOB ║ 23490000 ║ 38370000 ║
║ Util_HashSHA256Binary ║ 23430000 ║ 36590000 ║
╚═════════════════════════╩════════════════════════╩════════════════════════╝
বেনমার্কিং কোড
সেটআপ 1: টেবিল এবং ডেটা
DROP TABLE IF EXISTS dbo.HASH_SMALL;
CREATE TABLE dbo.HASH_SMALL (
ID BIGINT NOT NULL,
FK1 BIGINT NOT NULL,
FK2 BIGINT NOT NULL,
FK3 BIGINT NOT NULL,
FK4 BIGINT NOT NULL,
FK5 BIGINT NOT NULL,
FK6 BIGINT NOT NULL,
FK7 BIGINT NOT NULL,
FK8 BIGINT NOT NULL,
FK9 BIGINT NOT NULL,
FK10 BIGINT NOT NULL,
FK11 BIGINT NOT NULL,
FK12 BIGINT NOT NULL,
FK13 BIGINT NOT NULL,
FK14 BIGINT NOT NULL,
FK15 BIGINT NOT NULL,
FK16 BIGINT NOT NULL,
FK17 BIGINT NOT NULL,
FK18 BIGINT NOT NULL,
FK19 BIGINT NOT NULL,
FK20 BIGINT NOT NULL
);
INSERT INTO dbo.HASH_SMALL WITH (TABLOCK)
SELECT RN,
4000000 - RN, 4000000 - RN
,200000000 - RN, 200000000 - RN
, RN % 500000 , RN % 500000 , RN % 500000
, RN % 500000 , RN % 500000 , RN % 500000
, 100000 - RN % 100000, RN % 100000
, 100000 - RN % 100000, RN % 100000
, 100000 - RN % 100000, RN % 100000
, 100000 - RN % 100000, RN % 100000
, 100000 - RN % 100000, RN % 100000
FROM (
SELECT TOP (10000) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) RN
FROM master..spt_values t1
CROSS JOIN master..spt_values t2
) q
OPTION (MAXDOP 1);
DROP TABLE IF EXISTS dbo.LOG_HASHES;
CREATE TABLE dbo.LOG_HASHES (
LOG_TIME DATETIME,
HASH_ALGORITHM INT,
SESSION_ID INT,
NUM_HASHES BIGINT
);
সেটআপ 2: মাস্টার এক্সিকিউশন প্রোক
GO
CREATE OR ALTER PROCEDURE dbo.RUN_HASHES_FOR_ONE_MINUTE (@HashAlgorithm INT)
AS
BEGIN
DECLARE @target_end_time DATETIME = DATEADD(MINUTE, 1, GETDATE()),
@query_execution_count INT = 0;
SET NOCOUNT ON;
DECLARE @ProcName NVARCHAR(261); -- schema_name + proc_name + '[].[]'
DECLARE @RowCount INT;
SELECT @RowCount = SUM(prtn.[row_count])
FROM sys.dm_db_partition_stats prtn
WHERE prtn.[object_id] = OBJECT_ID(N'dbo.HASH_SMALL')
AND prtn.[index_id] < 2;
-- Load assembly if not loaded to prevent load time from skewing results
DECLARE @OptionalInitSQL NVARCHAR(MAX);
SET @OptionalInitSQL = CASE @HashAlgorithm
WHEN 1 THEN N'SELECT @Dummy = dbo.SpookyHash(0x1234);'
WHEN 2 THEN N'' -- HASHBYTES
WHEN 3 THEN N'' -- HASHBYTES
WHEN 4 THEN N'' -- CHECKSUM
WHEN 5 THEN N'SELECT @Dummy = dbo.SpookyHashLOB(0x1234);'
WHEN 6 THEN N'SELECT @Dummy = SQL#.Util_HashBinary(N''MD5'', 0x1234);'
WHEN 7 THEN N'SELECT @Dummy = SQL#.Util_HashBinary(N''SHA256'', 0x1234);'
WHEN 8 THEN N'SELECT @Dummy = SQL#.Util_HashBinary8k(N''MD5'', 0x1234);'
WHEN 9 THEN N'SELECT @Dummy = SQL#.Util_HashBinary8k(N''SHA256'', 0x1234);'
/* -- BETA / non-public code
WHEN 10 THEN N'SELECT @Dummy = SQL#.Util_HashSHA256Binary8k(0x1234);'
WHEN 11 THEN N'SELECT @Dummy = SQL#.Util_HashSHA256Binary(0x1234);'
*/
END;
IF (RTRIM(@OptionalInitSQL) <> N'')
BEGIN
SET @OptionalInitSQL = N'
SET NOCOUNT ON;
DECLARE @Dummy VARBINARY(100);
' + @OptionalInitSQL;
RAISERROR(N'** Executing optional initialization code:', 10, 1) WITH NOWAIT;
RAISERROR(@OptionalInitSQL, 10, 1) WITH NOWAIT;
EXEC (@OptionalInitSQL);
RAISERROR(N'-------------------------------------------', 10, 1) WITH NOWAIT;
END;
SET @ProcName = CASE @HashAlgorithm
WHEN 1 THEN N'dbo.RUN_SpookyHash'
WHEN 2 THEN N'dbo.RUN_HASHBYTES_MD5'
WHEN 3 THEN N'dbo.RUN_HASHBYTES_SHA2_256'
WHEN 4 THEN N'dbo.RUN_CHECKSUM'
WHEN 5 THEN N'dbo.RUN_SpookyHashLOB'
WHEN 6 THEN N'dbo.RUN_SR_MD5'
WHEN 7 THEN N'dbo.RUN_SR_SHA256'
WHEN 8 THEN N'dbo.RUN_SR_MD5_8k'
WHEN 9 THEN N'dbo.RUN_SR_SHA256_8k'
/* -- BETA / non-public code
WHEN 10 THEN N'dbo.RUN_SR_SHA256_new'
WHEN 11 THEN N'dbo.RUN_SR_SHA256LOB_new'
*/
WHEN 13 THEN N'dbo.RUN_HASHBYTES_SHA2_256_NVC'
END;
RAISERROR(N'** Executing proc: %s', 10, 1, @ProcName) WITH NOWAIT;
WHILE GETDATE() < @target_end_time
BEGIN
EXEC @ProcName;
SET @query_execution_count = @query_execution_count + 1;
END;
INSERT INTO dbo.LOG_HASHES
VALUES (GETDATE(), @HashAlgorithm, @@SPID, @RowCount * @query_execution_count);
END;
GO
সেটআপ 3: সংঘর্ষ সনাক্তকরণ প্রোক
GO
CREATE OR ALTER PROCEDURE dbo.VERIFY_NO_COLLISIONS (@HashAlgorithm INT)
AS
SET NOCOUNT ON;
DECLARE @RowCount INT;
SELECT @RowCount = SUM(prtn.[row_count])
FROM sys.dm_db_partition_stats prtn
WHERE prtn.[object_id] = OBJECT_ID(N'dbo.HASH_SMALL')
AND prtn.[index_id] < 2;
DECLARE @CollisionTestRows INT;
DECLARE @CollisionTestSQL NVARCHAR(MAX);
SET @CollisionTestSQL = N'
SELECT @RowsOut = COUNT(DISTINCT '
+ CASE @HashAlgorithm
WHEN 1 THEN N'dbo.SpookyHash('
WHEN 2 THEN N'HASHBYTES(''MD5'','
WHEN 3 THEN N'HASHBYTES(''SHA2_256'','
WHEN 4 THEN N'CHECKSUM('
WHEN 5 THEN N'dbo.SpookyHashLOB('
WHEN 6 THEN N'SQL#.Util_HashBinary(N''MD5'','
WHEN 7 THEN N'SQL#.Util_HashBinary(N''SHA256'','
WHEN 8 THEN N'SQL#.[Util_HashBinary8k](N''MD5'','
WHEN 9 THEN N'SQL#.[Util_HashBinary8k](N''SHA256'','
--/* -- BETA / non-public code
WHEN 10 THEN N'SQL#.[Util_HashSHA256Binary8k]('
WHEN 11 THEN N'SQL#.[Util_HashSHA256Binary]('
--*/
END
+ N'
CAST(FK1 AS BINARY(8)) + 0x7C +
CAST(FK2 AS BINARY(8)) + 0x7C +
CAST(FK3 AS BINARY(8)) + 0x7C +
CAST(FK4 AS BINARY(8)) + 0x7C +
CAST(FK5 AS BINARY(8)) + 0x7C +
CAST(FK6 AS BINARY(8)) + 0x7C +
CAST(FK7 AS BINARY(8)) + 0x7C +
CAST(FK8 AS BINARY(8)) + 0x7C +
CAST(FK9 AS BINARY(8)) + 0x7C +
CAST(FK10 AS BINARY(8)) + 0x7C +
CAST(FK11 AS BINARY(8)) + 0x7C +
CAST(FK12 AS BINARY(8)) + 0x7C +
CAST(FK13 AS BINARY(8)) + 0x7C +
CAST(FK14 AS BINARY(8)) + 0x7C +
CAST(FK15 AS BINARY(8)) + 0x7C +
CAST(FK16 AS BINARY(8)) + 0x7C +
CAST(FK17 AS BINARY(8)) + 0x7C +
CAST(FK18 AS BINARY(8)) + 0x7C +
CAST(FK19 AS BINARY(8)) + 0x7C +
CAST(FK20 AS BINARY(8)) ))
FROM dbo.HASH_SMALL;';
PRINT @CollisionTestSQL;
EXEC sp_executesql
@CollisionTestSQL,
N'@RowsOut INT OUTPUT',
@RowsOut = @CollisionTestRows OUTPUT;
IF (@CollisionTestRows <> @RowCount)
BEGIN
RAISERROR('Collisions for algorithm: %d!!! %d unique rows out of %d.',
16, 1, @HashAlgorithm, @CollisionTestRows, @RowCount);
END;
GO
সেটআপ 4: ক্লিনআপ (সমস্ত পরীক্ষার জন্য ড্রপ)
DECLARE @SQL NVARCHAR(MAX) = N'';
SELECT @SQL += N'DROP PROCEDURE [dbo].' + QUOTENAME(sp.[name])
+ N';' + NCHAR(13) + NCHAR(10)
FROM sys.objects sp
WHERE sp.[name] LIKE N'RUN[_]%'
AND sp.[type_desc] = N'SQL_STORED_PROCEDURE'
AND sp.[name] <> N'RUN_HASHES_FOR_ONE_MINUTE'
PRINT @SQL;
EXEC (@SQL);
সেটআপ 5: পরীক্ষার প্রকোপগুলি উত্পন্ন করুন
SET NOCOUNT ON;
DECLARE @TestProcsToCreate TABLE
(
ProcName sysname NOT NULL,
CodeToExec NVARCHAR(261) NOT NULL
);
DECLARE @ProcName sysname,
@CodeToExec NVARCHAR(261);
INSERT INTO @TestProcsToCreate VALUES
(N'SpookyHash', N'dbo.SpookyHash('),
(N'HASHBYTES_MD5', N'HASHBYTES(''MD5'','),
(N'HASHBYTES_SHA2_256', N'HASHBYTES(''SHA2_256'','),
(N'CHECKSUM', N'CHECKSUM('),
(N'SpookyHashLOB', N'dbo.SpookyHashLOB('),
(N'SR_MD5', N'SQL#.Util_HashBinary(N''MD5'','),
(N'SR_SHA256', N'SQL#.Util_HashBinary(N''SHA256'','),
(N'SR_MD5_8k', N'SQL#.[Util_HashBinary8k](N''MD5'','),
(N'SR_SHA256_8k', N'SQL#.[Util_HashBinary8k](N''SHA256'',')
--/* -- BETA / non-public code
, (N'SR_SHA256_new', N'SQL#.[Util_HashSHA256Binary8k]('),
(N'SR_SHA256LOB_new', N'SQL#.[Util_HashSHA256Binary](');
--*/
DECLARE @ProcTemplate NVARCHAR(MAX),
@ProcToCreate NVARCHAR(MAX);
SET @ProcTemplate = N'
CREATE OR ALTER PROCEDURE dbo.RUN_{{ProcName}}
AS
BEGIN
DECLARE @dummy INT;
SET NOCOUNT ON;
SELECT @dummy = COUNT({{CodeToExec}}
CAST(FK1 AS BINARY(8)) + 0x7C +
CAST(FK2 AS BINARY(8)) + 0x7C +
CAST(FK3 AS BINARY(8)) + 0x7C +
CAST(FK4 AS BINARY(8)) + 0x7C +
CAST(FK5 AS BINARY(8)) + 0x7C +
CAST(FK6 AS BINARY(8)) + 0x7C +
CAST(FK7 AS BINARY(8)) + 0x7C +
CAST(FK8 AS BINARY(8)) + 0x7C +
CAST(FK9 AS BINARY(8)) + 0x7C +
CAST(FK10 AS BINARY(8)) + 0x7C +
CAST(FK11 AS BINARY(8)) + 0x7C +
CAST(FK12 AS BINARY(8)) + 0x7C +
CAST(FK13 AS BINARY(8)) + 0x7C +
CAST(FK14 AS BINARY(8)) + 0x7C +
CAST(FK15 AS BINARY(8)) + 0x7C +
CAST(FK16 AS BINARY(8)) + 0x7C +
CAST(FK17 AS BINARY(8)) + 0x7C +
CAST(FK18 AS BINARY(8)) + 0x7C +
CAST(FK19 AS BINARY(8)) + 0x7C +
CAST(FK20 AS BINARY(8))
)
)
FROM dbo.HASH_SMALL
OPTION (MAXDOP 1);
END;
';
DECLARE CreateProcsCurs CURSOR READ_ONLY FORWARD_ONLY LOCAL FAST_FORWARD
FOR SELECT [ProcName], [CodeToExec]
FROM @TestProcsToCreate;
OPEN [CreateProcsCurs];
FETCH NEXT
FROM [CreateProcsCurs]
INTO @ProcName, @CodeToExec;
WHILE (@@FETCH_STATUS = 0)
BEGIN
-- First: create VARBINARY version
SET @ProcToCreate = REPLACE(REPLACE(@ProcTemplate,
N'{{ProcName}}',
@ProcName),
N'{{CodeToExec}}',
@CodeToExec);
EXEC (@ProcToCreate);
-- Second: create NVARCHAR version (optional: built-ins only)
IF (CHARINDEX(N'.', @CodeToExec) = 0)
BEGIN
SET @ProcToCreate = REPLACE(REPLACE(REPLACE(@ProcToCreate,
N'dbo.RUN_' + @ProcName,
N'dbo.RUN_' + @ProcName + N'_NVC'),
N'BINARY(8)',
N'NVARCHAR(15)'),
N'0x7C',
N'N''|''');
EXEC (@ProcToCreate);
END;
FETCH NEXT
FROM [CreateProcsCurs]
INTO @ProcName, @CodeToExec;
END;
CLOSE [CreateProcsCurs];
DEALLOCATE [CreateProcsCurs];
পরীক্ষা 1: সংঘর্ষের জন্য চেক করুন
EXEC dbo.VERIFY_NO_COLLISIONS 1;
EXEC dbo.VERIFY_NO_COLLISIONS 2;
EXEC dbo.VERIFY_NO_COLLISIONS 3;
EXEC dbo.VERIFY_NO_COLLISIONS 4;
EXEC dbo.VERIFY_NO_COLLISIONS 5;
EXEC dbo.VERIFY_NO_COLLISIONS 6;
EXEC dbo.VERIFY_NO_COLLISIONS 7;
EXEC dbo.VERIFY_NO_COLLISIONS 8;
EXEC dbo.VERIFY_NO_COLLISIONS 9;
EXEC dbo.VERIFY_NO_COLLISIONS 10;
EXEC dbo.VERIFY_NO_COLLISIONS 11;
পরীক্ষা 2: পারফরম্যান্স টেস্টগুলি চালান
EXEC dbo.RUN_HASHES_FOR_ONE_MINUTE 1;
EXEC dbo.RUN_HASHES_FOR_ONE_MINUTE 2;
EXEC dbo.RUN_HASHES_FOR_ONE_MINUTE 3; -- HASHBYTES('SHA2_256'
EXEC dbo.RUN_HASHES_FOR_ONE_MINUTE 4;
EXEC dbo.RUN_HASHES_FOR_ONE_MINUTE 5;
EXEC dbo.RUN_HASHES_FOR_ONE_MINUTE 6;
EXEC dbo.RUN_HASHES_FOR_ONE_MINUTE 7;
EXEC dbo.RUN_HASHES_FOR_ONE_MINUTE 8;
EXEC dbo.RUN_HASHES_FOR_ONE_MINUTE 9;
EXEC dbo.RUN_HASHES_FOR_ONE_MINUTE 10;
EXEC dbo.RUN_HASHES_FOR_ONE_MINUTE 11;
EXEC dbo.RUN_HASHES_FOR_ONE_MINUTE 13; -- NVC version of #3
SELECT *
FROM dbo.LOG_HASHES
ORDER BY [LOG_TIME] DESC;
মূল্যায়ন সমাধানের বিষয়গুলি
একক একক এসকিউএলসিআরআর ইউডিএফের পারফরম্যান্স টেস্টিংয়ের দিকে মনোনিবেশ করার সময়, দুটি বিষয় যা প্রথম দিকে আলোচনা করা হয়েছিল তা পরীক্ষাগুলিতে অন্তর্ভুক্ত করা হয়নি, তবে কোন পদ্ধতির সমস্ত প্রয়োজনীয়তা পূরণ হয় তা নির্ধারণ করার জন্য আদর্শভাবে তদন্ত করা উচিত ।
- প্রতিটি ক্যোয়ারী অনুযায়ী ফাংশন দু'বার কার্যকর করা হবে (একবার আমদানি সারিটির জন্য এবং একবার বর্তমান সারির জন্য)। পরীক্ষাগুলি এখনও পর্যন্ত পরীক্ষার প্রশ্নাবলীতে কেবলমাত্র একবার ইউডিএফকে রেফারেন্স করেছে। এই ফ্যাক্টরটি বিকল্পগুলির র্যাঙ্কিং পরিবর্তন করতে পারে না, তবে এটি কেবল এ ক্ষেত্রে উপেক্ষা করা উচিত নয়।
এরপরে মুছে ফেলা একটি মন্তব্যে পল হোয়াইট উল্লেখ করেছিলেন:
HASHBYTES
একটি সিএলআর স্কেলার ফাংশন প্রতিস্থাপনের একটি নেতিবাচক দিক - এটি প্রদর্শিত হয় যে সিএলআর ফাংশনগুলি ব্যাচ মোড ব্যবহার করতে পারে না যেখানে HASHBYTES
পারে। এটি গুরুত্বপূর্ণ, পারফরম্যান্স-ভিত্তিক হতে পারে।
সুতরাং এটি বিবেচনার জন্য কিছু, এবং পরিষ্কারভাবে পরীক্ষা প্রয়োজন requires যদি এসকিউএলসিআরআর বিকল্পগুলি অন্তর্নির্মিতগুলির উপরে কোনও সুবিধা না দেয় HASHBYTES
, তবে এটি বিদ্যমান টেবিলগুলিতে বিদ্যমান হ্যাশগুলি (কমপক্ষে বৃহত্তম টেবিলের জন্য) ক্যাপচার করার সলোমনের পরামর্শকে ওজন যুক্ত করে।
Clear()
পদ্ধতি আছে তবে আমি এটিকে স্পুকির দিকে দেখিনি।