কেন ডেনালি সিকোয়েন্সগুলি পরিচয় কলামগুলির চেয়ে আরও ভাল পারফর্ম করার কথা?


36

তার উত্তরে কোনটি ভাল: পরিচয় কলাম বা অনন্য আইডি মান উত্পন্ন? মর্ডেনি বলেছেন:

এসকিউএল ডেনালি বের হয়ে এলে এটি এমন সিকোয়েন্সগুলিকে সমর্থন করবে যা পরিচয়ের চেয়ে আরও কার্যকর হবে, তবে আপনি নিজেকে আরও দক্ষ কিছু তৈরি করতে পারবেন না।

আমি পুরপুরি নিশ্চিত নই. ওরাকেলের ক্রমগুলি জেনে , আমাকে হয় সন্নিবেশের জন্য একটি ট্রিগার তৈরি করতে হবে, প্রতিটি সন্নিবেশকে একটি সঞ্চিত পদ্ধতির কলটিতে আবদ্ধ করতে হবে বা প্রার্থনা করুন যে আমি যখন অ্যাড-হক সন্নিবেশ করি তখন সিকোয়েন্সটি সঠিকভাবে ব্যবহার করতে ভুলে যাব না।

আমি সন্দেহ করি যে ক্রমগুলির সুবিধাগুলি এত সুস্পষ্ট।


2
আমি জানি এটি আপনার প্রশ্নের উত্তর দেয় না তবে কোনও পারফরম্যান্সের পার্থক্য বাদ দিয়ে সিকোয়েন্সগুলির অন্যান্য সুবিধা রয়েছে। উদাহরণস্বরূপ একটি সিকোয়েন্স আপনাকে লক্ষ্য কলামটি আপডেট করা থামিয়ে দেয় না, যা পরিচয়ের খুব অসুবিধাজনক সীমাবদ্ধতা।
এনভোভেল

উত্তর:


37

আমি এখানেও উত্তর দেব। এটি কীভাবে IDENTITYএবং কীভাবে SEQUENCEকাজ করে তার ইন্টার্নালগুলির সাথে সম্পর্কিত ।

এর সাথে IDENTITY, এসকিউএল সার্ভারটি মেমরিতে প্রাক-ক্যাশ করে যাতে সেগুলি সহজেই উপলব্ধ। বিস্তারিত জানতে মার্টিন স্মিথের উত্তর দেখুন। মানগুলি ব্যবহার করার সাথে সাথে একটি পটভূমি প্রক্রিয়া আরও মান উত্পন্ন করে। যেমন আপনি কল্পনা করতে পারেন এই পুলটি খুব দ্রুত সঞ্চালিত হতে পারে, অ্যাপ্লিকেশনটিকে মানগুলি উত্পন্ন করার ক্ষেত্রে ব্যাকগ্রাউন্ড প্রক্রিয়াটির করুণায় রেখে।

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

ক্যাশে খুব বেশি সেট করবেন না, কারণ এটি ব্যবহার করা যেতে পারে এমন সংখ্যাগুলিকে হ্রাস করবে: যদি এসকিউএল সার্ভার ক্র্যাশ হয়, তবে বর্তমান ক্যাশে পরিসরে নির্দিষ্ট যে মানগুলি ব্যবহৃত হয়নি তা হারিয়ে যাবে।

সারি সন্নিবেশ হিসাবে, কলামের জন্য কেবল একটি ডিফল্ট মান নির্দিষ্ট করুন:

DEFAULT (NEXT VALUE FOR Audit.EventCounter),

21

যেহেতু ইটজিক বেন গণ নিবন্ধটি 10 এর হার্ডকোডযুক্ত ক্যাশে আকারে লেখা হয়েছিল IDENTITYবলে মনে হয় এটি পরিবর্তন করা হয়েছে। এই সংযুক্ত আইটেমের মন্তব্যগুলি থেকে

প্রাক বরাদ্দকরণের আকারটি কলামের ডেটা ধরণের আকারের উপর ভিত্তি করে পরিচয় সম্পত্তিটি সংজ্ঞায়িত করা হয়। একটি এসকিউএল সার্ভার পূর্ণসংখ্যা কলামের জন্য, সার্ভারটি 1000 টির মানগুলির মধ্যে পূর্বনির্ধারিত পরিচয় দেয়। বিগিন্ট ডেটা টাইপ করার জন্য সার্ভারটি 10000 মানের ব্যাপ্তিতে প্রাক-বরাদ্দ করে।

টি-এসকিউএল অনুসন্ধান বই নিম্নলিখিত টেবিলে রয়েছে কিন্তু জোর দিয়েছেন যে এই মান নথিভুক্ত বা অপরিবর্তিত হতে নিশ্চিত করা হয় না।

+-----------------+-----------+
|    DataType     | CacheSize |
+-----------------+-----------+
| TinyInt         | 10        |
| SmallInt        | 100       |
| Int             | 1,000     |
| BigInt, Numeric | 10,000    |
+-----------------+-----------+

এখানে নিবন্ধটি বিভিন্ন ক্রম ক্যাশে মাপ পরীক্ষা করে এবং ব্যাচের আকার সন্নিবেশ করে এবং নিম্নলিখিত ফলাফলগুলি নিয়ে আসে।

এখানে চিত্র বর্ণনা লিখুন

যা প্রদর্শিত বড় আকারের সন্নিবেশ IDENTITYসম্পাদন করে বলে মনে হয় SEQUENCE। এটি ক্যাশে আকারের 1000 পরীক্ষা করে না তবে ফলাফলগুলি কেবল একটি পরীক্ষা। বিভিন্ন ব্যাচের আকারের সন্নিবেশের সাহায্যে ক্যাশে আকার 1000-এ বিশেষভাবে তাকিয়ে আমি নিম্নলিখিত ফলাফল পেয়েছি (প্রতিটি ব্যাচের আকার 50 বার চেষ্টা করে ফলাফলগুলি নীচে হিসাবে একত্রিত করছি - সর্বকালে μs।)

+------------+-----------+-----------+-----------+-----------+-----------+-----------+
|            |             Sequence              |             Identity              |
| Batch Size |    Min    |    Max    |    Avg    |    Min    |    Max    |    Avg    |
+------------+-----------+-----------+-----------+-----------+-----------+-----------+
| 10         | 2,994     | 7,004     | 4,002     | 3,001     | 7,005     | 4,022     |
| 100        | 3,997     | 5,005     | 4,218     | 4,001     | 5,010     | 4,238     |
| 1,000      | 6,001     | 19,013    | 7,221     | 5,982     | 8,006     | 6,709     |
| 10,000     | 26,999    | 33,022    | 28,645    | 24,015    | 34,022    | 26,114    |
| 100,000    | 189,126   | 293,340   | 205,968   | 165,109   | 234,156   | 173,391   |
| 1,000,000  | 2,208,952 | 2,344,689 | 2,269,297 | 2,058,377 | 2,191,465 | 2,098,552 |
+------------+-----------+-----------+-----------+-----------+-----------+-----------+

বৃহত্তর ব্যাচের আকারের জন্য IDENTITYসংস্করণটি সাধারণত দ্রুত বলে মনে হয় ।

টিএসকিউএল ক্যোয়ারিং বইটিও ব্যাখ্যা করে যে IDENTITYক্রমগুলির চেয়ে পারফরম্যান্স সুবিধা কেন হতে পারে।

IDENTITYটেবিল নির্দিষ্ট এবং SEQUENCEনয়। লগ বাফারটি ফ্লাশ করার আগে যদি বিপর্যয় মাঝামাঝি strikeোকানো হত তবে পুনরুদ্ধার প্রক্রিয়াটি আগের সারণি হিসাবে পুনরুদ্ধার প্রক্রিয়াটিও সন্নিবেশটিকে পূর্বাবস্থায় ফেরাতে পারে তা বিবেচনা করে না, সুতরাং এসকিউএল সার্ভার প্রতিটি পরিচয়টিতে লগ বাফারটিকে ফ্লাশ করার জন্য জোর করে না ক্যাশে সম্পর্কিত ডিস্ক লিখুন। তবে সিকোয়েন্সের জন্য এটি প্রয়োগ করা হয়েছে কারণ মানটি কোনও উদ্দেশ্যেই ব্যবহার করা যেতে পারে - ডাটাবেসের বাইরেও। সুতরাং উপরের উদাহরণে এক মিলিয়ন সন্নিবেশ এবং 1,000 এর ক্যাশে আকার এটি একটি অতিরিক্ত হাজার লগ ফ্লাশ hes

পুনরুত্পাদন করার জন্য স্ক্রিপ্ট

DECLARE @Results TABLE(
  BatchCounter INT,
  NumRows      INT,
  SequenceTime BIGINT,
  IdTime       BIGINT);

DECLARE @NumRows      INT = 10,
        @BatchCounter INT;

WHILE @NumRows <= 1000000
  BEGIN
      SET @BatchCounter = 0;

      WHILE @BatchCounter <= 50
        BEGIN
            --Do inserts using Sequence
            DECLARE @SequenceTimeStart DATETIME2(7) = SYSUTCDATETIME();

            INSERT INTO dbo.t1_Seq1_cache_1000
                        (c1)
            SELECT N
            FROM   [dbo].[TallyTable] (@NumRows)
            OPTION (RECOMPILE);

            DECLARE @SequenceTimeEnd DATETIME2(7) = SYSUTCDATETIME();
            --Do inserts using IDENTITY
            DECLARE @IdTimeStart DATETIME2(7) = SYSUTCDATETIME();

            INSERT INTO dbo.t1_identity
                        (c1)
            SELECT N
            FROM   [dbo].[TallyTable] (@NumRows)
            OPTION (RECOMPILE);

            DECLARE @IdTimeEnd DATETIME2(7) = SYSUTCDATETIME();

            INSERT INTO @Results
            SELECT @BatchCounter,
                   @NumRows,
                   DATEDIFF(MICROSECOND, @SequenceTimeStart, @SequenceTimeEnd) AS SequenceTime,
                   DATEDIFF(MICROSECOND, @IdTimeStart, @IdTimeEnd)             AS IdTime;

            TRUNCATE TABLE dbo.t1_identity;

            TRUNCATE TABLE dbo.t1_Seq1_cache_1000;

            SET @BatchCounter +=1;
        END

      SET @NumRows *= 10;
  END

SELECT NumRows,
       MIN(SequenceTime) AS MinSequenceTime,
       MAX(SequenceTime) AS MaxSequenceTime,
       AVG(SequenceTime) AS AvgSequenceTime,
       MIN(IdTime)       AS MinIdentityTime,
       MAX(IdTime)       AS MaxIdentityTime,
       AVG(IdTime)       AS AvgIdentityTime
FROM   @Results
GROUP  BY NumRows;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.