Cassandra लंबी क्वेरी समय और memtable में जोड़ने जब चाबियाँ पूरी तरह से contrained हैं




cassandra-3.0 (2)

मेरे पास कैसन्द्रा टेबल है और चाबियाँ इस तरह दिखती हैं:

प्राथमिक कुंजी ("सी 1", "के 2"), "सी 1", "सी 2")), साथ क्लास्टरिंग ऑर्डर ("सी 1" डीईएससी, सी 2 "डीईएससी");

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

संपादित करें: मुझे दोनों प्रश्नों का उल्लेख 1 पंक्ति से वापस करना चाहिए था और यह एक ही रिकॉर्ड है।

  activity                                                                                                                                                                          | timestamp                  | source        | source_elapsed | client
 -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------+---------------+----------------+------------
                                                                                                                                                                 Execute CQL3 query | 2017-09-05 18:09:37.456000 | **.***.**.237 |              0 | ***.**.*.4
                                              Parsing select c2 from feed where k1 = 'AAA' and k2 = 'BBB' and c1 = '2017-09-05T16:09:00.222Z' and c2 = 'CCC'; [SharedPool-Worker-1] | 2017-09-05 18:09:37.456000 | **.***.**.237 |            267 | ***.**.*.4
                                                                                                                                          Preparing statement [SharedPool-Worker-1] | 2017-09-05 18:09:37.456000 | **.***.**.237 |            452 | ***.**.*.4
                                                                                                                     Executing single-partition query on feed [SharedPool-Worker-3] | 2017-09-05 18:09:37.457000 | **.***.**.237 |           1253 | ***.**.*.4
                                                                                                                                 Acquiring sstable references [SharedPool-Worker-3] | 2017-09-05 18:09:37.457000 | **.***.**.237 |           1312 | ***.**.*.4
                                                                                                                                    Merging memtable contents [SharedPool-Worker-3] | 2017-09-05 18:09:37.457000 | **.***.**.237 |           1370 | ***.**.*.4
                                                                                                                                 Key cache hit for sstable 22 [SharedPool-Worker-3] | 2017-09-05 18:09:37.463000 | **.***.**.237 |           6939 | ***.**.*.4
                                                                                                                                 Key cache hit for sstable 21 [SharedPool-Worker-3] | 2017-09-05 18:09:37.463000 | **.***.**.237 |           7077 | ***.**.*.4
                                                                                                                                 Key cache hit for sstable 12 [SharedPool-Worker-3] | 2017-09-05 18:09:37.463000 | **.***.**.237 |           7137 | ***.**.*.4
                                                                                                                                  Key cache hit for sstable 6 [SharedPool-Worker-3] | 2017-09-05 18:09:37.463000 | **.***.**.237 |           7194 | ***.**.*.4
                                                                                                                                  Key cache hit for sstable 3 [SharedPool-Worker-3] | 2017-09-05 18:09:37.463000 | **.***.**.237 |           7249 | ***.**.*.4
                                                                                                                                 Merging data from sstable 10 [SharedPool-Worker-3] | 2017-09-05 18:09:37.463000 | **.***.**.237 |           7362 | ***.**.*.4
                                                                                                                                 Key cache hit for sstable 10 [SharedPool-Worker-3] | 2017-09-05 18:09:37.463001 | **.***.**.237 |           7429 | ***.**.*.4
                                                                                                                                  Key cache hit for sstable 9 [SharedPool-Worker-3] | 2017-09-05 18:09:37.463001 | **.***.**.237 |           7489 | ***.**.*.4
                                                                                                                                  Key cache hit for sstable 4 [SharedPool-Worker-3] | 2017-09-05 18:09:37.463001 | **.***.**.237 |           7628 | ***.**.*.4
                                                                                                                                  Key cache hit for sstable 7 [SharedPool-Worker-3] | 2017-09-05 18:09:37.463001 | **.***.**.237 |           7720 | ***.**.*.4
                                                                                                                                 Defragmenting requested data [SharedPool-Worker-3] | 2017-09-05 18:09:37.463001 | **.***.**.237 |           7779 | ***.**.*.4
                                                                                                                                      Adding to feed memtable [SharedPool-Worker-4] | 2017-09-05 18:09:37.464000 | **.***.**.237 |           7896 | ***.**.*.4
                                                                                                                            Read 1 live and 4 tombstone cells [SharedPool-Worker-3] | 2017-09-05 18:09:37.464000 | **.***.**.237 |           7932 | ***.**.*.4
                                                                                                                                                                   Request complete | 2017-09-05 18:09:37.464092 | **.***.**.237 |           8092 | ***.**.*.4

activity                                                                                                                                              | timestamp                  | source        | source_elapsed | client
-------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------+---------------+----------------+------------
                                                                                                                                    Execute CQL3 query | 2017-09-05 18:09:44.703000 | **.***.**.237 |              0 | ***.**.*.4
                                Parsing select c2 from feed where k1 = 'AAA' and k2 = 'BBB' and c1 = '2017-09-05T16:09:00.222Z'; [SharedPool-Worker-1] | 2017-09-05 18:09:44.704000 | **.***.**.237 |            508 | ***.**.*.4
                                                                                                             Preparing statement [SharedPool-Worker-1] | 2017-09-05 18:09:44.704000 | **.***.**.237 |            717 | ***.**.*.4
                                                                                        Executing single-partition query on feed [SharedPool-Worker-2] | 2017-09-05 18:09:44.704000 | **.***.**.237 |           1377 | ***.**.*.4
                                                                                                    Acquiring sstable references [SharedPool-Worker-2] | 2017-09-05 18:09:44.705000 | **.***.**.237 |           1499 | ***.**.*.4
                                                                                                    Key cache hit for sstable 10 [SharedPool-Worker-2] | 2017-09-05 18:09:44.705000 | **.***.**.237 |           1730 | ***.**.*.4
                                                       Skipped 8/9 non-slice-intersecting sstables, included 5 due to tombstones [SharedPool-Worker-2] | 2017-09-05 18:09:44.705000 | **.***.**.237 |           1804 | ***.**.*.4
                                                                                                    Key cache hit for sstable 22 [SharedPool-Worker-2] | 2017-09-05 18:09:44.705000 | **.***.**.237 |           1858 | ***.**.*.4
                                                                                                    Key cache hit for sstable 21 [SharedPool-Worker-2] | 2017-09-05 18:09:44.705000 | **.***.**.237 |           1908 | ***.**.*.4
                                                                                                    Key cache hit for sstable 12 [SharedPool-Worker-2] | 2017-09-05 18:09:44.705000 | **.***.**.237 |           1951 | ***.**.*.4
                                                                                                     Key cache hit for sstable 6 [SharedPool-Worker-2] | 2017-09-05 18:09:44.705001 | **.***.**.237 |           2002 | ***.**.*.4
                                                                                                     Key cache hit for sstable 3 [SharedPool-Worker-2] | 2017-09-05 18:09:44.705001 | **.***.**.237 |           2037 | ***.**.*.4
                                                                                       Merged data from memtables and 6 sstables [SharedPool-Worker-2] | 2017-09-05 18:09:44.705001 | **.***.**.237 |           2252 | ***.**.*.4
                                                                                               Read 1 live and 4 tombstone cells [SharedPool-Worker-2] | 2017-09-05 18:09:44.705001 | **.***.**.237 |           2307 | ***.**.*.4
                                                                                                                                      Request complete | 2017-09-05 18:09:44.705458 | **.***.**.237 |           2458 | ***.**.*.4
cqlsh> show version [cqlsh 5.0.1 | Cassandra 3.7 | CQL spec 3.4.2 |
Native protocol v4]

आप संतरे के लिए सेब की तुलना कर रहे हैं

  • पहली क्वेरी जो आप सभी पंक्तियों की शर्त को k1 = 'AAA' and k2 = 'BBB' and c1 = '2017-09-05T16:09:00.222Z' and c2 = 'CCC' लिए पूछ रहे हैं, यहां अतिरिक्त स्थिति सी 2 = 'सीसीसी' इतनी कैसंड्रा को उन परिस्थितियों से मेल खाने वाली पंक्तियां लौटने में और काम करने की जरूरत है।

  • दूसरी क्वेरी में आप सी 2 पर मिलान की स्थिति को आराम कर रहे हैं इसलिए आप विभिन्न प्रदर्शन व्यवहार देख सकते हैं।

मान लीजिए आपके पास 1000 पंक्तियाँ हैं जो शर्त k1 = 'AAA' और k2 = 'BBB' और c1 = '2017-09-05T16: 09: 00.222Z' से मेल खाते हैं। सी 2 के लिए शर्त को जोड़ने से केवल 4 पंक्तियां लौट सकती हैं (यह सी 2 की स्थिति के लिए सभी पंक्तियों की जांच करनी पड़ सकती है) जहां एक बार एक बार कश्मीर 1, के 2 और सी 1 से मिलान होने पर परिस्थितियों को निकालना शुरू हो जाएगा।

  • यदि आप वास्तव में तुलना करना चाहते हैं तो आप के बीच प्रदर्शन की तुलना कर सकते हैं

k1 = 'AAA' and k2 = 'BBB' and c1 = '2017-09-05T16:09:00.222Z' and c2 = 'CCC' OR k1 = 'AAA' and k2 = 'BBB' and c1 = '2017-09-05T16:09:00.222Z' and c2 = 'XXX'

साथ ही प्रदर्शन को जांचते समय आपको किसी भी कैशिंग के व्यवहार से बचने के लिए कई बार एक ही प्रश्न को चलाने की आवश्यकता होती है।


यह एक बढ़िया सवाल है, और आपने (मददगार) सभी जानकारी हमें प्रदान करने के लिए प्रदान की है!

आपकी पहली क्वेरी एक बिंदु लुकअप है (क्योंकि आप दोनों क्लस्टरिंग कुंजी निर्दिष्ट करते हैं)। दूसरा टुकड़ा है

यदि हम ट्रेस को देखते हैं, तो आपके ट्रेस में स्पष्ट अंतर है:

Skipped 8/9 non-slice-intersecting sstables, included 5 due to tombstones

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

उस कोड संकेत में टिप्पणी - पहले के लिए:

/**
 * Do a read by querying the memtable(s) first, and then each relevant sstables sequentially by order of the sstable
 * max timestamp.
 *
 * This is used for names query in the hope of only having to query the 1 or 2 most recent query and then knowing nothing
 * more recent could be in the older sstables (which we can only guarantee if we know exactly which row we queries, and if
 * no collection or counters are included).
 * This method assumes the filter is a {@code ClusteringIndexNamesFilter}.
 */

और दूसरा:

    /*
     * We have 2 main strategies:
     *   1) We query memtables and sstables simulateneously. This is our most generic strategy and the one we use
     *      unless we have a names filter that we know we can optimize futher.
     *   2) If we have a name filter (so we query specific rows), we can make a bet: that all column for all queried row
     *      will have data in the most recent sstable(s), thus saving us from reading older ones. This does imply we
     *      have a way to guarantee we have all the data for what is queried, which is only possible for name queries
     *      and if we have neither collections nor counters (indeed, for a collection, we can't guarantee an older sstable
     *      won't have some elements that weren't in the most recent sstables, and counters are intrinsically a collection
     *      of shards so have the same problem).
     */

आपके मामले में, अगर पंक्ति लौटाई मेमेलेट में होती है, तो पहले (बिंदु) पढ़ना तेज़ हो जाएगा इसके अलावा, चूंकि आपके पास 8 एसस्टाबल्स हैं, तो आप STCS या TWCS का उपयोग कर रहे हैं - अगर आप एलसीएस का उपयोग करते हैं, तो यह संभव है कि आप उस विभाजन को ~ 5 एसस्टैबल्स में कॉम्पैक्ट कर लेंगे, और आप (फिर से) अधिक पूर्वानुमानयुक्त पठन प्रदर्शन करेंगे।

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

जब तक आप मरम्मत नहीं पढ़ते हैं (जो कि जब तक प्रतिकृतियों के बीच मूल्यों को बेमेल न हो, या पृष्ठभूमि की मरम्मत के मौके को ट्रिगर किया गया हो) न तो पथ को पढ़ने के लिए डिफ़ॉल्ट रूप से मेमेलेट में कुछ भी जोड़ना चाहिए। नोट करें कि एक टुकड़ा क्वेरी c1 = '2017-09-05T16:09:00.222Z' क्वेरी से बेमेल होने की अधिक संभावना है, क्योंकि यह स्कैन-आधारित है - आप c1 = '2017-09-05T16:09:00.222Z' मिलान वाले मानों के साथ किसी भी / सभी विलोपन मार्करों (टॉम्बस्टोन) को पढ़ लेंगे-मरम्मत करेंगे c1 = '2017-09-05T16:09:00.222Z'

संपादित करें: मुझे ट्रेस में एक पंक्ति याद आई:

Defragmenting requested data

यह एक संकेत है कि आप एसटीसीएस का उपयोग कर रहे हैं और बहुत से स्टोस्टल्स को छुआ है, इसलिए पूरे विभाजन को मेमेलेट में कॉपी किया गया ताकि भविष्य में तेज़ी से पढ़ सके। एसटीसीएस में यह थोड़ा ज्ञात अनुकूलन है, जब आप बहुत सारे सिस्टमों को छूने लगते हैं, तो आप एलसीएस का उपयोग कर इसके आसपास काम कर सकते हैं।