यह एक पारंपरिक जवाब नहीं है, लेकिन मुझे लगा कि यह अब तक उल्लिखित कुछ तकनीकों के बेंचमार्क पोस्ट करने में मददगार होगा। मैं SQL Server 2017 CU9 के साथ 96 कोर सर्वर पर परीक्षण कर रहा हूं।
कई स्केलेबिलिटी समस्याएं समवर्ती थ्रेड्स के कारण होती हैं, जो कुछ वैश्विक अवस्था में होती हैं। उदाहरण के लिए, क्लासिक पीएफएस पृष्ठ विवाद पर विचार करें। ऐसा हो सकता है यदि बहुत से वर्कर थ्रेड्स को एक ही पृष्ठ को मेमोरी में संशोधित करने की आवश्यकता हो। जैसे ही कोड अधिक कुशल हो जाता है, यह तेजी से कुंडी का अनुरोध कर सकता है। इससे विवाद बढ़ता है। इसे सरलता से कहने के लिए, स्केलेबिलिटी मुद्दों के लिए कुशल कोड की संभावना अधिक है क्योंकि वैश्विक राज्य अधिक गंभीर रूप से संरक्षित है। धीमे कोड के कारण स्केलेबिलिटी समस्या होने की संभावना कम होती है क्योंकि वैश्विक स्थिति तक अक्सर पहुंच नहीं होती है।
HASHBYTES
स्केलेबिलिटी आंशिक रूप से इनपुट स्ट्रिंग की लंबाई पर आधारित होती है। मेरा सिद्धांत यह था कि ऐसा क्यों होता है कि HASHBYTES
फ़ंक्शन को कॉल करने पर कुछ वैश्विक स्थिति तक पहुंच की आवश्यकता होती है। अवलोकन करने के लिए आसान वैश्विक स्थिति एक स्मृति पृष्ठ है जिसे SQL सर्वर के कुछ संस्करणों पर प्रति कॉल आवंटित किया जाना चाहिए। निरीक्षण करने के लिए कठिन यह है कि ओएस के कुछ प्रकार के विवाद हैं। नतीजतन, यदि HASHBYTES
कोड को कम बार कहा जाता है, तो विवाद नीचे जाता है। स्तंभों की दर को कम करने का एक तरीका । तालिका की परिभाषा तल पर कोड में शामिल है। स्थानीय कारकों ™ को कम करने के लिए, मैं समवर्ती प्रश्नों का उपयोग कर रहा हूं जो अपेक्षाकृत छोटे तालिकाओं पर काम करते हैं। मेरा त्वरित बेंचमार्क कोड सबसे नीचे है।HASHBYTES
कॉल प्रति कॉल पर हैशिंग कार्य की मात्रा को बढ़ाया जाए। हाशिंग कार्य आंशिक रूप से इनपुट स्ट्रिंग की लंबाई पर आधारित है। मापनीयता समस्या को पुन: उत्पन्न करने के लिए मैंने डेमो डेटा को बदलने के लिए आवश्यक एप्लिकेशन में देखा। एक उचित सबसे खराब स्थिति 21 के साथ एक तालिका हैBIGINT
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
84 समवर्ती प्रश्नों के साथ प्रयोग करने के परिणामस्वरूप 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
नियंत्रण से बाहर घूमता है । मुझे संदेह है कि यह CLR फ़ंक्शंस के माध्यम से LOBs पास करने के साथ एक सामान्य मुद्दा है, लेकिन मुझे यकीन नहीं है
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
);
SETUP 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
SETUP 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
SETUP 4: क्लीनअप (DROP ऑल टेस्ट प्रोक्स)
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);
SETUP 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;
रिज़ॉल्व करने के लिए मान शामिल हैं
एक विलक्षण SQLCLR UDF के प्रदर्शन परीक्षण पर ध्यान केंद्रित करते हुए, जिन दो मुद्दों पर जल्दी चर्चा की गई थी, उन्हें परीक्षणों में शामिल नहीं किया गया था, लेकिन आदर्श रूप से जांच की जानी चाहिए कि कौन सा दृष्टिकोण सभी आवश्यकताओं को पूरा करता है।
- फ़ंक्शन को प्रत्येक क्वेरी (आयात पंक्ति के लिए एक बार, और वर्तमान पंक्ति के लिए एक बार) के अनुसार दो बार निष्पादित किया जाएगा। अब तक के परीक्षणों ने केवल यूडीएफ को एक बार परीक्षण प्रश्नों में संदर्भित किया है। यह कारक विकल्पों की रैंकिंग में बदलाव नहीं कर सकता है, लेकिन इसे अनदेखा नहीं किया जाना चाहिए, बस मामले में।
तब से हटाए गए एक टिप्पणी में, पॉल व्हाइट ने उल्लेख किया था:
HASHBYTES
सीएलआर स्केलर फ़ंक्शन के साथ प्रतिस्थापित करने का एक नकारात्मक पक्ष - यह प्रतीत होता है कि सीएलआर फ़ंक्शन बैच मोड का उपयोग नहीं कर सकते हैं जबकि HASHBYTES
कर सकते हैं। यह महत्वपूर्ण हो सकता है, प्रदर्शन-वार।
तो यह विचार करने के लिए कुछ है, और स्पष्ट रूप से परीक्षण की आवश्यकता है। यदि SQLCLR विकल्प बिल्ट-इन पर कोई लाभ प्रदान नहीं करता है HASHBYTES
, तो यह सोलोमन के मौजूदा हैश (कम से कम सबसे बड़ी तालिकाओं के लिए) को संबंधित तालिकाओं में कैप्चर करने के सुझाव के लिए वजन जोड़ता है ।
Clear()
विधि है लेकिन मैंने उस स्पूकी में दूर तक नहीं देखा है।