डायनामोड में स्कैन और क्वेरी के बीच अंतर क्या है? स्कैन / क्वेरी का उपयोग कब करें?


85

DynamoDb प्रलेखन में निर्दिष्ट एक क्वेरी ऑपरेशन:

एक क्वेरी ऑपरेशन केवल प्राथमिक कुंजी विशेषता मानों को खोजता है और खोज प्रक्रिया को परिष्कृत करने के लिए प्रमुख विशेषता मूल्यों पर तुलना ऑपरेटरों के सबसेट का समर्थन करता है।

और स्कैन ऑपरेशन:

एक स्कैन ऑपरेशन पूरे टेबल को स्कैन करता है। पूर्ण स्कैन के बाद, आपके द्वारा दिए गए मानों को परिष्कृत करने के लिए परिणामों पर लागू करने के लिए आप फ़िल्टर निर्दिष्ट कर सकते हैं।

जो प्रदर्शन और लागत संबंधी विचारों पर आधारित है।

जवाबों:


55

डायनामॉड टेबल बनाते समय प्राथमिक कुंजी और स्थानीय माध्यमिक सूचकांक (LSI) का चयन करें ताकि एक क्वेरी ऑपरेशन आपके इच्छित आइटम को लौटाए।

क्वेरी ऑपरेशन केवल प्राथमिक कुंजी के बराबर ऑपरेटर मूल्यांकन का समर्थन करते हैं, लेकिन क्रमबद्ध कुंजी पर सशर्त (=, <, <=>,> =, बीच, आरंभ)।

स्कैन ऑपरेशन आम तौर पर धीमे और अधिक महंगे होते हैं क्योंकि आपके द्वारा अनुरोधित वस्तुओं को प्राप्त करने के लिए ऑपरेशन को आपकी तालिका में प्रत्येक आइटम के माध्यम से पुनरावृत्त करना पड़ता है।

उदाहरण:

Table: CustomerId, AccountType, Country, LastPurchase

Primary Key: CustomerId + AccountType

इस उदाहरण में, आप प्राप्त करने के लिए एक क्वेरी ऑपरेशन का उपयोग कर सकते हैं:

  1. AccountType पर एक सशर्त फ़िल्टर के साथ एक CustomerId

वापसी के लिए स्कैन ऑपरेशन का उपयोग करना होगा:

  1. एक विशिष्ट खाता प्रकार वाले सभी ग्राहक
  2. देश द्वारा सशर्त फ़िल्टर पर आधारित आइटम, अर्थात संयुक्त राज्य अमेरिका से सभी ग्राहक
  3. LastPurchase, यानी पिछले महीने में खरीदारी करने वाले सभी ग्राहकों द्वारा सशर्त फ़िल्टर पर आधारित आइटम

लोकल सेकेंडरी इंडेक्स (LSI) या ग्लोबल सेकेंडरी इंडेक्स (GSI) बनाते समय अक्सर इस्तेमाल किए जाने वाले ऑपरेशंस पर स्कैन से बचने के लिए।

उदाहरण:

Table: CustomerId, AccountType, Country, LastPurchase

Primary Key: CustomerId + AccountType
GSI: AccountType + CustomerId
LSI: CustomerId + LastPurchase

इस उदाहरण में एक क्वेरी ऑपरेशन आपको प्राप्त करने की अनुमति दे सकता है:

  1. AccountType पर एक सशर्त फ़िल्टर के साथ एक CustomerId
  2. [GSI] एक विशिष्ट खाता प्रकार के लिए CustomerIds पर एक सशर्त फ़िल्टर
  3. [LSI] LastPurchase पर एक सशर्त फ़िल्टर के साथ एक CustomerId

1
अगर प्राथमिक कुंजी: CustomerId + AccountType (मैं समझता हूं कि CustomerID विभाजन कुंजी है, और AccountType सॉर्ट कुंजी है) मुझे लगता है कि आप केवल ग्राहक द्वारा या CustomerID + AccountType द्वारा क्वेरी संचालन चला सकते हैं। यदि आप केवल AccountType द्वारा खोज करते हैं, तो यह एक स्कैन होगा
Adil

1
धन्यवाद @ आदिल आप सही हैं, मैंने इसे दर्शाने के लिए अपना उत्तर संपादित कर दिया है।
किमन


34

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

यदि आप टेबल स्कैन करते हैं तो फ़िल्टर सभी पार्टीशन कुंजी / प्राथमिक कुंजी पर किया जाएगा। पहले इसने सभी डेटा प्राप्त किया और टेबल से लाने के बाद फ़िल्टर लागू किया।

उदाहरण के लिए:

यहाँ customer_countryहै विभाजन कुंजी / प्राथमिक कुंजी और idहै sort_key

-----------------------------------

customer_country | name   | id

-----------------------------------
VV               | Tom    | 1

VV               | Jack   | 2

VV               | Mary   | 4

BB               | Nancy  | 5

BB               | Lom    | 6

BB               | XX     | 7

CC               | YY     | 8

CC               | ZZ     | 9

------------------------------------
  • यदि आप क्वेरी ऑपरेशन करते हैं तो यह केवल customer_countryमूल्य पर लागू होता है । मान केवल समान ऑपरेटर (=) होना चाहिए।

  • तो केवल उस विभाजन कुंजी / प्राथमिक कुंजी मूल्य के बराबर आइटम लाए जाते हैं।

  • यदि आप स्कैन ऑपरेशन करते हैं तो यह उस तालिका की सभी वस्तुओं को प्राप्त करता है और उस डेटा को लेने के बाद डेटा को फ़िल्टर करता है।

नोट: स्कैन ऑपरेशन न करें यह आपके RCU से अधिक है।


क्या आप अपने उत्तर का स्रोत बता सकते हैं?
एलिकएल्ज़िन-किलाका


10

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

  • चाभी
  • कुंजी और कुंजी प्रकार
  • सूची
  • सूचकांक और यह संबंधित प्रकार की है

क्वेरी का उपयोग करें! अन्यथा स्कैन का उपयोग करें जो अधिक लचीला है कि आप किस कॉलम को फ़िल्टर कर सकते हैं।

यदि आप प्रश्न नहीं कर सकते हैं तो:

  • अधिक 2 फ़िल्टर में फ़ील्ड (जैसे कुंजी, सॉर्ट और इंडेक्स)
  • केवल कुंजी को छांटें (प्राथमिक कुंजी या सूचकांक की)
  • नियमित फ़ील्ड (कुंजी, इंडेक्स या सॉर्ट नहीं)
  • मिश्रित सूचकांक और सॉर्ट (index1 index2 के प्रकार के साथ) \
  • ...

एक अच्छा स्पष्टीकरण: https://medium.com/@amos.shahar/dynamodb-query-vs-scan-sql-syntax-and-join-tables-part-1-371288a7cc8f


9

प्रदर्शन के संदर्भ में, मुझे लगता है कि अनुप्रयोगों के Queryबजाय अपनी तालिका डिज़ाइन करने के लिए यह अच्छा अभ्यास है Scan। क्योंकि स्कैन ऑपरेशन हमेशा वांछित मानों को फ़िल्टर करने से पहले संपूर्ण तालिका को स्कैन करता है, जिसका अर्थ है कि डेटा ऑपरेशन जैसे पढ़ने, लिखने और हटाने के लिए अधिक समय और स्थान लेता है। अधिक जानकारी के लिए, कृपया आधिकारिक दस्तावेज़ देखें


7

इसका संबंध रिलेशनल डेटाबेस में जैसा है।

प्राप्त करें queryआप एक प्राथमिक कुंजी का उपयोग कर रहे हैं whereस्थिति, गणना की जटिलता log(n)सबसे महत्वपूर्ण है बाइनरी ट्री।

जबकि scanक्वेरी आपको पूरी तालिका को स्कैन rowकरने के लिए है तो सही परिणाम खोजने के लिए हर एक पर फ़िल्टर लागू करें । प्रदर्शन है O(n)। अगर आपकी टेबल बड़ी है तो यह बहुत धीमी है।

संक्षेप में, getयदि आप प्राथमिक कुंजी जानते हैं तो उपयोग करने का प्रयास करें । केवल scanसबसे खराब स्थिति के लिए।

प्रदर्शन उद्देश्य प्राप्त करने के लिए विभिन्न कुंजी पर विभिन्न प्रकार के प्रश्नों का समर्थन करने के लिए वैश्विक माध्यमिक सूचकांक के बारे में भी सोचें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.