পটভূমি
ফর্মের একটি বিবৃতি ব্যবহার করে পরিসংখ্যান অবজেক্টের ডেটা সংগ্রহ করা হয়:
SELECT
StatMan([SC0], [SC1], [SB0000])
FROM
(
SELECT TOP 100 PERCENT
[SC0], [SC1], STEP_DIRECTION([SC0]) OVER (ORDER BY NULL) AS [SB0000]
FROM
(
SELECT
[TextValue] AS [SC0],
[Id] AS [SC1]
FROM [dbo].[Test]
TABLESAMPLE SYSTEM (2.223684e+001 PERCENT)
WITH (READUNCOMMITTED)
) AS _MS_UPDSTATS_TBL_HELPER
ORDER BY
[SC0],
[SC1],
[SB0000]
) AS _MS_UPDSTATS_TBL
OPTION (MAXDOP 1)
আপনি বর্ধিত ইভেন্ট বা প্রোফাইলার ( SP:StmtCompleted
) এর সাহায্যে এই বিবৃতিটি সংগ্রহ করতে পারেন ।
পরিসংখ্যান তৈরির প্রশ্নগুলি প্রায়শই নন ক্ল্লাস্টারড সূচক পৃষ্ঠাগুলিতে প্রাকৃতিকভাবে ঘটে এমন মানগুলির ক্লাস্টারিং এড়ানোর জন্য বেস টেবিলটি (একটি নন ক্ল্লাস্টারড ইনডেক্সের পরিবর্তে) অ্যাক্সেস করে।
নমুনাযুক্ত সারিগুলির সংখ্যা নমুনার জন্য নির্বাচিত পুরো পৃষ্ঠাগুলির সংখ্যার উপর নির্ভর করে। সারণীর প্রতিটি পৃষ্ঠা হয় নির্বাচিত বা এটি নয়। নির্বাচিত পৃষ্ঠাগুলির সমস্ত সারি পরিসংখ্যানগুলিতে অবদান রাখে।
এলোমেলো সংখ্যা
এসকিউএল সার্ভার কোনও পৃষ্ঠা যোগ্যতা অর্জন করে কিনা তা নির্ধারণ করতে এলোমেলো সংখ্যা জেনারেটর ব্যবহার করে। এই উদাহরণে ব্যবহৃত জেনারেটরটি প্যারামিটার মানগুলির সাথে নীচে প্রদর্শিত হিসাবে লেহমার র্যান্ডম নম্বর জেনারেটর :
এক্স পরবর্তী = এক্স বীজ * 7 5 মড (2 31 - 1)
এর যোগফল হিসাবে এর মান গণনা করা হয়:Xseed
( bigint
) বেস টেবিলের কম সংখ্যার অংশ partition_id
যেমন
SELECT
P.[partition_id] & 0xFFFFFFFF
FROM sys.partitions AS P
WHERE
P.[object_id] = OBJECT_ID(N'dbo.Test', N'U')
AND P.index_id = 1;
উল্লেখিত মান REPEATABLE
দফা
- নমুনাযুক্ত জন্য
UPDATE STATISTICS
, REPEATABLE
মান 1।
- এই মানটি
m_randomSeed
অ্যাক্সেস পদ্ধতির অভ্যন্তরীণ ডিবাগিং তথ্য কার্যকর করার পরিকল্পনাগুলিতে দেখানো হয় যখন ট্রেস পতাকা 8666 সক্ষম করা থাকে, উদাহরণ হিসাবে প্রকাশ করা হয়<Field FieldName="m_randomSeed" FieldValue="1" />
এসকিউএল সার্ভার ২০১২-এর জন্য, এই গণনাটি এখানে ঘটে sqlmin!UnOrderPageScanner::StartScan
:
mov edx,dword ptr [rcx+30h]
add edx,dword ptr [rcx+2Ch]
যেখানে [rcx+30h]
মেমরিটিতে পার্টিশন আইডির কম 32 বিট [rcx+2Ch]
থাকে এবং REPEATABLE
মেমরিটিতে ব্যবহারের মান থাকে ।
এলোমেলো নম্বর জেনারেটর পরে একই পদ্ধতিতে কল করা হয় sqlmin!RandomNumGenerator::Init
, যেখানে নির্দেশনা:
imul r9d,r9d,41A7h
... উপরের সমীকরণে দেখানো হিসাবে 41A7
বীজকে হেক্স (16807 দশমিক = 7 5 ) দিয়ে গুণ করুন ।
পরে এলোমেলো একই বেসিক কোডটি ব্যবহার করে এলোমেলো সংখ্যা (পৃথক পৃষ্ঠাগুলির জন্য) তৈরি করা হয় sqlmin!UnOrderPageScanner::SetupSubScanner
।
StatMan
StatMan
উপরে প্রদর্শিত উদাহরণের প্রশ্নের জন্য , একই পৃষ্ঠাগুলি টি-এসকিউএল বিবৃতি হিসাবে সংগ্রহ করা হবে:
SELECT
COUNT_BIG(*)
FROM dbo.Test AS T
TABLESAMPLE SYSTEM (2.223684e+001 PERCENT) -- Same sample %
REPEATABLE (1) -- Always 1 for statman
WITH (INDEX(0)); -- Scan base object
এটি এর ফলাফলের সাথে মিলবে:
SELECT
DDSP.rows_sampled
FROM sys.stats AS S
CROSS APPLY sys.dm_db_stats_properties(S.[object_id], S.stats_id) AS DDSP
WHERE
S.[object_id] = OBJECT_ID(N'dbo.Test', N'U')
AND S.[name] = N'IX_Test_TextValue';
এজ কেস
এমআইএনএসটিডি লেহমার এলোমেলো সংখ্যা জেনারেটর ব্যবহারের একটি ফল হ'ল বীজের মান শূন্য এবং ইনটম্যাক্স ব্যবহার করা উচিত নয় কারণ এর ফলে অ্যালগরিদম শূন্যের ক্রম তৈরি করবে (প্রতিটি পৃষ্ঠা নির্বাচন করে)।
কোডটি শূন্য সনাক্ত করে এবং সিস্টেম 'ঘড়ি' থেকে সেই ক্ষেত্রে বীজ হিসাবে একটি মান ব্যবহার করে। বীজটি int.max হলে এটি একই রকম হয় না ( 0x7FFFFFFF
= 2 31 - 1)।
পার্টিশন আইডির কম 32 বিটের যোগফল হিসাবে প্রাথমিক বীজ গণনা করা হওয়ায় আমরা এই দৃশ্যটি ইঞ্জিনিয়ার করতে পারি REPEATABLE
। REPEATABLE
মান int.max এবং সেইজন্য প্রতিটি পৃষ্ঠায় হচ্ছে বীজ পরিণাম ডেকে আনবে নির্বাচিত হওয়ার নমুনা জন্য:
SELECT
0x7FFFFFFF - (P.[partition_id] & 0xFFFFFFFF)
FROM sys.partitions AS P
WHERE
P.[object_id] = OBJECT_ID(N'dbo.Test', N'U')
AND P.index_id = 1;
সম্পূর্ণ উদাহরণ হিসাবে কাজ করা:
DECLARE @SQL nvarchar(4000) =
N'
SELECT
COUNT_BIG(*)
FROM dbo.Test AS T
TABLESAMPLE (0 PERCENT)
REPEATABLE (' +
(
SELECT TOP (1)
CONVERT(nvarchar(11), 0x7FFFFFFF - P.[partition_id] & 0xFFFFFFFF)
FROM sys.partitions AS P
WHERE
P.[object_id] = OBJECT_ID(N'dbo.Test', N'U')
AND P.index_id = 1
) + ')
WITH (INDEX(0));';
PRINT @SQL;
--EXECUTE (@SQL);
এটি TABLESAMPLE
ক্লাজ যা বলুক না কেন প্রতিটি পৃষ্ঠায় প্রতিটি সারি নির্বাচন করবে (এমনকি শূন্য শতাংশ)।