2013-08-01 4 views
6

मेरे पास स्ट्रिंग जैसे 12a4..., c3af... में प्राथमिक कुंजी है। ऐसा करने से उपरोक्त तालिका में सभी पंक्तियों का चयन करना होगाएक हेक्स इंडेक्स को एन टुकड़े में विभाजित करें

process_them(1,4) on machine 1 
process_them(2,4) on machine 2 
process_them(3,4) on machine 3 
process_them(4,4) on machine 4 

, एक दूसरे के साथ समन्वय मशीनों के बिना: मैं उन्हें समानांतर में कार्रवाई करने के लिए चाहते हैं। सबसे अच्छा विचार मैं के साथ आ सकते हैं 16 में की तरह उन्हें विभाजित करने के लिए है:

select * from table where id like '1%' 
... 
select * from table where id like 'e%' 
select * from table where id like 'f%' 

वहाँ एक बेहतर विचार है कि मुझे 1/2, 1/4, 1/8, 1/16 की तरह अधिक विभाजन की अनुमति देता है है, कुल पंक्तियों का 1/32 आदि?

नोट: मैं उपयोगकर्ता डेटा पर रात में प्रसंस्करण करने और उन्हें अधिसूचना भेजने के लिए ऐसा कर रहा हूं। मैं डीबी पर कुछ भी संपादित नहीं कर रहा हूं। और हमें एक समय में हजारों उपयोगकर्ताओं को संसाधित करने की आवश्यकता है, इसे एक अच्छी तरह से विभाजित नहीं किया जा सकता है क्योंकि यह उस तरह से कुशल नहीं होगा।

+0

यदि मशीनों में वृद्धिशील प्रणाली आईडी है, तो वे इसे LIMIT क्लॉज में उपयोग कर सकते हैं। लेकिन शायद यह "समन्वय" के रूप में गिना जाता है। आईएमएचओ जो कुछ आप सुझाव देते हैं उससे बेहतर कुछ हासिल करने के लिए उन्हें अपने पर्यावरण के बारे में कुछ जानने की जरूरत है। – mabi

+0

मुझे लगता है कि वितरित डेटाबेस सबसे अच्छा समाधान है। – Suleman

उत्तर

0

सरल दृष्टिकोण कम से कम दो राज्यों के साथ अपनी मेज के लिए एक status कॉलम शामिल किया जाएगा,:

0 = pending 
1 = *not* pending 

फिर प्रत्येक प्रसंस्करण धागा सक्षम "आरक्षित" पंक्तियों उन्हें कार्रवाई करने के लिए की एक छोटी बैच होगा। सामान्य कार्यप्रवाह होगा:

BEGIN TRANSACTION; 
SELECT * FROM queue WHERE status = 0 LIMIT 5 FOR UPDATE; -- load 5 pending items 
-- if no pending item: terminate here 
-- save this list of jobs in your application layer here 
UPDATE queue SET status = 1 WHERE id IN (@id_list); -- list of id's from the previous step 
COMMIT; 
-- process your jobs here 
-- loop 

अपने कार्य की वास्तविक संसाधन समय के अनुसार, इस दृष्टिकोण बहुत भारी एक संतोषजनक होने के लिए भूमि के ऊपर हो सकता है। पहले चरण में LIMIT बढ़ाएं ताकि प्रक्रियाओं में नौकरियों के संभावित रूप से कम संतुलित प्रसार की लागत पर, सापेक्ष ओवरहेड को कम करने के लिए, एक समय में अधिक नौकरियां लोड करने के लिए।

+0

हम डेटा को अपडेट नहीं कर रहे हैं। और समवर्ती 'अपडेट के लिए चयन करें' जैसे कि एक दूसरे को प्रतिबद्ध/निरस्त करने तक लॉक कर देगा। यह समानांतर में नहीं किया जाएगा। – aitchnyu

+0

नहीं, सबसे बुरी स्थिति परिदृश्य में, समवर्ती थ्रेड लॉक हो जाएंगे, केवल एक थ्रेड के लिए नौकरियों को लोड करने के लिए और उनकी स्थिति अपडेट करें ('SELECT', और 'UPDATE'), यानी कुछ मिलीसेकंड यदि तालिका ठीक से है अनुक्रमित। ध्यान दें कि "यहां अपनी नौकरियों को संसाधित करें" भाग लेनदेन के बाहर है। मुझे यकीन नहीं है कि आपके ऑपरेशन के लिए एक नया कॉलम जोड़ना और छेड़छाड़ करना केवल "डेटा को बदलना" माना जाना चाहिए, लेकिन मुझे लगता है कि यह कुछ मामलों में नहीं जा सकता है। – RandomSeed

2

स्वच्छ विचार ...

आप एक MD5 हैश एक उचित अच्छी तरह से वितरित रास्ते में पंक्तियों distrubute को जल्दी से, consitently उपयोग कर सकते हैं (वहाँ एक चूक पंक्ति कभी नहीं होगा) और DDL बदलाव के बिना।

*let n = number of desired partitions. Use the following sql to 
*let s = salt, expirementally chosen to provide the best distribution based on key allocation pattern. 
SELECT * FROM TABLE WHERE mod(cast(conv(md5(concat(s, Priamry_Key)), 16, 10), n) = 0; 
SELECT * FROM TABLE WHERE mod(cast(conv(md5(concat(s, Priamry_Key)), 16, 10), n) = 1; 
... 
... 
SELECT * FROM TABLE WHERE mod(cast(conv(md5(concat(s, Priamry_Key)), 16, 10), n) = (n-1); 

यह एक दृष्टिकोण है जिसे मैंने अच्छे परिणामों के साथ उत्पादन enviornments में कुछ बार लागू किया है।

एसक्यूएल यहां परीक्षण नहीं किया गया है, मैं sytax पर कोई gaurantee नहीं बनाते हैं।

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