2011-01-12 17 views
15

का उपयोग करके तालिका विभाजन विभाजन विभाजन के लिए केवल 1 के बजाय 2 कॉलम का उपयोग करके तालिका को विभाजित करना संभव है? Date और Num:2 कॉलम

3 कॉलम

 
    ID (int, primary key, 
    Date (datetime), 
    Num (int) 

मैं 2 कॉलम द्वारा इस तालिका विभाजन करना चाहते हैं के साथ एक मेज पर विचार करें।

create PARTITION FUNCTION PFN_MonthRange (datetime) 
AS 
RANGE left FOR VALUES ('2009-11-30 23:59:59:997', 
         '2009-12-31 23:59:59:997', 
         '2010-01-31 23:59:59:997', 
         '2010-28-02 23:59:59:997', 
         '2010-03-31 23:59:59:997') 
go 

उत्तर

34

बुरा समाचार:: विभाजन समारोह एकल स्तंभ पर परिभाषित किया जाना है

यह है कि मैं क्या 1 कॉलम (तारीख) का उपयोग करते हुए एक मेज विभाजन करते हैं।

अच्छी खबर: वह एकल कॉलम persisted computed column हो सकता है जो कि दो कॉलम का संयोजन है जिसे आप विभाजन करने की कोशिश कर रहे हैं।

+5

मुझे यकीन है कि अपने "बुरी खबर" सही है नहीं कर रहा हूँ था। मुझे एकाधिक कॉलम पर विभाजन निर्दिष्ट करने में कोई समस्या नहीं है, उदा। 'ROW_NUMBER() चुनें (A.c1, b.c2, a.c3 ORDER द्वारा a.c1, b.c2, a.c3, a.c4) से ... ', और http: // msdn .microsoft.com/en-us/library/ms189461% 28v = sql.105% 29.aspx स्पष्ट रूप से दिखाता है कि आप विभाजन के लिए एकाधिक मान अभिव्यक्ति निर्दिष्ट कर सकते हैं। क्या मैं कुछ भूल रहा हूँ? – Nathan

+4

@ नाथन: मूल प्रश्न [टेबल विभाजन] के बारे में था (http://msdn.microsoft.com/en-us/library/ms190787.aspx), विंडो फ़ंक्शंस के बारे में नहीं। –

+2

आह! दूसरे उल्लिखित उत्तर को देखते हुए, मुझे लगता है कि मैं अकेला नहीं हूं जिसने गलती की है! – Nathan

2

मूल रूप से, नहीं, आप SQL सर्वर में दो स्तंभों द्वारा विभाजित नहीं कर सकते हैं।

ऐसी कुछ चीजें हैं जो आप कर सकते हैं, एक लुकअप टेबल है जिसे आप निकालने के लिए उपयोग करते हैं, जिसमें प्रत्येक मान के भीतर कौन सा आर्बिटरी पूर्णांक (विभाजन) निकाला जाता है, लेकिन आपके पास केवल 1000 विभाजन अधिकतम होते हैं, इसलिए वे उसी पर कब्जा करना शुरू कर देंगे अंतरिक्ष। गणना कॉलम दृष्टिकोण को एक ही समस्या का सामना करना पड़ता है, आपके पास 1k विभाजन सीमा है, संभावना है कि आप इसे उड़ा देंगे।

मैं शायद महीने के आखिरी हिस्से में बाईं ओर रहने के बजाय, केवल तारीख विभाजन के साथ रहूंगा, और महीने के पहले चरण पर ही रेंज करूँगा।

आप दूसरे विभाजन मूल्य से क्या हासिल करना चाहते हैं?

18

मैंने पाया यह एक आसान समाधान

select ROW_NUMBER() over (partition by CHECKSUM(value,ID) order by SortOrder) as Row From your_table 
+0

यह खूबसूरती से काम करता है! धन्यवाद! –

+8

चेकसम विभिन्न इनपुट मानों (मूल रूप से एक हैश टकराव) से समान आउटपुट मान उत्पन्न कर सकता है। इसलिए यह विधि 100% विश्वसनीय नहीं है। तो यदि आपका विभाजन बिल्कुल सही होना चाहिए, तो इस विधि का उपयोग न करें। यदि आप दुर्लभ गलत विभाजन को सहन कर सकते हैं, तो यह ठीक है। – Nathan

संबंधित मुद्दे