मैं एक वेब एप्लिकेशन (परियोजना प्रबंधन प्रणाली) का निर्माण कर रहा हूं और जब यह प्रदर्शन की बात आती है तो मैं इस बारे में सोच रहा हूं।
मेरे पास एक अंक तालिका है इसके अंदर विभिन्न विदेशी तालिकाओं को जोड़ने वाली 12 विदेशी कुंजियाँ हैं। उन में से 8, मुझे किसी वेब एप्लिकेशन में कोई भी अर्थ निकालने के लिए रिकॉर्ड के लिए अन्य तालिकाओं से शीर्षक क्षेत्र प्राप्त करने के लिए शामिल होने की आवश्यकता होगी, लेकिन फिर इसका मतलब है कि 8 जोड़ जो वास्तव में अत्यधिक अत्यधिक लगते हैं क्योंकि मैं केवल खींच रहा हूं उन सभी में से प्रत्येक के लिए 1 क्षेत्र।
अब मुझे एक ऑटो इन्क्रीमेंटिंग प्राइमरी की का उपयोग करने के लिए भी कहा गया है (जब तक कि इस बात की चिंता नहीं है कि मुझे स्थायी कारणों से GUID का उपयोग किस मामले में करना चाहिए) लेकिन वारचर (अधिकतम लंबाई 32) के प्रदर्शन का उपयोग करना कितना बुरा है? मेरा मतलब है कि इनमें से अधिकांश तालिका में संभवतः कई रिकॉर्ड नहीं हैं (उनमें से अधिकांश 20 से कम होनी चाहिए)। अगर मैं शीर्षक को प्राथमिक कुंजी के रूप में उपयोग करता हूं, तो मुझे 95% समय के लिए जॉइन नहीं करना पड़ेगा इसलिए 95% एसक्यूएल के लिए, मैं किसी भी प्रदर्शन को हिट करूंगा (मुझे लगता है)। केवल नकारात्मक पक्ष यह है कि मैं सोच सकता हूं कि मेरे पास उच्च डिस्क स्थान का उपयोग होगा (लेकिन एक दिन नीचे यह वास्तव में एक बड़ी बात है)।
कारण यह है कि मैं इस सामग्री के बहुत सारे के लिए लुकअप तालिकाओं का उपयोग enums के बजाय कर रहा हूं क्योंकि मुझे इन सभी मूल्यों को एप्लिकेशन के माध्यम से अंतिम उपयोगकर्ता द्वारा कॉन्फ़िगर करने योग्य होना चाहिए।
कई रिकॉर्ड्स को छोड़कर किसी तालिका के लिए प्राथमिक कुंजी के रूप में एक varchar का उपयोग करने के डाउनसाइड क्या हैं?
अद्यतन - कुछ टेस्ट
इसलिए मैंने इस सामान पर कुछ बुनियादी परीक्षण करने का फैसला किया। मेरे पास 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
आधार INT FK क्वेरी
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)
- समूह द्वारा i.id
- ऑर्डर द्वारा (it.title for int FK, i.issueTypeId for varchar FK)
- सीमा (50000, 100)
- समूह और सीमा एक साथ
- समूह, आदेश, और सीमा एक साथ
इन परिणामों के लिए जहां:
तीन प्रकार: VARCHAR FK समय / INT FK समय
आधार क्वेरी: ~ 4ms / ~ 52ms
विशिष्ट आइटम का चयन करें: ~ 140ms / ~ 250ms
I.id द्वारा समूह: ~ 4ms / ~ 2.8 सेकेंड
द्वारा आदेश: ~ 231ms / ~ 2 सेक
सीमा: ~ 67ms / ~ 343ms
समूह और सीमा एक साथ: ~ 504ms / ~ 2sec
समूह, आदेश, और सीमा एक साथ: ~ 504ms /~2.3sec
अब मुझे नहीं पता कि मैं एक या दूसरे को (या दोनों को) तेज करने के लिए क्या विन्यास कर सकता हूं, लेकिन ऐसा लगता है कि VARCHAR FK डेटा के लिए प्रश्नों में तेजी से देखता है (कभी-कभी बहुत तेज)।
मुझे लगता है कि मुझे यह चुनना है कि क्या गति में सुधार अतिरिक्त डेटा / सूचकांक आकार के लायक है।