পরিসংখ্যানগুলিতে হিস্টোগ্রাম পদক্ষেপের সংখ্যা কীভাবে নির্ধারিত হয়


11

এসকিউএল সার্ভারের পরিসংখ্যানগুলিতে হিস্টগ্রামের পদক্ষেপগুলির সংখ্যা কীভাবে নির্ধারণ করা হয়?

যদিও আমার মূল কলামে 200 এরও বেশি স্বতন্ত্র মান রয়েছে কেন এটি 200 টি পদক্ষেপে সীমাবদ্ধ? কোন সিদ্ধান্ত গ্রহণকারী কারণ আছে?


ডেমো

স্কিমার সংজ্ঞা

CREATE TABLE histogram_step
  (
     id   INT IDENTITY(1, 1),
     name VARCHAR(50),
     CONSTRAINT pk_histogram_step PRIMARY KEY (id)
  )

আমার টেবিলে 100 টি রেকর্ড .োকানো হচ্ছে

INSERT INTO histogram_step
            (name)
SELECT TOP 100 name
FROM   sys.syscolumns

পরিসংখ্যান আপডেট করা এবং পরীক্ষা করা

UPDATE STATISTICS histogram_step WITH fullscan

DBCC show_statistics('histogram_step', pk_histogram_step)

হিস্টোগ্রাম পদক্ষেপ:

+--------------+------------+---------+---------------------+----------------+
| RANGE_HI_KEY | RANGE_ROWS | EQ_ROWS | DISTINCT_RANGE_ROWS | AVG_RANGE_ROWS |
+--------------+------------+---------+---------------------+----------------+
|            1 |          0 |       1 |                   0 |              1 |
|            3 |          1 |       1 |                   1 |              1 |
|            5 |          1 |       1 |                   1 |              1 |
|            7 |          1 |       1 |                   1 |              1 |
|            9 |          1 |       1 |                   1 |              1 |
|           11 |          1 |       1 |                   1 |              1 |
|           13 |          1 |       1 |                   1 |              1 |
|           15 |          1 |       1 |                   1 |              1 |
|           17 |          1 |       1 |                   1 |              1 |
|           19 |          1 |       1 |                   1 |              1 |
|           21 |          1 |       1 |                   1 |              1 |
|           23 |          1 |       1 |                   1 |              1 |
|           25 |          1 |       1 |                   1 |              1 |
|           27 |          1 |       1 |                   1 |              1 |
|           29 |          1 |       1 |                   1 |              1 |
|           31 |          1 |       1 |                   1 |              1 |
|           33 |          1 |       1 |                   1 |              1 |
|           35 |          1 |       1 |                   1 |              1 |
|           37 |          1 |       1 |                   1 |              1 |
|           39 |          1 |       1 |                   1 |              1 |
|           41 |          1 |       1 |                   1 |              1 |
|           43 |          1 |       1 |                   1 |              1 |
|           45 |          1 |       1 |                   1 |              1 |
|           47 |          1 |       1 |                   1 |              1 |
|           49 |          1 |       1 |                   1 |              1 |
|           51 |          1 |       1 |                   1 |              1 |
|           53 |          1 |       1 |                   1 |              1 |
|           55 |          1 |       1 |                   1 |              1 |
|           57 |          1 |       1 |                   1 |              1 |
|           59 |          1 |       1 |                   1 |              1 |
|           61 |          1 |       1 |                   1 |              1 |
|           63 |          1 |       1 |                   1 |              1 |
|           65 |          1 |       1 |                   1 |              1 |
|           67 |          1 |       1 |                   1 |              1 |
|           69 |          1 |       1 |                   1 |              1 |
|           71 |          1 |       1 |                   1 |              1 |
|           73 |          1 |       1 |                   1 |              1 |
|           75 |          1 |       1 |                   1 |              1 |
|           77 |          1 |       1 |                   1 |              1 |
|           79 |          1 |       1 |                   1 |              1 |
|           81 |          1 |       1 |                   1 |              1 |
|           83 |          1 |       1 |                   1 |              1 |
|           85 |          1 |       1 |                   1 |              1 |
|           87 |          1 |       1 |                   1 |              1 |
|           89 |          1 |       1 |                   1 |              1 |
|           91 |          1 |       1 |                   1 |              1 |
|           93 |          1 |       1 |                   1 |              1 |
|           95 |          1 |       1 |                   1 |              1 |
|           97 |          1 |       1 |                   1 |              1 |
|           99 |          1 |       1 |                   1 |              1 |
|          100 |          0 |       1 |                   0 |              1 |
+--------------+------------+---------+---------------------+----------------+

আমরা দেখতে পাচ্ছি যে হিস্টোগ্রামে 53 টি পদক্ষেপ রয়েছে।

আবার কয়েক হাজার রেকর্ড .োকানো হচ্ছে

INSERT INTO histogram_step
            (name)
SELECT TOP 10000 b.name
FROM   sys.syscolumns a
       CROSS JOIN sys.syscolumns b

পরিসংখ্যান আপডেট করা এবং পরীক্ষা করা

UPDATE STATISTICS histogram_step WITH fullscan

DBCC show_statistics('histogram_step', pk_histogram_step)

এখন হিস্টগ্রামের পদক্ষেপগুলি 4 টি ধাপে হ্রাস পেয়েছে

+--------------+------------+---------+---------------------+----------------+
| RANGE_HI_KEY | RANGE_ROWS | EQ_ROWS | DISTINCT_RANGE_ROWS | AVG_RANGE_ROWS |
+--------------+------------+---------+---------------------+----------------+
|            1 |          0 |       1 |                   0 |              1 |
|        10088 |      10086 |       1 |               10086 |              1 |
|        10099 |         10 |       1 |                  10 |              1 |
|        10100 |          0 |       1 |                   0 |              1 |
+--------------+------------+---------+---------------------+----------------+

আবার কয়েক হাজার রেকর্ড .োকানো হচ্ছে

INSERT INTO histogram_step
            (name)
SELECT TOP 100000 b.name
FROM   sys.syscolumns a
       CROSS JOIN sys.syscolumns b

পরিসংখ্যান আপডেট করা এবং পরীক্ষা করা

UPDATE STATISTICS histogram_step WITH fullscan

DBCC show_statistics('histogram_step', pk_histogram_step) 

এখন হিস্টগ্রামের পদক্ষেপগুলি 3 টি ধাপে হ্রাস পেয়েছে

+--------------+------------+---------+---------------------+----------------+
| RANGE_HI_KEY | RANGE_ROWS | EQ_ROWS | DISTINCT_RANGE_ROWS | AVG_RANGE_ROWS |
+--------------+------------+---------+---------------------+----------------+
|            1 |          0 |       1 |                   0 |              1 |
|       110099 |     110097 |       1 |              110097 |              1 |
|       110100 |          0 |       1 |                   0 |              1 |
+--------------+------------+---------+---------------------+----------------+

কেউ আমাকে বলতে পারেন কীভাবে এই পদক্ষেপগুলি স্থির হয়?


3
200 একটি স্বেচ্ছাসেবী পছন্দ ছিল। নির্দিষ্ট টেবিলে আপনার কতগুলি স্বতন্ত্র মান রয়েছে তার সাথে কিছুই করার নেই। 200 টি কেন বেছে নেওয়া হয়েছে তা যদি আপনি জানতে চান তবে আপনাকে 1990 এর দশকের এসকিউএল সার্ভার টিম থেকে একজন ইঞ্জিনিয়ারকে জিজ্ঞাসা করতে হবে, আপনার সমবয়সীরা নয়
অ্যারন বার্ট্র্যান্ড

1
@ অ্যারোনবার্ট্র্যান্ড - ধন্যবাদ .. সুতরাং এই পদক্ষেপের সংখ্যা কীভাবে সিদ্ধান্ত নেওয়া হয়েছে
পি

1
কোনও সিদ্ধান্ত নেই। উপরের গণ্ডি 200. সময়কাল। ভাল, প্রযুক্তিগতভাবে, এটি 201, তবে এটি অন্য দিনের গল্প।
অ্যারন বারট্র্যান্ড

1
আমি ইন্ট্রাস্টেপ প্রাক্কলন সম্পর্কে অনুরূপ প্রশ্ন জিজ্ঞাসা করেছি, সহায়ক হতে পারে dba.stackexchange.com/questions/148523/…
jesijesi

উত্তর:


14

আমি এই পোস্টটিকে একক কলামের পরিসংখ্যান নিয়ে আলোচনার মধ্যে সীমাবদ্ধ করতে যাচ্ছি কারণ এটি ইতিমধ্যে বেশ দীর্ঘ হবে এবং এসকিউএল সার্ভার কীভাবে হিস্টোগ্রামের পদক্ষেপগুলিতে ডেটা বালতি করে তা আপনার আগ্রহী। বহু কলামের পরিসংখ্যানগুলির জন্য হিস্টোগ্রাম কেবল শীর্ষস্থানীয় কলামে তৈরি করা হয়।

যখন এসকিউএল সার্ভার নির্ধারণ করে যে কোনও পরিসংখ্যান আপডেটের প্রয়োজন হয় তখন এটি একটি গোপনীয় ক্যোয়ারিকে সরিয়ে দেয় যা কোনও টেবিলের সমস্ত ডেটা বা টেবিলের ডেটার নমুনা পড়ে 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 টি পদক্ষেপও আঘাত করি না, তবে আমি যদি সারি যুক্ত করে রাখি তবে আমি আশা করব যে আমি সেখানে পৌঁছে যাব এবং শেষ পর্যন্ত নীচে ফিরে যেতে শুরু করব।

গ্রাফ 2

এক্স-অক্ষটি সারণীতে সারি সংখ্যা। সারিগুলির সংখ্যা বাড়ার সাথে সাথে স্যাম্পল করা সারিগুলি কিছুটা পরিবর্তিত হয় এবং 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_ROWS0 রয়েছে।

চূড়ান্ত পরীক্ষার জন্য, আমি প্রতিটি লুপে 5 টি অক্ষরের এলোমেলো স্ট্রিং inোকাতে যাচ্ছি এবং প্রতিবারের পরিসংখ্যান সংগ্রহ করব। এখানে কোডটি এলোমেলো স্ট্রিং:

char((rand()*25 + 65))+char((rand()*25 + 65))+char((rand()*25 + 65))+char((rand()*25 + 65))+char((rand()*25 + 65))

টেবিল বনাম হিস্টোগ্রাম পদক্ষেপে সারিগুলির গ্রাফটি এখানে রয়েছে: গ্রাফ 3

নোট করুন যে একবার উপরে ও নীচে যেতে শুরু করলে পদক্ষেপের সংখ্যা 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 এক্সপ্রেসে এই পরীক্ষাটি করেছিলাম তাই সত্যিই আপনাকে থামানোর কোন কিছুই নেই।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.