আমি এই পোস্টটিকে একক কলামের পরিসংখ্যান নিয়ে আলোচনার মধ্যে সীমাবদ্ধ করতে যাচ্ছি কারণ এটি ইতিমধ্যে বেশ দীর্ঘ হবে এবং এসকিউএল সার্ভার কীভাবে হিস্টোগ্রামের পদক্ষেপগুলিতে ডেটা বালতি করে তা আপনার আগ্রহী। বহু কলামের পরিসংখ্যানগুলির জন্য হিস্টোগ্রাম কেবল শীর্ষস্থানীয় কলামে তৈরি করা হয়।
যখন এসকিউএল সার্ভার নির্ধারণ করে যে কোনও পরিসংখ্যান আপডেটের প্রয়োজন হয় তখন এটি একটি গোপনীয় ক্যোয়ারিকে সরিয়ে দেয় যা কোনও টেবিলের সমস্ত ডেটা বা টেবিলের ডেটার নমুনা পড়ে reads আপনি বর্ধিত ইভেন্ট সহ এই প্রশ্নগুলি দেখতে পারেন। StatMan
এসকিউএল সার্ভারের মধ্যে ডাকা একটি ফাংশন রয়েছে যা হিস্টোগ্রামগুলি তৈরি করার সাথে জড়িত। সাধারণ পরিসংখ্যান সামগ্রীর জন্য কমপক্ষে দুটি ভিন্ন ধরণের StatMan
ক্যোয়ারী রয়েছে (দ্রুত স্ট্যাট আপডেটের জন্য বিভিন্ন কোয়েরি রয়েছে এবং আমি সন্দেহ করি যে পার্টিশনযুক্ত টেবিলগুলিতে বর্ধিত পরিসংখ্যান বৈশিষ্ট্যটিও পৃথক কোয়েরি ব্যবহার করে)।
প্রথমটি কেবল কোনও ফিল্টারিং ছাড়াই টেবিল থেকে সমস্ত ডেটা ধরে। আপনি যখন টেবিলটি খুব ছোট হন বা FULLSCAN
বিকল্পের সাথে পরিসংখ্যান সংগ্রহ করেন তখন আপনি এটি দেখতে পারবেন :
CREATE TABLE X_SHOW_ME_STATMAN (N INT);
CREATE STATISTICS X_STAT_X_SHOW_ME_STATMAN ON X_SHOW_ME_STATMAN (N);
-- after gathering stats with 1 row in table
SELECT StatMan([SC0]) FROM
(
SELECT TOP 100 PERCENT [N] AS [SC0]
FROM [dbo].[X_SHOW_ME_STATMAN] WITH (READUNCOMMITTED)
ORDER BY [SC0]
) AS _MS_UPDSTATS_TBL
OPTION (MAXDOP 16);
এসকিউএল সার্ভার টেবিলের আকারের উপর ভিত্তি করে স্বয়ংক্রিয় নমুনার আকারটি তুলবে (আমি মনে করি এটি টেবিলের সারি এবং পৃষ্ঠা উভয়ই সংখ্যা)। যদি কোনও টেবিলটি খুব বড় হয় তবে স্বয়ংক্রিয় নমুনার আকারটি 100% এর নিচে নেমে যায়। 1M সারি সহ একই টেবিলে আমি যা পেয়েছি তা এখানে:
-- after gathering stats with 1 M rows in table
SELECT StatMan([SC0], [SB0000]) FROM
(
SELECT TOP 100 PERCENT [SC0], step_direction([SC0]) over (order by NULL) AS [SB0000]
FROM
(
SELECT [N] AS [SC0]
FROM [dbo].[X_SHOW_ME_STATMAN] TABLESAMPLE SYSTEM (6.666667e+001 PERCENT) WITH (READUNCOMMITTED)
) AS _MS_UPDSTATS_TBL_HELPER
ORDER BY [SC0], [SB0000]
) AS _MS_UPDSTATS_TBL
OPTION (MAXDOP 1);
TABLESAMPLE
হয় নথিভুক্ত কিন্তু StatMan এবং step_direction নয়। এখানে এসিকিউএল সার্ভারের নমুনাগুলি হিস্টোগ্রাম তৈরি করতে টেবিল থেকে প্রায় of 66.।% ডেটা উপস্থাপন করে। এর অর্থ হ'ল FULLSCAN
একই ডাটাতে স্ট্যাটাস (ছাড়াই ) আপডেট করার সময় আপনি হিস্টগ্রামের বিভিন্ন ধাপ পেতে পারেন । আমি বাস্তবে এটি কখনও পর্যবেক্ষণ করি নি তবে কেন এটি সম্ভব হবে না তা আমি দেখছি না।
সময়ের সাথে সাথে পরিসংখ্যানগুলি কীভাবে পরিবর্তিত হয় তা দেখতে আসুন সহজ ডেটাতে কয়েকটি পরীক্ষা চালানো যাক। নীচে কিছু টেস্ট কোড যা আমি লিখেছিলাম যে একটি সারণিতে ক্রমিক সংখ্যাগুলি সন্নিবেশ করানো, প্রতিটি সন্নিবেশের পরে পরিসংখ্যান সংগ্রহ এবং ফলাফলের সারণিতে পরিসংখ্যান সম্পর্কিত তথ্য সংরক্ষণ করতে। আসুন 10000 অবধি একবারে 1 টি সারি সন্নিবেশ দিয়ে শুরু করা যাক Test পরীক্ষার শয্যা:
DECLARE
@stats_id INT,
@table_object_id INT,
@rows_per_loop INT = 1,
@num_of_loops INT = 10000,
@loop_num INT;
BEGIN
SET NOCOUNT ON;
TRUNCATE TABLE X_STATS_RESULTS;
SET @table_object_id = OBJECT_ID ('X_SEQ_NUM');
SELECT @stats_id = stats_id FROM sys.stats
WHERE OBJECT_ID = @table_object_id
AND name = 'X_STATS_SEQ_INT_FULL';
SET @loop_num = 0;
WHILE @loop_num < @num_of_loops
BEGIN
SET @loop_num = @loop_num + 1;
INSERT INTO X_SEQ_NUM WITH (TABLOCK)
SELECT @rows_per_loop * (@loop_num - 1) + N FROM dbo.GetNums(@rows_per_loop);
UPDATE STATISTICS X_SEQ_NUM X_STATS_SEQ_INT_FULL WITH FULLSCAN; -- can comment out FULLSCAN as needed
INSERT INTO X_STATS_RESULTS WITH (TABLOCK)
SELECT 'X_STATS_SEQ_INT_FULL', @rows_per_loop * @loop_num, rows_sampled, steps
FROM sys.dm_db_stats_properties(@table_object_id, @stats_id);
END;
END;
এই তথ্যের জন্য হিস্টগ্রামের পদক্ষেপের সংখ্যা দ্রুত 200 এ উন্নীত হয় (এটি প্রথমে 397 সারি সহ সর্বাধিক সংখ্যক ধাপে আঘাত করে), ১৯৮৫ বা ২০০ এ থাকে যখন ১৪ 14৫ টি সারি টেবিলে না থাকে, তবে আস্তে আস্তে হ্রাস হয় যতক্ষণ না হিস্টোগ্রামে কেবল 3 বা 4 থাকে ধাপ। এখানে সমস্ত ডেটার গ্রাফ রয়েছে:
এখানে হিস্টگرامটি 10 কে সারিগুলির মতো দেখাচ্ছে:
RANGE_HI_KEY RANGE_ROWS EQ_ROWS DISTINCT_RANGE_ROWS AVG_RANGE_ROWS
1 0 1 0 1
9999 9997 1 9997 1
10000 0 1 0 1
এই সমস্যাটি কি হিস্টোগ্রামে কেবল 3 টি পদক্ষেপ রয়েছে? দেখে মনে হচ্ছে তথ্যটি আমাদের দৃষ্টিকোণ থেকে সংরক্ষিত আছে। দ্রষ্টব্য যেহেতু ডেটাটাইপটি একটি অন্তঃসত্ত্বা হিসাবে আমরা নির্ধারণ করতে পারি যে 1 - 10000 থেকে প্রতিটি পূর্ণসংখ্যার জন্য টেবিলের মধ্যে কতগুলি সারি রয়েছে Typ । এর উদাহরণের জন্য এই এসই পোস্টটি দেখুন ।
আপনি যদি মনে করেন যে আমরা যদি টেবিল থেকে একক সারি মুছে ফেলি এবং পরিসংখ্যান আপডেট করি? আদর্শভাবে আমরা আরও একটি হিস্টগ্রামের পদক্ষেপটি দেখতে চাই যে অনুপস্থিত পূর্ণসংখ্যার টেবিলে আর নেই।
DELETE FROM X_SEQ_NUM
WHERE X_NUM = 1000;
UPDATE STATISTICS X_SEQ_NUM X_STATS_SEQ_INT_FULL WITH FULLSCAN;
DBCC SHOW_STATISTICS ('X_SEQ_NUM', 'X_STATS_SEQ_INT_FULL'); -- still 3 steps
DELETE FROM X_SEQ_NUM
WHERE X_NUM IN (2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000);
UPDATE STATISTICS X_SEQ_NUM X_STATS_SEQ_INT_FULL WITH FULLSCAN;
DBCC SHOW_STATISTICS ('X_SEQ_NUM', 'X_STATS_SEQ_INT_FULL'); -- still 3 steps
এটি কিছুটা হতাশার। যদি আমরা হাতে হাতে একটি হিস্টোগ্রাম তৈরি করতাম তবে আমরা প্রতিটি অনুপস্থিত মানের জন্য একটি পদক্ষেপ যুক্ত করব। এসকিউএল সার্ভার একটি সাধারণ উদ্দেশ্যে অ্যালগরিদম ব্যবহার করছে যাতে কিছু ডেটা সেটের জন্য আমরা যে কোডটি ব্যবহার করি তার চেয়ে বেশি উপযুক্ত হিস্টোগ্রাম নিয়ে আসতে সক্ষম হতে পারি। অবশ্যই, একটি টেবিল থেকে 0 বা 1 সারি পাওয়ার মধ্যে ব্যবহারিক পার্থক্য খুব ছোট। 20000 সারি দিয়ে টেস্ট করার সময় আমি একই ফলাফল পাই যা প্রতিটি পূর্ণসংখ্যায় টেবিলের 2 সারি থাকে। আমি ডেটা মোছার সাথে সাথে হিস্টোগ্রাম পদক্ষেপগুলি লাভ করে না।
RANGE_HI_KEY RANGE_ROWS EQ_ROWS DISTINCT_RANGE_ROWS AVG_RANGE_ROWS
1 0 2 0 1
9999 19994 2 9997 2
10000 0 2 0 1
আমি যদি টেবিলে প্রতিটি পূর্ণসংখ্যার সাথে 100 টি সারি নিয়ে 1 মিলিয়ন সারি দিয়ে পরীক্ষা করি তবে আমি আরও ভাল ফলাফল পেতে পারি, তবে আমি হাত দিয়ে আরও ভাল একটি হিস্টোগ্রাম তৈরি করতে পারি।
truncate table X_SEQ_NUM;
BEGIN TRANSACTION;
INSERT INTO X_SEQ_NUM WITH (TABLOCK)
SELECT N FROM dbo.GetNums(10000);
GO 100
COMMIT TRANSACTION;
UPDATE STATISTICS X_SEQ_NUM X_STATS_SEQ_INT_FULL WITH FULLSCAN;
DBCC SHOW_STATISTICS ('X_SEQ_NUM', 'X_STATS_SEQ_INT_FULL'); -- 4 steps
DELETE FROM X_SEQ_NUM
WHERE X_NUM = 1000;
UPDATE STATISTICS X_SEQ_NUM X_STATS_SEQ_INT_FULL WITH FULLSCAN;
DBCC SHOW_STATISTICS ('X_SEQ_NUM', 'X_STATS_SEQ_INT_FULL'); -- now 5 steps with a RANGE_HI_KEY of 998 (?)
DELETE FROM X_SEQ_NUM
WHERE X_NUM IN (2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000);
UPDATE STATISTICS X_SEQ_NUM X_STATS_SEQ_INT_FULL WITH FULLSCAN;
DBCC SHOW_STATISTICS ('X_SEQ_NUM', 'X_STATS_SEQ_INT_FULL'); -- still 5 steps
চূড়ান্ত হিস্টোগ্রাম:
RANGE_HI_KEY RANGE_ROWS EQ_ROWS DISTINCT_RANGE_ROWS AVG_RANGE_ROWS
1 0 100 0 1
998 99600 100 996 100
3983 298100 100 2981 100
9999 600900 100 6009 100
10000 0 100 0 1
আসুন ক্রমসংখ্যক পূর্ণসংখ্যাগুলি সহ কিন্তু টেবিলে আরও সারি দিয়ে আরও পরীক্ষা করা যাক। নোট করুন যে খুব বেশি ছোট টেবিলগুলির জন্য ম্যানুয়ালি একটি নমুনার আকার নির্দিষ্ট করে তাতে কোনও প্রভাব পড়বে না, তাই আমি প্রতিটি সন্নিবেশে 100 টি সারি যুক্ত করব এবং প্রতিবার 1 মিলিয়ন সারি পর্যন্ত পরিসংখ্যান সংগ্রহ করব। আমি আগের মতো একই প্যাটার্নটি দেখতে পাচ্ছি, একবারে আমি টেবিলের মধ্যে 63৩73৩০০ সারি পেলে আমি আর সারণির 100% সারণির ডিফল্ট নমুনা হারের সাথে আর নমুনা করি না। আমি সারিগুলি অর্জন করার সাথে সাথে হিস্টোগ্রামের পদক্ষেপের সংখ্যা বৃদ্ধি পায়। সম্ভবত এটি কারণ এসকিউএল সার্ভারটি টেবিলে স্যাম্প্যাম্পলড সারিগুলির সংখ্যা বাড়ার সাথে সাথে ডেটাতে আরও ফাঁক দিয়ে শেষ হয়। আমি 1 এম সারিতে 200 টি পদক্ষেপও আঘাত করি না, তবে আমি যদি সারি যুক্ত করে রাখি তবে আমি আশা করব যে আমি সেখানে পৌঁছে যাব এবং শেষ পর্যন্ত নীচে ফিরে যেতে শুরু করব।
এক্স-অক্ষটি সারণীতে সারি সংখ্যা। সারিগুলির সংখ্যা বাড়ার সাথে সাথে স্যাম্পল করা সারিগুলি কিছুটা পরিবর্তিত হয় এবং 650k এর বেশি হয় না।
এখন আসুন VARCHAR ডেটা সহ কিছু সাধারণ পরীক্ষা করি।
CREATE TABLE X_SEQ_STR (X_STR VARCHAR(5));
CREATE STATISTICS X_SEQ_STR ON X_SEQ_STR(X_STR);
এখানে আমি NULL সহ 200 টি সংখ্যা (স্ট্রিং হিসাবে) asোকাচ্ছি।
INSERT INTO X_SEQ_STR
SELECT N FROM dbo.GetNums(200)
UNION ALL
SELECT NULL;
UPDATE STATISTICS X_SEQ_STR X_SEQ_STR ;
DBCC SHOW_STATISTICS ('X_SEQ_STR', 'X_SEQ_STR'); -- 111 steps, RANGE_ROWS is 0 or 1 for all steps
নোট করুন যে টেবিলটিতে পাওয়া গেলে NUL সর্বদা তার নিজস্ব হিস্টগ্রাম পদক্ষেপ পায়। এসকিউএল সার্ভার আমাকে সমস্ত তথ্য সংরক্ষণের জন্য ঠিক 201 পদক্ষেপ দিতে পারত কিন্তু এটি তা করেনি। প্রযুক্তিগতভাবে তথ্য হারিয়ে গেছে কারণ উদাহরণস্বরূপ '1111' '1' এবং '2' এর মধ্যে বাছাই করে।
এখন কেবল পূর্ণসংখ্যার পরিবর্তে বিভিন্ন অক্ষর সন্নিবেশ করার চেষ্টা করা যাক:
truncate table X_SEQ_STR;
INSERT INTO X_SEQ_STR
SELECT CHAR(10 + N) FROM dbo.GetNums(200)
UNION ALL
SELECT NULL;
UPDATE STATISTICS X_SEQ_STR X_SEQ_STR ;
DBCC SHOW_STATISTICS ('X_SEQ_STR', 'X_SEQ_STR'); -- 95 steps, RANGE_ROWS is 0 or 1 or 2
শেষ পরীক্ষা থেকে কোন বাস্তব পার্থক্য।
এখন আসুন অক্ষরগুলি সন্নিবেশ করানোর চেষ্টা করি তবে প্রতিটি অক্ষরের আলাদা আলাদা সংখ্যা টেবিলের মধ্যে রেখে দেওয়া হয়। উদাহরণস্বরূপ, CHAR(11)
1 টি সারি রয়েছে, CHAR(12)
2 টি সারি রয়েছে etc.
truncate table X_SEQ_STR;
DECLARE
@loop_num INT;
BEGIN
SET NOCOUNT ON;
SET @loop_num = 0;
WHILE @loop_num < 200
BEGIN
SET @loop_num = @loop_num + 1;
INSERT INTO X_SEQ_STR WITH (TABLOCK)
SELECT CHAR(10 + @loop_num) FROM dbo.GetNums(@loop_num);
END;
END;
UPDATE STATISTICS X_SEQ_STR X_SEQ_STR ;
DBCC SHOW_STATISTICS ('X_SEQ_STR', 'X_SEQ_STR'); -- 148 steps, most with RANGE_ROWS of 0
আগের মতো আমি এখনও 200 হিস্টগ্রাম ধাপ পাচ্ছি না। যাইহোক, অনেক ধাপে RANGE_ROWS
0 রয়েছে।
চূড়ান্ত পরীক্ষার জন্য, আমি প্রতিটি লুপে 5 টি অক্ষরের এলোমেলো স্ট্রিং inোকাতে যাচ্ছি এবং প্রতিবারের পরিসংখ্যান সংগ্রহ করব। এখানে কোডটি এলোমেলো স্ট্রিং:
char((rand()*25 + 65))+char((rand()*25 + 65))+char((rand()*25 + 65))+char((rand()*25 + 65))+char((rand()*25 + 65))
টেবিল বনাম হিস্টোগ্রাম পদক্ষেপে সারিগুলির গ্রাফটি এখানে রয়েছে:
নোট করুন যে একবার উপরে ও নীচে যেতে শুরু করলে পদক্ষেপের সংখ্যা 100 এর নিচে নেমে যায় না। আমি কোথাও থেকে শুনেছি (তবে এখনই এটি উত্স করতে পারছি না) যে এসকিউএল সার্ভার হিস্টগ্রাম বিল্ডিং অ্যালগরিদম হিস্টোগ্রামের পদক্ষেপগুলিকে একত্রিত করে এটির জায়গাটি শেষ হয়ে যায়। সুতরাং আপনি কেবলমাত্র অল্প ডেটা যুক্ত করে পদক্ষেপের সংখ্যায় গুরুতর পরিবর্তনগুলি দিয়ে শেষ করতে পারেন। আমি আকর্ষণীয় বলে মনে করেছি তথ্য একটি নমুনা এখানে:
ROWS_IN_TABLE ROWS_SAMPLED STEPS
36661 36661 133
36662 36662 143
36663 36663 143
36664 36664 141
36665 36665 138
এমনকি যখন নমুনা দেওয়ার সাথে সাথে FULLSCAN
, একটি একক সারি যোগ করা 10 টি পদক্ষেপের সংখ্যা বাড়িয়ে দিতে পারে, ধ্রুবক বজায় রাখতে পারে, তারপরে এটি 2 দ্বারা হ্রাস করে, তারপর এটি 3 দ্বারা হ্রাস করে।
আমরা এই সমস্ত থেকে সংক্ষিপ্ত বিবরণ করতে পারেন? আমি এর কোনটি প্রমাণ করতে পারি না, তবে এই পর্যবেক্ষণগুলি সত্য বলে মনে হচ্ছে:
- এসকিউএল সার্ভার হিস্টোগ্রামগুলি তৈরি করতে একটি সাধারণ ব্যবহার অ্যালগরিদম ব্যবহার করে। কিছু ডেটা বিতরণের জন্য হাতে হাতে ডেটার আরও সম্পূর্ণ উপস্থাপনা তৈরি করা সম্ভব হতে পারে।
- যদি সারণীতে নুল তথ্য থাকে এবং পরিসংখ্যানের কোয়েরিটি খুঁজে পায় তবে নুল ডেটা সর্বদা তার নিজস্ব হিস্টোগ্রাম পদক্ষেপ পায়।
- সারণীতে পাওয়া ন্যূনতম মানটি তার সাথে তার নিজের হিস্টগ্রাম ধাপটি
RANGE_ROWS
= 0 দিয়ে পেয়েছে ।
- সারণীতে সর্বাধিক মানটি সারণীতে চূড়ান্ত হবে
RANGE_HI_KEY
।
- এসকিউএল সার্ভার যেমন আরও ডেটা নমুনা করে এটি নতুন ডেটার সন্ধান করে এটির জন্য জায়গা তৈরি করার জন্য বিদ্যমান পদক্ষেপগুলি একত্রিত করার প্রয়োজন হতে পারে। যদি আপনি পর্যাপ্ত হিস্টোগ্রামগুলি দেখেন তবে দেখতে পাবেন সাধারণ মানগুলি আবার
DISTINCT_RANGE_ROWS
বা এর জন্য পুনরাবৃত্তি RANGE_ROWS
। উদাহরণস্বরূপ, 255 এখানে চূড়ান্ত পরীক্ষার মামলার জন্য RANGE_ROWS
এবং এর DISTINCT_RANGE_ROWS
জন্য একগুচ্ছ সময় দেখায় ।
- সাধারণ ডেটা বিতরণের জন্য আপনি দেখতে পাবেন যে এসকিউএল সার্ভার একটি হিস্টগ্রাম ধাপে অনুক্রমিক ডেটা একত্রিত করে যা কোনও তথ্যের ক্ষতির কারণ হয় না। তবে ডেটাতে ফাঁক যোগ করার সময় হিস্টোগ্রাম আপনার আশানুরূপে সামঞ্জস্য হতে পারে না।
এই সব যখন সমস্যা? কোস্টি অপ্টিমাইজারকে ভাল সিদ্ধান্ত নিতে কোনও উপায়ে ডেটা বিতরণকে উপস্থাপন করতে অক্ষম এমন কোনও হিস্টোগারের কারণে যখন কোয়েরিটি খারাপভাবে সম্পাদন করে তখন এটি একটি সমস্যা। আমি মনে করি যে এই ভাবার প্রবণতা রয়েছে যে আরও বেশি হিস্টোগ্রাম পদক্ষেপ নেওয়া সবসময়ই ভাল এবং সেখানে কনসেন্টেশন হওয়ার জন্য যখন এসকিউএল সার্ভার লক্ষ লক্ষ সারি বা তারও বেশি একটি হিস্টোগ্রাম উত্পন্ন করে তবে 200 বা 201 হিস্টগ্রাম পদক্ষেপগুলি ব্যবহার করে না। যাইহোক, আমি হিস্টোগ্রামে 200 বা 201 পদক্ষেপ থাকা সত্ত্বেও প্রচুর পরিসংখ্যানের সমস্যা দেখেছি। এসকিউএল সার্ভার যে পরিসংখ্যান সামগ্রীর জন্য উত্পন্ন করে তাতে হিস্টগ্রামের কতগুলি পদক্ষেপ রয়েছে সে সম্পর্কে আমাদের কোনও নিয়ন্ত্রণ নেই তাই আমি এটি নিয়ে চিন্তা করব না। তবে, কিছু পরিসংখ্যান রয়েছে যা আপনি যখন পরিসংখ্যান সমস্যার কারণে খারাপ পারফরম্যান্স প্রশ্নের সম্মুখীন হন আপনি নিতে পারেন। আমি একটি অত্যন্ত সংক্ষিপ্ত বিবরণ দেব।
পরিসংখ্যান পূর্ণ সংগ্রহ কিছু ক্ষেত্রে সহায়তা করতে পারে। খুব বড় টেবিলের জন্য অটো নমুনার আকার টেবিলের সারিগুলির 1% এর কম হতে পারে। কখনও কখনও এটি কলামে ডেটা বিঘ্নিত উপর নির্ভর করে খারাপ পরিকল্পনা হতে পারে। ক্রিয়েট স্ট্যাটিকস এবং আপডেট আপডেটের স্ট্যাটিক্সের জন্য মাইক্রোসফ্টসের ডকুমেন্টেশন যতটা বলেছে:
স্যাম্পল বিশেষ ক্ষেত্রে ক্ষেত্রে দরকারী যেখানে ডিফল্ট নমুনার ভিত্তিতে কোয়েরি প্ল্যানটি অনুকূল নয়। বেশিরভাগ পরিস্থিতিতে, স্যাম্পলটি নির্দিষ্ট করা প্রয়োজন হয় না কারণ কোয়েরি অপ্টিমাইজার ইতিমধ্যে নমুনা ব্যবহার করে এবং উচ্চ-মানের ক্যোয়ারী প্ল্যানগুলি তৈরি করার জন্য ডিফল্টরূপে পরিসংখ্যানগতভাবে উল্লেখযোগ্য নমুনার আকার নির্ধারণ করে।
বেশিরভাগ কাজের চাপের জন্য, একটি পূর্ণ স্ক্যানের প্রয়োজন হয় না এবং ডিফল্ট স্যাম্পলিং যথেষ্ট। যাইহোক, কিছু নির্দিষ্ট কাজের চাপ যা বিভিন্নভাবে ডেটা বিতরণের জন্য সংবেদনশীল হয় তাদের বর্ধিত নমুনার আকার বা এমনকি একটি সম্পূর্ণ স্ক্যানের প্রয়োজন হতে পারে।
কিছু ক্ষেত্রে ফিল্টার পরিসংখ্যান তৈরি করা সহায়তা করতে পারে। স্কিউ ডেটা এবং বিভিন্ন আলাদা আলাদা মান সহ আপনার কলাম থাকতে পারে। যদি ডেটাতে কিছু নির্দিষ্ট মান থাকে যা সাধারণত আপনি ফিল্টার করা হয় তবে আপনি কেবল সেই সাধারণ মানের জন্য একটি পরিসংখ্যান হিস্টোগ্রাম তৈরি করতে পারেন। ক্যোয়ারী অপ্টিমাইজার সমস্ত কলাম মানগুলিতে সংজ্ঞায়িত পরিসংখ্যানগুলির পরিবর্তে ডেটার একটি ছোট পরিসীমাতে সংজ্ঞায়িত পরিসংখ্যানগুলি ব্যবহার করতে পারে। আপনি এখনও হিস্টোগ্রামে 200 পদক্ষেপ পাওয়ার গ্যারান্টিযুক্ত নন তবে আপনি যদি কেবলমাত্র একটি মানের উপর ফিল্টার করা পরিসংখ্যান তৈরি করেন তবে আপনি হিস্টগ্রাম সেই মানটি ধাপে পরিণত করতে পারবেন।
একটি টেবিলের জন্য 200 টিরও বেশি ধাপে কার্যকরভাবে পার্টিশনযুক্ত ভিউ ব্যবহার করা way মনে করুন যে আপনি সহজেই প্রতি বছর একটি টেবিলের মধ্যে একটি বড় টেবিল বিভক্ত করতে পারেন। আপনি এমন একটি UNION ALL
ভিউ তৈরি করেন যা বার্ষিক সারণীর সমস্তগুলিকে একত্রিত করে। প্রতিটি টেবিলের নিজস্ব হিস্টোগ্রাম থাকবে। নোট করুন যে এসকিউএল সার্ভার ২০১৪ সালে নতুন নতুন বর্ধিত পরিসংখ্যানগুলি কেবল পরিসংখ্যান আপডেটগুলি আরও কার্যকর হতে দেয়। ক্যোয়ারী অপ্টিমাইজারটি পার্টিশন অনুযায়ী তৈরি করা পরিসংখ্যান ব্যবহার করবে না।
এখানে আরও অনেক পরীক্ষা চালানো যেতে পারে, তাই আমি আপনাকে পরীক্ষায় উত্সাহিত করি। আমি এসকিউএল সার্ভার 2014 এক্সপ্রেসে এই পরীক্ষাটি করেছিলাম তাই সত্যিই আপনাকে থামানোর কোন কিছুই নেই।