මා කලින් ඇසූ තවත් ප්රශ්නයක් සඳහා පරීක්ෂණ දත්ත ගබඩාවක් නිර්මාණය කරන අතරේ, ප්රාථමික යතුරක් ප්රකාශයට පත් කළ හැකි බව මට මතකය NONCLUSTERED
NONCLUSTERED
ප්රාථමික යතුරකට වඩා ඔබ ප්රාථමික යතුරක් භාවිතා කරන්නේ CLUSTERED
කවදාද?
කලින්ම ස්තූතියි
මා කලින් ඇසූ තවත් ප්රශ්නයක් සඳහා පරීක්ෂණ දත්ත ගබඩාවක් නිර්මාණය කරන අතරේ, ප්රාථමික යතුරක් ප්රකාශයට පත් කළ හැකි බව මට මතකය NONCLUSTERED
NONCLUSTERED
ප්රාථමික යතුරකට වඩා ඔබ ප්රාථමික යතුරක් භාවිතා කරන්නේ CLUSTERED
කවදාද?
කලින්ම ස්තූතියි
Answers:
ප්රශ්නය වන්නේ 'පී.කේ. එන්.සී. විය යුත්තේ කවදාද' යන්න නොව, 'පොකුරු දර්ශකය සඳහා සුදුසු යතුර කුමක්ද' යන්න ඔබ ඇසිය යුතුය.
පිළිතුර සැබවින්ම රඳා පවතින්නේ ඔබ දත්ත විමසන්නේ කෙසේද යන්න මතය . පොකුරු දර්ශකයට අනෙක් සියලුම දර්ශකවලට වඩා වාසියක් ඇත: එය සෑම විටම සියලු තීරු ඇතුළත් බැවින් සෑම විටම ආවරණය කරයි. එබැවින් පොකුරු දර්ශකය උත්තේජනය කළ හැකි විමසුම් නිසැකවම සමහර ප්රක්ෂේපිත තීරු සහ / හෝ පුරෝකථනයන් තෘප්තිමත් කිරීම සඳහා විමසුම් භාවිතා කිරීම අවශ්ය නොවේ.
ප්රහේලිකාවෙහි තවත් කොටසක් නම් දර්ශකයක් භාවිතා කරන්නේ කෙසේද? සාමාන්ය රටා තුනක් ඇත:
එබැවින් ඔබ අපේක්ෂිත භාරය (විමසුම්) විශ්ලේෂණය කර විමසීම් විශාල සංඛ්යාවක් යම් දර්ශකයක් භාවිතා කරනු ඇති බව සොයා ගන්නේ නම්, ඔවුන් දර්ශකයකින් ප්රතිලාභ ලබන නිශ්චිත ප්රවේශ රටාවක් භාවිතා කරන හෙයින්, එම දර්ශකය පොකුරු දර්ශකය ලෙස යෝජනා කිරීම අර්ථවත් කරයි.
තවත් සාධකයක් නම්, පොකුරු රහිත දර්ශක යතුර යනු සියලු පොකුරු නොවන දර්ශක භාවිතා කරන විමසුම් යතුර වන අතර එබැවින් පුළුල් පොකුරු දර්ශක යතුරක් රැළි ආචරණයක් ඇති කරන අතර සියලු පොකුරු නොවන දර්ශක පුළුල් කරයි සහ පුළුල් දර්ශක වැඩි පිටු අදහස් කරයි, වැඩි I / O , වැඩි මතකයක්, අඩු යහපත්කම.
හොඳ පොකුරු දර්ශකයක් ස්ථායී වේ , එය ආයතනයේ ජීවිත කාලය තුළ වෙනස් නොවේ, මන්ද පොකුරු දර්ශක යතුරු අගයන්හි වෙනසක් අදහස් කරන්නේ පේළිය මකා දමා නැවත ඇතුළත් කළ යුතු බැවිනි.
පිටු බෙදීම් හා ඛණ්ඩනය වීම වළක්වා ගැනීම සඳහා ( FILLFACTOR
s සමඟ පටලවා නොගෙන) හොඳ පොකුරු දර්ශකයක් අහඹු ලෙස නොව (අලුතින් ඇතුළත් කරන ලද සෑම ප්රධාන අගයක්ම පෙර අගයට වඩා විශාල වේ ) වර්ධනය වේ.
හොඳ පොකුරු දර්ශක යතුරක් යනු කුමක්දැයි දැන් අප දන්නා හෙයින්, ප්රාථමික යතුර (දත්ත ආකෘතිකරණ තාර්කික දේපලක්) අවශ්යතාවන්ට ගැලපේද? ඔව් නම්, PK පොකුරු කළ යුතුය. එසේ නොවේ නම්, PK පොකුරු රහිත විය යුතුය.
උදාහරණයක් දීමට, විකුණුම් කරුණු වගුවක් සලකා බලන්න. සෑම ප්රවේශයකම මූලික යතුර වන හැඳුනුම්පතක් ඇත. නමුත් විමසුම් වලින් බහුතරයක් දිනයක් සහ වෙනත් දිනයක් අතර දත්ත ඉල්ලයි, එබැවින් හොඳම පොකුරු දර්ශක යතුර වනුයේ විකුණුම් දිනය මිස හැඳුනුම්පත නොවේ . ප්රාථමික යතුරෙන් වෙනස් පොකුරු දර්ශකයක් තිබීමේ තවත් උදාහරණයක් වන්නේ 'කාණ්ඩය' හෝ 'රාජ්යය' වැනි ඉතා අඩු වර්ගාත්මක යතුරකි, ඉතා අඩු අගයන් සහිත යතුරකි. මෙම අඩු තෝරා ගැනීමේ යතුර වම්පස යතුර ලෙස පොකුරු දර්ශක යතුරක් තිබීම (state, id)
බොහෝ විට අර්ථවත් වන්නේ විශේෂිත 'තත්වයක' සියලුම ඇතුළත් කිරීම් සොයන පරාස පරිලෝකනය නිසාය.
ගොඩකට වඩා පොකුරු නොවන ප්රාථමික යතුරක් ඇතිවීමේ හැකියාව පිළිබඳ අවසාන සටහනක් (එනම් පොකුරු දර්ශකයක් කිසිසේත්ම නොමැත). මෙය වලංගු වාතාවරණයක් විය හැකිය, සාමාන්ය හේතුව වන්නේ තොග ඇතුළත් කිරීමේ කාර්ය සාධනය ඉතා වැදගත් වන හෙයිනි, පොකුරු දර්ශක හා සසඳන විට ගොඩවල් සැලකිය යුතු ලෙස වඩා හොඳ තොග ඇතුළත් කිරීමේ ප්රති put ල ඇත.
(state, id)
. මෙම උදාහරණයේ දී “හොඳ පොකුරු දර්ශකය වර්ධනය වන්නේ අහඹු ලෙස නොවේ” අවශ්යතාවය සපුරාලන්නේ නැත, එසේ නොවේ ද? එබැවින් අපට එය හොඳ පොකුරු දර්ශකයක් ලෙස සැලකිය හැකිද?
DESC
, කාර්ය සාධනය වැඩි කිරීම සඳහා නිශ්චිත අනුපිළිවෙලක් සහිතව එම වගුවේ දර්ශකයක් අර්ථ දැක්වීම ප්රයෝජනවත් විය හැකිය
පොකුරු දර්ශක භාවිතා කිරීමට මූලික හේතුව විකිපීඩියාවේ සඳහන් වේ :
පොකුරුකරණය මඟින් දත්ත කාණ්ඩය දර්ශකයට ගැලපෙන පරිදි වෙනස් අනුපිළිවෙලකට වෙනස් කරයි, එහි ප්රති ing ලයක් ලෙස පේළි දත්ත පිළිවෙලට ගබඩා වේ. එබැවින්, ලබා දී ඇති දත්ත සමුදා වගුවක එක් පොකුරු දර්ශකයක් පමණක් සෑදිය හැකිය. පොකුරු දර්ශක මගින් නැවත ලබා ගැනීමේ වේගය විශාල ලෙස වැඩි කළ හැකි නමුත් සාමාන්යයෙන් දත්ත පොකුරු දර්ශකයේ එකම හෝ ප්රතිලෝම අනුපිළිවෙලට අනුක්රමිකව ප්රවේශ වන විට හෝ අයිතම පරාසයක් තෝරාගත් විට පමණි.
මට පුද්ගලයින්ගේ වගුවක් ඇති බව පවසන්න, මෙම පුද්ගලයින්ට රට තීරුවක් සහ අද්විතීය ප්රාථමික යතුරක් ඇත. එය ජන විකාශන වගුවකි, එබැවින් මම සැලකිලිමත් වන එකම දේ මේවා ය; කුමන රට සහ අද්විතීය පුද්ගලයන් කී දෙනෙකු එම රටට බැඳී තිබේද?
මේ අනුව, මම කවදා හෝ රට තීරුවෙන් තෝරා ගැනීමට හෝ ඇණවුම් කිරීමට පමණක් ඉඩ ඇත; ප්රාථමික යතුරේ පොකුරු දර්ශකයක් මට කිසිදු යහපතක් නොකරයි, මම පීකේ විසින් මෙම දත්ත වෙත ප්රවේශ නොවෙමි, මම මෙම අනෙක් තීරුවෙන් ප්රවේශ වෙමි. මට මේසය මත ඇත්තේ එක් පොකුරු දර්ශකයක් පමණක් බැවින්, මගේ පී.කේ. පොකුරු ලෙස ප්රකාශ කිරීමෙන් රට පිළිබඳ පොකුරු දර්ශකයක් භාවිතා කිරීමෙන් වළක්වනු ඇත.
ඊට අමතරව, පොකුරු එදිරිව නොබැඳි දර්ශක පිළිබඳ හොඳ ලිපියක් මෙහි ඇත, SQL සේවාදායකය 6.5 හි කාර්ය සාධන ගැටළු ඇතුළත් කිරීමට පොකුරු දර්ශක හේතු වී ඇත (අවම වශයෙන් මෙහි අපගෙන් බොහෝ දෙනෙකුට එය අදාළ නොවේ).
ඔබ පොකුරු දර්ශකයක් IDENTITY තීරුවක තැබුවහොත්, ඔබගේ සියලු ඇතුළත් කිරීම් වගුවේ අවසාන පිටුවේ සිදුවනු ඇත - තවද එක් එක් හැඳුනුම්පතේ කාලසීමාව සඳහා එම පිටුව අගුළු දමා ඇත. ලොකු දෙයක් නැහැ ... ඔබ සියලු දෙනාටම අවසාන පිටුව අවශ්ය පුද්ගලයින් 5000 ක් නොමැති නම්. එවිට ඔබට එම පිටුව සඳහා විශාල විවාදයක් ඇත
පසු සංස්කරණ වලදී මෙය එසේ නොවන බව සලකන්න.
ඔබේ ප්රාථමික යතුර නම් UNIQUEIDENTIFIER
, එය බව සඳහන් කිරීමට වග බලා ගන්න NONCLUSTERED
. ඔබ එය පොකුරු කළහොත්, සෑම පේළියකටම නව පේළිය නිවැරදි ස්ථානයට ඇතුළු කිරීම සඳහා වාර්තා මාරු කිරීමක් කළ යුතුය. මෙය කාර්ය සාධනය ටැංකි කරනු ඇත.
UNIQUEIDENTIFIER
වර්ගයක් ද පවතින අතර අද්විතීය යතුරු උත්පාදනය කිරීමේ සම්භාවිතාව ද ඇත, එය තවමත් 128 ප්රමාණයෙන් පීඩා විඳිති.
ඉතා පොදු උදාහරණයක්:
Customer
සමග වගුව CustomerID
ලෙසCLUSTERED PRIMARY KEY
OrderID (PK), CustomerID, OrderDate
සහ තවත් තීරු කිහිපයක්OrderPositions
සමග OrderPositionID (PK), OrderId, ProductID, Amount, Price ...
ඇත්ත වශයෙන්ම "එය රඳා පවතින්නේ" - සෑම විටම පාහේ - නිවැරදි පිළිතුරයි, නමුත් බොහෝ යෙදුම් (BI- වාර්තා නොවේ) පාරිභෝගිකයා පදනම් කරගෙන ක්රියා කරනු ඇත (උදා: ඔබ ගනුදෙනුකරු 278 ලෙස වෙබ් අඩවියට පිවිස "මගේ ඇණවුම්" මත ක්ලික් කරන්න හෝ ලිපිකරු 4569 පාරිභෝගිකයා සඳහා වන සියලුම ඇණවුම් ලැයිස්තුගත කරයි, නැතහොත් ඔබේ ඉන්වොයිස් චර්යාව පාරිභෝගිකයින් සඳහා වන සියලුම ඇණවුම් සාරාංශ කරයි 137).
මෙම අවස්ථාවේ දී වගුව පොකුරු කිරීම එතරම් තේරුමක් නැත OrderID
. ඔව්, SELECT ... WHERE OrderId = ?
ඇණවුම් විස්තර ලැයිස්තුගත කිරීම සඳහා ඔබට විමසීම් ඇත , නමුත් මෙය සාමාන්යයෙන් කෙටි හා ලාභදායී වේ (කියවීම් 3) දර්ශකය සොයයි.
අනෙක් අතට, ඔබ විසින් ඔබේ Order
වගුව පොකුරු කරන්නේ නම්, ඔබ මේසය CustomerID
විමසන සෑම අවස්ථාවකම එය යතුරු කිහිපයක් බැලීම අවශ්ය නොවේ CustomerId = ?
.
මෙම CLUSTERED INDEX
සෑම විටම විය යුතු UNIQUE
ආකාරයකින් SQL Server අදෘශ්යමාන (= මෙවිට) INT තීරුවක් එක් වනු ඇත, UNIQUIFIER
එය සමහර (ෙයදීම පිණිස මත පදනම්ව) අහඹු දේවල් සැබෑ (යානාවල භාවිතා කළ හැකි) දත්ත එකතු කිරීමට තවත් බොහෝ තේරුමක් ඇත - මෙම uniquiness සහතික කිරීම.
ගනුදෙනුකරුවෙකු එක් ඇණවුමකට වඩා වැඩි ගණනක් තබන හෙයින්, අපට OrderID
(හෝ ඔබ සාමාන්යයෙන් මේ සඳහා වර්ග OrderDate
කරන්නේ නම් ) (එය දිවා කාලයේ නම් - එසේ නොමැති නම් පාරිභෝගිකයා දිනකට එක් ඇණවුමකට සීමා වේ) එකතු කළ යුතුය. මෙම CLUSTERED INDEX
සහ සමග අවසන්:
CREATE UNIQUE CLUSTERED INDEX IX_Orders_UQ on Orders (CustomerID, OrderID)
එකම නීති රීති OrderPositions
වගුවට අදාළ වේ . ඔබ සමග වන්නේ PK නිර්මාණය කළ යුතු නිසා බොහෝ විට විමසුම්, විශේෂිත නියෝග මත සියලු තනතුරු ලැයිස්තුගත වනු ඇත OrderPositionID
ලෙස NONCLUSTERED
සහ UNIQUE CLUSTERED INDEX
මත OrderId, OrderPositionID
.
BTW: Customer
වගුව එහි PK මගින් පොකුරු කර ඇති බව නිවැරදිය. ( CustomerID
එය "ඉහළ මට්ටමේ වගුවක්" වන අතර සාමාන්ය යෙදුමක දී - බොහෝ විට එහි පාරිභෝගික අයි.ඩී.
උදා: ලෙස පිරිසිදු බැලීම මේස Genders
හෝ InvoiceTypes
හෝ PaymentType
(ඔබ සාමාන්යයෙන් ඒවා එකතු කරන්නම් නිසා එහි පී.කේ. විසින් ක්ලස්ටර් කළ යුතු බව වගු තවත් උදාහරණයක් වේ GenderId
, InvoiceTypeId
හෝ PaymentTypeId
).
පොකුරු දර්ශකයක් පොකුරු PK ට වඩා සමස්ත පද්ධතියට වඩා ප්රයෝජනවත් යැයි සලකන විට යම් කාර්ය සාධනයක් භාවිතා කරයි. මේසයක් මත තිබිය හැක්කේ එක් පොකුරු දර්ශකයක් පමණි.
කාර්ය සාධනය සඳහා උදාහරණ මිනුම් වන්නේ තනි විමසුම් කාලය (වේගය), වගුවට එරෙහිව සම්පූර්ණ විමසුම් වේලාවන් ඒකාබද්ධ කිරීම (කාර්යක්ෂමතාව) සහ පොකුරු (ප්රමාණය) හා සමාන කාර්ය සාධනයක් ලබා ගැනීම සඳහා බොහෝ විශාල පොකුරු නොවන දර්ශකයකට තීරු ඇතුළත් කිරීම ය. ).
අද්විතීය නොවන දර්ශකයක් භාවිතා කරමින් දත්ත සාමාන්යයෙන් ලබා ගන්නා විට මෙය සිදුවිය හැකිය (ශුන්ය අගයන් අඩංගු වේ) (හෝ PK හි අවසර නැත), හෝ ද්විතීයික හේතුවක් නිසා PK එකතු කරන ලදි (ප්රතිවර්තනය හෝ විගණන මංපෙත් හඳුනා ගැනීම වැනි).