আমি একটি ওয়েব অ্যাপ্লিকেশন (প্রজেক্ট ম্যানেজমেন্ট সিস্টেম) তৈরি করছি এবং এটি যখন পারফরম্যান্সে আসে তখন আমি ভাবছিলাম ering
আমার একটি ইস্যু টেবিল রয়েছে যার ভিতরে রয়েছে 12 টি বিদেশী কীগুলি অন্যান্য অন্যান্য টেবিলের সাথে সংযুক্ত। এর মধ্যে 8 টির সাথে আমার অন্য টেবিলগুলি থেকে একটি ওয়েব অ্যাপ্লিকেশনটিতে রেকর্ডটি রেকর্ড করার জন্য শিরোনামের ক্ষেত্র পেতে যোগ দিতে হবে তবে তারপরে 8 টির সাথে যুক্ত হওয়া যা সত্যিই অত্যধিক বলে মনে হচ্ছে বিশেষত যেহেতু আমি কেবল টানছি যারা যোগ দেয় তাদের প্রত্যেকের জন্য 1 টি ক্ষেত্র।
এখন আমাকে স্থায়ীত্বের কারণে অটো ইনক্রিমেন্টিং প্রাইমারি কী (যদি না শারডিংয়ের ক্ষেত্রে জিইউইডি ব্যবহার করা উচিত তবে একটি উদ্বেগ না হয়) ব্যবহার করতে বলা হয়েছে তবে ভারচার (সর্বোচ্চ দৈর্ঘ্য 32) কার্যকারিতা অনুসারে ব্যবহার করা কতটা খারাপ? আমি বোঝাতে চাইছি এই টেবিলগুলির বেশিরভাগেরই সম্ভবত অনেকগুলি রেকর্ড নেই (তাদের বেশিরভাগের 20 বছরের কম বয়সী হওয়া উচিত)। এছাড়াও আমি যদি প্রাথমিক কী হিসাবে শিরোনামটি ব্যবহার করি তবে 95% বর্গক্ষেত্রের জন্য আমি 95% সময়ের সাথে যোগ দিতে হবে না, এমনকি আমি কোনও পারফরম্যান্স হিটও করতে পারি (আমার মনে হয়)। আমি কেবলমাত্র খারাপ দিকটিই ভাবতে পারি তা হ'ল আমার আরও বেশি ডিস্ক স্পেস ব্যবহার হবে (তবে একদিনের নিচে আসলেই এটি একটি বড় ব্যাপার)।
আমি এনামগুলির পরিবর্তে এই স্টাফের প্রচুর জন্য লুকিং টেবিলগুলি ব্যবহার করার কারণ হ'ল অ্যাপ্লিকেশনটির মাধ্যমে শেষ ব্যবহারকারী দ্বারা কনফিগার করার জন্য এই মানগুলির সমস্ত প্রয়োজন।
অনেকগুলি রেকর্ড ব্যতীত কোনও টেবিলের প্রাথমিক কী হিসাবে বার্চারটি ব্যবহার করার ডাউনসাইডগুলি কী কী?
আপডেট - কিছু পরীক্ষা
সুতরাং আমি এই স্টাফ উপর কিছু বেসিক পরীক্ষা করার সিদ্ধান্ত নিয়েছে। আমার 100000 রেকর্ড রয়েছে এবং এগুলি বেস কোয়েরি:
বেস ভিচারার এফ কে ক্যোয়ারী
SELECT i.id, i.key, i.title, i.reporterUserUsername, i.assignedUserUsername, i.projectTitle,
i.ProjectComponentTitle, i.affectedProjectVersionTitle, i.originalFixedProjectVersionTitle,
i.fixedProjectVersionTitle, i.durationEstimate, i.storyPoints, i.dueDate,
i.issueSecurityLevelId, i.creatorUserUsername, i.createdTimestamp,
i.updatedTimestamp, i.issueTypeId, i.issueStatusId
FROM ProjectManagement.Issues i
বেস আইএনটি এফকে ক্যোয়ারী
SELECT i.id, i.key, i.title, ru.username as reporterUserUsername,
au.username as assignedUserUsername, p.title as projectTitle,
pc.title as ProjectComponentTitle, pva.title as affectedProjectVersionTitle,
pvo.title as originalFixedProjectVersionTitle, pvf.title as fixedProjectVersionTitle,
i.durationEstimate, i.storyPoints, i.dueDate, isl.title as issueSecurityLevelId,
cu.username as creatorUserUsername, i.createdTimestamp, i.updatedTimestamp,
it.title as issueTypeId, is.title as issueStatusId
FROM ProjectManagement2.Issues i
INNER JOIN ProjectManagement2.IssueTypes `it` ON it.id = i.issueTypeId
INNER JOIN ProjectManagement2.IssueStatuses `is` ON is.id = i.issueStatusId
INNER JOIN ProjectManagement2.Users `ru` ON ru.id = i.reporterUserId
INNER JOIN ProjectManagement2.Users `au` ON au.id = i.assignedUserId
INNER JOIN ProjectManagement2.Users `cu` ON cu.id = i.creatorUserId
INNER JOIN ProjectManagement2.Projects `p` ON p.id = i.projectId
INNER JOIN ProjectManagement2.`ProjectComponents` `pc` ON pc.id = i.projectComponentId
INNER JOIN ProjectManagement2.ProjectVersions `pva` ON pva.id = i.affectedProjectVersionId
INNER JOIN ProjectManagement2.ProjectVersions `pvo` ON pvo.id = i.originalFixedProjectVersionId
INNER JOIN ProjectManagement2.ProjectVersions `pvf` ON pvf.id = i.fixedProjectVersionId
INNER JOIN ProjectManagement2.IssueSecurityLevels isl ON isl.id = i.issueSecurityLevelId
নিম্নলিখিত সংযোজনগুলির সাথে আমি এই কোয়েরিটিও চালিয়েছি:
- নির্দিষ্ট আইটেম নির্বাচন করুন (যেখানে i.key = 43298)
- আই আইড অনুসারে গ্রুপ করুন
- অর্ডার করুন (IT.title int FK এর জন্য, i.issueTypeId বার্চার এফকে জন্য)
- সীমা (50000, 100)
- গ্রুপ এবং একসাথে সীমাবদ্ধ
- গ্রুপ, অর্ডার এবং একসাথে সীমাবদ্ধ করুন
এইগুলির জন্য ফলাফলগুলি যেখানে:
QUERY টাইপ: ভর্কার এফকে সময় / INT এফ কে সময়
বেস ক্যোয়ারী: ms 4ms / ~ 52ms
নির্দিষ্ট আইটেমটি নির্বাচন করুন: ms 140ms / ~ 250ms
আই আইড অনুসারে গ্রুপ করুন: ms 4 এসএম / ~ 2.8 সেকেন্ড
অর্ডার করুন: ~ 231ms / sec 2 সেকেন্ড
সীমা: ~ 67ms / ~ 343ms
একসাথে গ্রুপ এবং সীমাবদ্ধ করুন: 4 504ms / sec 2 সেকেন্ড
গ্রুপ, অর্ডার এবং একসাথে সীমাবদ্ধ করুন: 4 504ms /~2.3sec
এখন আমি জানি না যে আমি এক বা অন্যটিকে (বা উভয়) দ্রুততর করার জন্য কী কনফিগারেশন করতে পারি তবে মনে হয় ভিচারার এফকে তথ্যের অনুসন্ধানগুলিতে দ্রুত দেখায় (কখনও কখনও অনেক দ্রুত)।
আমার ধারনা যে গতির উন্নতি অতিরিক্ত ডেটা / সূচকের আকারের জন্য মূল্যবান কিনা তা আমাকে বেছে নিতে হবে।