2011-09-07 10 views
13

मेरे पास एक एज़ूर टेबल है जहां ग्राहक संदेश पोस्ट करते हैं, एक ही तालिका में लाखों संदेश हो सकते हैं। मैं पिछले 10 मिनट में संदेश पोस्ट करने का सबसे तेज़ तरीका ढूंढना चाहता हूं (जो कि मैं वेब पेज को कितनी बार रीफ्रेश करता हूं)। चूंकि केवल विभाजन कुंजी को अनुक्रमित किया गया है, इसलिए मैंने दिनांक & दिनांक का उपयोग करने के विचार के साथ खेला है जब संदेश को विभाजन कुंजी के रूप में पोस्ट किया गया था, उदाहरण के लिए "2009-06-15T13: 45: 30.0900000"Azure तालिका में नवीनतम आइटम के लिए पूछताछ का सबसे तेज़ तरीका?

जैसे ISO9801 दिनांक प्रारूप के रूप में एक स्ट्रिंग

उदाहरण छद्म कोड:

var message = "Hello word!"; 
var messagePartitionKey = DateTime.Now.ToString("o"); 
var messageEntity = new MessageEntity(messagePartitionKey, message); 
dataSource.Insert(messageEntity); 

, और फिर संदेशों इस तरह पिछले 10 मिनट के भीतर तैनात के लिए क्वेरी (फिर अपरीक्षित छद्म कोड):

// Get the date and time 10 minutes ago 
var tenMinutesAgo = DateTime.Now.Subtract(new TimeSpan(0, 10, 0)).ToString("o"); 

// Query for the latest messages 
var latestMessages = (from t in 
    context.Messages 
    where t.PartitionKey.CompareTo(tenMinutesAgo) <= 0 
    select t 
    ) 

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

+0

एक sidenote के रूप में, आपको शायद विभाजन कुंजी के रूप में कुछ और सामान्य उपयोग करना चाहिए। जैसे आपकी पोस्ट संबंधित है या ऐसा। Http://msdn.microsoft.com/en-us/library/windowsazure/hh508997.aspx –

+0

पर एक नज़र डालें क्या वही मशीन आवेषण और क्वेरी दोनों कर रही है? यदि नहीं, तो आपको ग्राहकों के बीच संभावित घड़ी के लिए जिम्मेदार होना होगा। –

उत्तर

5

मुझे लगता है कि आपको सही बुनियादी विचार मिल गया है। आपके द्वारा डिज़ाइन की गई क्वेरी को उतना ही कुशल होना चाहिए जितना आप उम्मीद कर सकते हैं। लेकिन कुछ सुधार हैं जो मैं पेश कर सकता हूं।

DateTime.Now का उपयोग करने के बजाय, Date.UtcNow का उपयोग करें। जो कुछ मैं समझता हूं उससे यूकेसी समय को उनके आधार के रूप में उपयोग करने के लिए सेट किया जाता है, लेकिन यह सुनिश्चित करता है कि आप सेब की तुलना सेब की तुलना कर रहे हैं और आप समय को वापस प्रदर्शित करते समय जो भी समय चाहते हैं उसे विश्वसनीय रूप से परिवर्तित कर सकते हैं।

.ToString("o") के रूप में समय को संग्रहीत करने के बजाय समय को टिक्स में बदल दें और स्टोर करें, आप कम स्वरूपण समस्याओं के साथ समाप्त हो जाएंगे (कभी-कभी आपको अंत में टाइमज़ोन विनिर्देश मिल जाएगा, कभी-कभी नहीं)। इसके अलावा यदि आप हमेशा इन संदेशों को सबसे हालिया से सबसे पुराना देखना चाहते हैं तो आप अधिकतम संख्या में टिकों की संख्या घटा सकते हैं उदा।

var messagePartitionKey = (DateTime.MaxValue.Ticks - _contactDate.Ticks).ToString("d19"); 

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

+0

टिक प्रत्येक रिकॉर्ड के लिए अद्वितीय होंगे और प्रत्येक विभाजन कुंजी के लिए एकल विभाजन बनाएंगे। मुझे नहीं लगता कि टिक लेने का सबसे अच्छा विचार है। – Kurkula

+1

हां, यह प्रत्येक पंक्ति के लिए एक विभाजन तैयार करेगा, लेकिन इस स्थिति में ऐसा करने के लिए कोई नुकसान नहीं है। – knightpfhor

+0

मुझे यकीन नहीं है लेकिन कई विभाजन बनाने से प्रदर्शन कम हो जाएगा। – Kurkula

3

मैं कुछ ऐसा करने का सुझाव दूंगा जो डायग्नोस्टिक्स एपीआई WADPerformanceCountersTable के साथ कर रहा है। वहाँ विभाजन एक समूह में कई टाइमस्टैम्प समूह। Ie: यह सभी टाइमस्टैम्प को निकटतम कुछ मिनटों में राउंड करता है (कहें, निकटतम 5 मिनट)। इस तरह आपके पास विभाजन कुंजी की सीमित मात्रा नहीं है और फिर भी उन पर विस्तृत प्रश्न करने में सक्षम हैं।

तो, उदाहरण के लिए, यदि आप एक PartitionKey कि प्रत्येक टाइमस्टैम्प कि 0:00 में आदि गोल है, 00:05, 00:10, 00:15, करने के लिए नक्शे हो सकता है .. और फिर Ticks

+0

बहुत अच्छे विकल्प की तरह लगता है, लेकिन मेरे परिदृश्य में पृष्ठ कई ग्राहकों द्वारा विभिन्न अंतराल पर ताज़ा किया जाता है। मैं कभी नहीं जानता कि अनुरोध कब आता है और मैं ग्राहक को समान या बहुत कम संदेश भेजने का जोखिम नहीं उठा सकता। –

+0

मुझे यह विचार पसंद है। – Roboblob

4
में बदला

तालिका के लिए प्राथमिक कुंजी विभाजनकी और रोकी (जो क्लस्टर्ड इंडेक्स बनाती है) का संयोजन है।

अपने मामले में, बस ParitionKey के बजाय रोकी के लिए जाएं (इसके लिए निरंतर मूल्य प्रदान करें)।

आप डायग्नोस्टिक दृष्टिकोण का भी पालन कर सकते हैं, जैसे हर दस मिनट में एक नई विभाजन कुंजी बनाते हैं। लेकिन यह दृष्टिकोण मुख्य रूप से आर्चीविंग/पर्जिंग इत्यादि जैसी आवश्यकताओं के लिए है।,

0
  • मेरी समझ के साथ विभाजन कुंजी का उपयोग कर से सटीक बराबर "=" "<" का उपयोग करने से कम से कम बहुत तेजी से या> "इससे अधिक" हो जाएगा।
  • अगर हम आपकी स्थिति के लिए विभाजन कुंजी और पंक्ति कुंजी का अद्वितीय संयोजन प्राप्त कर सकते हैं तो अधिक प्रयास करना सुनिश्चित करें।
  • यह भी सुनिश्चित करें कि आप अधिक विभाजन से बचने के लिए विभाजन कुंजी मानों के कम अद्वितीय संयोजन करते हैं।
संबंधित मुद्दे