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


14

আমার একটি অ্যাপ্লিকেশন রয়েছে যা একটি এসকিউএল সার্ভার ২০০৮ ডাটাবেসে লক্ষ লক্ষ টেবিল তৈরি করে (নন ক্লাস্টারড)। আমি এসকিউএল সার্ভার ২০১৪ (ক্লাস্টারড) এ আপগ্রেড করতে চাইছি, তবে লোডের মধ্যে থাকা অবস্থায় একটি ত্রুটি বার্তাটি আঘাত করছি:

"ডাটাবেসে ইতিমধ্যে 'PK__tablenameprefix__179E2ED8F259C33B' নামে একটি অবজেক্ট রয়েছে"

এটি একটি সিস্টেম উত্পন্ন সীমাবদ্ধ নাম। এটি এলোমেলোভাবে উত্পন্ন 64-বিট সংখ্যার মতো দেখাচ্ছে। টেবিলের বিশাল সংখ্যার কারণে আমি কী সংঘর্ষগুলি দেখছি তা সম্ভব? ধরে নিলাম আমার 100 মিলিয়ন টেবিল রয়েছে, আমি পরের টেবিলটি যুক্ত করার সময় সংঘর্ষের 1-ইন-1-ট্রিলিয়ন সম্ভাবনার চেয়ে কম গণনা করি, তবে এটি অভিন্ন বিতরণ হিসাবে ধরে নিয়েছে। সংঘর্ষের প্রতিক্রিয়া বাড়াতে এসকিউএল সার্ভার তার নাম প্রজন্মের অ্যালগরিদম 2008 এবং 2014 এর মধ্যে পরিবর্তন করেছে?

অন্যান্য উল্লেখযোগ্য পার্থক্যটি হ'ল আমার 2014 উদাহরণটি একটি ক্লাস্টারযুক্ত জোড়, তবে কেন এটি উপরের ত্রুটিটি সৃষ্টি করবে তা নিয়ে আমি একটি হাইপোথিসিস গঠনের জন্য সংগ্রাম করছি।

পিএস হ্যাঁ, আমি জানি লক্ষ লক্ষ টেবিল তৈরি করা উন্মাদ। এটি ব্ল্যাক বক্স 3 য় পক্ষের কোড যার উপর আমার কোনও নিয়ন্ত্রণ নেই। উন্মাদতা সত্ত্বেও, এটি ২০০৮ সংস্করণে কাজ করেছে এবং এখন ২০১৪ সংস্করণে নেই।

সম্পাদনা করুন: কাছাকাছি পরিদর্শন করার পরে, উত্পাদিত প্রত্যয়টি সর্বদা 179E2ED8 দিয়ে শুরু হবে বলে মনে হয় - এর অর্থ এলোমেলো অংশটি কেবলমাত্র একটি 32-বিট সংখ্যা এবং সংঘর্ষের প্রতিক্রিয়াগুলি প্রতিবার একটি নতুন টেবিল যুক্ত হওয়ার পরে কেবল 1-ইন-50 হয়, যা আমি যে ত্রুটি হারটি দেখছি তার সাথে অনেক বেশি মিল!


টেবিলের নামগুলি আলাদা তবে তারা নামকরণের কনভেনশন ব্যবহার করে যার ফলস্বরূপ কমপক্ষে প্রথম 11 টি অক্ষর একই হয় এবং এটি মনে হয় যে সমস্ত এসকিউএল সার্ভার সীমাবদ্ধ নাম তৈরি করতে ব্যবহার করে।
jl6

অন্তর্নিহিত হার্ডওয়্যার পৃথক (ডিএল 380 এর নতুন প্রজন্ম) তবে উচ্চতর পারফরম্যান্স নয়। অনুশীলনের লক্ষ্য হ'ল সমর্থনের আউটপুট এসকিউএল সার্ভার ২০০৮ প্রতিস্থাপন করা, থ্রুপুট উন্নত করা নয় এবং সেই অনুযায়ী হার্ডওয়্যারটি সরবরাহ করা হয়েছে।
jl6

উত্তর:


16

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

এটি এসকিউএল সার্ভারের বাধা এবং সংস্করণের ধরণের উপর নির্ভর করে।

CREATE TABLE T1
(
A INT PRIMARY KEY CHECK (A > 0),
B INT DEFAULT -1 REFERENCES T1,
C INT UNIQUE,
CHECK (C > A)
)

SELECT name, 
       object_id, 
       CAST(object_id AS binary(4)) as object_id_hex,
       CAST(CASE WHEN object_id >= 16000057  THEN object_id -16000057 ELSE object_id +2131483591 END AS BINARY(4)) AS object_id_offset_hex
FROM sys.objects
WHERE parent_object_id = OBJECT_ID('T1')
ORDER BY name;

drop table T1

উদাহরণ ফলাফল 2008

+--------------------------+-----------+---------------+----------------------+
|           name           | object_id | object_id_hex | object_id_offset_hex |
+--------------------------+-----------+---------------+----------------------+
| CK__T1__1D498357         | 491357015 | 0x1D498357    | 0x1C555F1E           |
| CK__T1__A__1A6D16AC      | 443356844 | 0x1A6D16AC    | 0x1978F273           |
| DF__T1__B__1B613AE5      | 459356901 | 0x1B613AE5    | 0x1A6D16AC           |
| FK__T1__B__1C555F1E      | 475356958 | 0x1C555F1E    | 0x1B613AE5           |
| PK__T1__3BD019AE15A8618F | 379356616 | 0x169C85C8    | 0x15A8618F           |
| UQ__T1__3BD019A91884CE3A | 427356787 | 0x1978F273    | 0x1884CE3A           |
+--------------------------+-----------+---------------+----------------------+

উদাহরণস্বরূপ ফলাফল 2017

+--------------------------+------------+---------------+----------------------+
|           name           | object_id  | object_id_hex | object_id_offset_hex |
+--------------------------+------------+---------------+----------------------+
| CK__T1__59FA5E80         | 1509580416 | 0x59FA5E80    | 0x59063A47           |
| CK__T1__A__571DF1D5      | 1461580245 | 0x571DF1D5    | 0x5629CD9C           |
| DF__T1__B__5812160E      | 1477580302 | 0x5812160E    | 0x571DF1D5           |
| FK__T1__B__59063A47      | 1493580359 | 0x59063A47    | 0x5812160E           |
| PK__T1__3BD019AE0A4A6932 | 1429580131 | 0x5535A963    | 0x5441852A           |
| UQ__T1__3BD019A981F522E0 | 1445580188 | 0x5629CD9C    | 0x5535A963           |
+--------------------------+------------+---------------+----------------------+

ডিফল্ট সীমাবদ্ধতার জন্য, চেক সীমাবদ্ধতা এবং বিদেশী কী বাধাগুলি স্বয়ংক্রিয়ভাবে উত্পাদিত নামের শেষ 4 বাইট হ'ল সীমাবদ্ধতার আপত্তিজনক একটি হেক্সাডেসিমাল সংস্করণ। objectidগ্যারান্টিযুক্ত অনন্য হিসাবে নামটিও অনন্য হতে হবে। সাইবাসেও এই ব্যবহারtabname_colname_objectid

অনন্য বাধা এবং প্রাথমিক কী সীমাবদ্ধতার জন্য সায়ব্যাস ব্যবহার করে

tabname_colname_tabindid, যেখানে tabindid হ'ল টেবিল আইডি এবং সূচক ID এর একটি স্ট্রিং সংমিশ্রণ

এটিও স্বতন্ত্রতার গ্যারান্টি দেবে।

এসকিউএল সার্ভার এই স্কিমটি ব্যবহার করে না।

এসকিউএল সার্ভার ২০০৮ এবং 2017 উভয় ক্ষেত্রে এটি সিস্টেম উত্পন্ন নামের শেষে একটি 8 বাইট স্ট্রিং ব্যবহার করে তবে অ্যালগরিদম কীভাবে তার শেষ 4 বাইট তৈরি হয় তা পরিবর্তন হয়েছে।

২০০৮ সালে সর্বশেষ চারটি বাইট একটি স্বাক্ষরিত পূর্ণসংখ্যার কাউন্টারকে উপস্থাপন করে যা সর্বাধিক স্বাক্ষরিত আন্তকে ঘিরে কোনও নেতিবাচক মান দিয়ে অফসেট object_idকরে -16000057। (এর তাত্পর্যটি 16000057হ'ল এটি ক্রমবর্ধমান তৈরির মধ্যে প্রয়োগ হওয়া ইনক্রিমেন্টobject_id )। এটি এখনও স্বতন্ত্রতার গ্যারান্টি দেয়।

২০১২-এর উপরে আমি সীমাবদ্ধ ইন্টের হেক্সাডেসিমাল উপস্থাপনা হিসাবে নামের শেষ ৮ টি অক্ষরকে চিকিত্সা করে বাধাটির অবজেক্ট_আইডি এবং পূর্ণসংখ্যার মধ্যে কোনও প্যাটার্ন দেখতে পাচ্ছি না।

২০১৩ সালে কল স্ট্যাকের ফাংশনের নামগুলি দেখায় যে এটি এখন নাম উত্পন্নকরণ প্রক্রিয়ার অংশ হিসাবে একটি জিইউডি তৈরি করে (২০০৮-এ আমি এর কোনও উল্লেখ পাই না MDConstraintNameGenerator)। আমার ধারণা এটি এলোমেলোভাবে কিছু উত্স প্রদান করে। স্পষ্টতই এটি জিআইডি থেকে পুরো 16 বাইট ব্যবহার করছে না যে 4 বাইট যা সীমাবদ্ধতার মধ্যে পরিবর্তন করে।

লিঙ্ক বিবরণ এখানে প্রবেশ করুন

আমি মনে করি যে নতুন অ্যালগরিদমটি দক্ষতার কারণে আপনার নিজের মতো চরম ক্ষেত্রে সংঘর্ষের সম্ভাবনা বাড়ার ব্যয় করে করা হয়েছিল।

এটি বেশ একটি প্যাথলজিকাল কেস কারণ এটি পিকে টেবিলের নাম উপসর্গ এবং কলামের নাম প্রয়োজন (ইনফার হিসাবে এটি চূড়ান্ত 8 এর আগের 8 টি অক্ষরকে প্রভাবিত করে) এটি কয়েক হাজার টেবিলের সম্ভাব্য হওয়ার আগেই অভিন্ন হতে পারে তবে বেশ পুনরুত্পাদন করা যেতে পারে সহজেই নীচের সাথে।

CREATE OR ALTER PROC #P
AS
    SET NOCOUNT ON;

    DECLARE @I INT = 0;


    WHILE 1 = 1
      BEGIN
          EXEC ('CREATE TABLE abcdefghijklmnopqrstuvwxyz' + @I + '(C INT PRIMARY KEY)');
          SET @I +=1;
      END 

GO

EXEC #P

নতুন তৈরি করা ডাটাবেসের বিরুদ্ধে এসকিউএল সার্ভার 2017 তে চালানো একটি উদাহরণ মাত্র এক মিনিটের মধ্যে ব্যর্থ হয়েছে (50,931 টেবিল তৈরি হওয়ার পরে)

এমএসজি 2714, স্তর 16, রাজ্য 30, লাইন 15 ইতিমধ্যে ডাটাবেসে 'PK__abcdefgh__3BD019A8175067CE' নামে একটি অবজেক্ট রয়েছে। এমএসজি 1750, স্তর 16, রাজ্য 1, লাইন 15 সীমাবদ্ধতা বা সূচক তৈরি করতে পারেনি। পূর্ববর্তী ত্রুটিগুলি দেখুন।


11

ধরে নিলাম আমার 100 মিলিয়ন টেবিল রয়েছে, আমি সংঘর্ষের 1-ইন-1-ট্রিলিয়ন সম্ভাবনার চেয়ে কম গণনা করি

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

এন টেবিলের সাথে, সেখানে এন * (এন -1) / 2 জোড়া রয়েছে, সুতরাং এখানে প্রায় 10 16 জোড়া। সংঘর্ষের সম্ভাবনা যদি 2 -64 হয় তবে একক জোড়া সংঘর্ষ না হওয়ার সম্ভাবনা 1-2 -64 হয় , তবে এতগুলি জোড়ের সাথে এখানে কোনও সংঘর্ষ না হওয়ার সম্ভাবনা প্রায় (1-2 -64 ) 10 16 , বা আরও 1 / 10,000 এর মতো। উদাহরণস্বরূপ https://preshing.com/20110504/hash-collision-probables/ দেখুন

এবং যদি এটি কেবলমাত্র 32 বিট হ্যাশ হয় তবে কোনও সংঘর্ষের সম্ভাবনাটি কেবল 77k মানগুলিতে 1/2 অতিক্রম করে।


2
কোনও সংঘর্ষের মুখোমুখি না হয়ে প্রথম স্থানে 77K মান অর্জন করা সম্ভবত বেশ অসম্ভব কারণ এর আগে আপনার পূর্ববর্তী সমস্ত সৃষ্টির জন্য আপনার ভাগ্যবান হওয়া দরকার। আমি বিস্মিত হচ্ছি যে বিন্দুটি যেখানে সংঘর্ষের সংশ্লেষের সম্ভাবনা 50% পৌঁছেছে
মার্টিন স্মিথ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.