शामिल हों प्रदर्शन: बनाम BigInt प्राथमिक कुंजी समग्र कुंजी

वोट
1

हम एक मेज है कि होने जा रहा है का कहना है कि एक अरब पंक्तियों को 100 मिलियन (: संग्रह तालिका नाम) है

यह तालिका एक अन्य तालिका उपयोगकर्ताओं से, संदर्भित कर दिया जाएगा।

हम आर्काइव मेज पर प्राथमिक कुंजी के लिए 2 विकल्प हैं:

विकल्प 1: dataID (bigint)

विकल्प 2: userID + datetime (4 बाइट संस्करण)।

स्कीमा:

उपयोगकर्ता - userID (पूर्णांक)

पुरालेख - userID - datetime

या

पुरालेख - dataID (बड़ा पूर्णांक)

कौन सा तेजी से हो सकता है?

हम विकल्प # 1 का उपयोग कर, क्योंकि bigint 8 बाइट्स और 100 मिलियन पंक्तियों को भंडारण की आवंटित करने के लिए जोड़ देगा के साथ है से दूर शर्मा कर रहे हैं।

अद्यतन ठीक खेद मैं उल्लेख करना भूल गया, userID और datetime ताकि एक और स्तंभ, dataID जोड़ने नहीं मेज पर, का कारण था, भले ही रहना होगा।

12/03/2009 को 16:49
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


4 जवाब

वोट
1

चिंता: UserID / [छोटे] datetime का उपयोग करते हुए इसके साथ अद्वितीय नहीं किया जा रहा का एक उच्च जोखिम वहन करती है।

यहाँ कुछ असली स्कीमा है। यह आप क्या कह रहे हैं?

-- Users (regardless of Archive choice)
CREATE TABLE dbo.Users (
    userID      int           NOT NULL  IDENTITY,
    <other columns>
    CONSTRAINT <name> PRIMARY KEY CLUSTERED (userID)
)

-- Archive option 1
CREATE TABLE dbo.Archive (
    dataID      bigint        NOT NULL  IDENTITY,
    userID      int           NOT NULL,
    [datetime]  smalldatetime NOT NULL,
    <other columns>
    CONSTRAINT <name> PRIMARY KEY CLUSTERED (dataID)
)

-- Archive option 2
CREATE TABLE dbo.Archive (
    userID      int           NOT NULL,
    [datetime]  smalldatetime NOT NULL,
    <other columns>
    CONSTRAINT <name> PRIMARY KEY CLUSTERED (userID, [datetime] DESC)
)
CREATE NONCLUSTERED INDEX <name> ON dbo.Archive (
    userID,
    [datetime] DESC
)

यदि यह मेरा निर्णय थे, मैं निश्चित रूप से विकल्प 1. साथ मिल गया होगा डिस्क सस्ती है।

आप विकल्प 2 के साथ जाना है, तो संभव है कि आपको यह अद्वितीय बनाने के लिए अपने पी के लिए कुछ अन्य स्तंभ जोड़ने के लिए होगा है, तो अपने डिजाइन अपमानजनक शुरू होता है।

12/03/2009 को 18:04
का स्रोत उपयोगकर्ता

वोट
1

कुछ विचार है, लेकिन वहाँ शायद एक स्पष्ट कटौती समाधान नहीं है:

  • यदि आप एक अरब पंक्तियाँ है, तो क्यों पूर्णांक जो -2.1 अरब से +2,1 अरब को जाता है का उपयोग नहीं?

  • Userid, पूर्णांक, 4 बाइट + smalldatetime, 4 बाइट = 8 बाइट्स, bigint के रूप में ही

  • आप उपयोगकर्ता आईडी + smalldatetime के बारे में सोच रहे हैं तो निश्चित रूप से यह वैसे भी उपयोगी है। यदि हां, तो एक किराए जोड़ने "archiveID" कॉलम वैसे भी अंतरिक्ष में वृद्धि होगी

  • आप को छानने की आवश्यकता होती है / उपयोगकर्ता आईडी + smalldatetime द्वारा छँटाई है?

  • सुनिश्चित करें कि आपके मॉडल सही है, चिंता के बारे में बाद में मिलती है ...

12/03/2009 को 16:55
का स्रोत उपयोगकर्ता

वोट
0

मेरा सुझाव है कि आप सेटअप अनुकरण अपने वातावरण में इस मान्य करने के लिए है, लेकिन मेरा अनुमान होगा कि एक bigint तेजी से सामान्य रूप में हो सकता है; हालांकि आप तालिका क्या आप पर क्वेरी करने जा रहे हैं क्वेरी कब?

अगर मैं एक arhive निर्माण कर रहा था, मैं DATETIME को आधार partion और शायद USERID एक autoincrement पहचान क्षेत्र होने, और फिर एक partioning योजना का उपयोग कर के लिए दुबला हो सकता है लेकिन यह है कि हालात पर निर्भर करेगा।

12/03/2009 को 16:59
का स्रोत उपयोगकर्ता

वोट
0

क्या विकल्प 3 के साथ है: एक 4 बाइट पूर्णांक dataID बनाना?

इसके अलावा, अगर मैं यह सही समझ में, संग्रह तालिका उन तालिका से संदर्भित किया जाएगा, ताकि यह और भी खास मतलब संग्रह तालिका में userID के लिए नहीं होता।

12/03/2009 को 16:56
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more