2013-11-03 3 views
16

मैं CQL-खराब अनुरोध: समान अनुक्रमक के साथ उप-कॉलम खंड में मौजूद कोई अनुक्रमित कॉलम नहीं: CQL त्रुटि?

create table test (
    employee_id text, 
    employee_name text, 
    value text, 
    last_modified_date timeuuid, 
    primary key (employee_id) 
    ); 

में नीचे दी गई तालिका है मैं इस तरह उपरोक्त तालिका जो मैं में डालने की जाएगी में अभिलेखों की जोड़ी डाला हमारी वास्तविक उपयोग के मामले scenario-

insert into test (employee_id, employee_name, value, last_modified_date) values ('1', 'e27', 'some_value', now()); 
insert into test (employee_id, employee_name, value, last_modified_date) values ('2', 'e27', 'some_new_value', now()); 
insert into test (employee_id, employee_name, value, last_modified_date) values ('3', 'e27', 'some_again_value', now()); 
insert into test (employee_id, employee_name, value, last_modified_date) values ('4', 'e28', 'some_values', now()); 
insert into test (employee_id, employee_name, value, last_modified_date) values ('5', 'e28', 'some_new_values', now()); 

अब मैं कर रहा था के लिए क्वेरी का चयन करें - मुझे कर्मचारी_नाम e27 के लिए सभी कर्मचारी_आईडी दें।

select employee_id from test where employee_name = 'e27'; 

और इस त्रुटि मैं हो रही है -

Bad Request: No indexed columns present in by-columns clause with Equal operator 
Perhaps you meant to use CQL 2? Try using the -2 option when starting cqlsh. 

वहाँ कुछ भी गलत मैं यहाँ कर रहा हूँ है?

मेरे उपयोग के मामलों सामान्य रूप में कर रहे हैं -

  1. मुझे employee_name से किसी के लिए सब कुछ दे दो?
  2. मुझे पिछले 5 मिनट में क्या बदल गया है इसके लिए सब कुछ दें?
  3. मुझे किसी कर्मचारी_नाम के लिए नवीनतम कर्मचारी_आईडी और मूल्य दें?
  4. मुझे किसी कर्मचारी_नाम के लिए सभी कर्मचारी_आईडी दें?

मैं कैसेंड्रा 1.2.11

उत्तर

24

सामान्य नियम चला रहा हूँ सरल है: "आप कर सकते हैं स्तंभ ही कुंजी का हिस्सा हैं द्वारा क्वेरी"। एक स्पष्टीकरण के रूप में अन्य सभी प्रश्नों को टेबल के पूर्ण स्कैन की आवश्यकता होगी जिसका अर्थ हो सकता है कि बहुत से डेटा स्थानांतरण हो सकते हैं।

वहाँ चीजें हैं जो इस नियम को संशोधित कर सकते हैं: कम प्रमुखता के साथ स्तंभों के लिए

  1. उपयोग माध्यमिक अनुक्रमित (अधिक जानकारी के here)
  2. बहु-स्तंभ कुंजी को परिभाषित (जैसे PRIMARY KEY (col1, col2); जो col1 = value1 तरह के प्रश्नों की अनुमति होगी और col1 = value1 and col2 COND)
  3. प्रश्नों में ALLOW FILTERING का उपयोग करें। इसके परिणामस्वरूप एक चेतावनी होगी क्योंकि कैसंद्रा को बहुत सारे डेटा के माध्यम से जाना होगा और कोई प्रदर्शन गारंटी नहीं होगी। अधिक जानकारी के लिए details of ALLOW FILTERING in CQL और this SO thread
+1

आपके संदर्भ के लिए, आप 'CREATE INDEX ON परीक्षण (कर्मचारी_नाम)' के साथ एक माध्यमिक कुंजी बना सकते हैं; – chinglun

+0

'1' में लिंक 500 से लगातार – Squidly

+0

हिट करता है फिर यह गैर प्राथमिक कुंजी के बारे में एक और त्रुटि फेंकता है। नोट: मेरे उदाहरण में कॉलम अंतिम नाम है। { 'सर्वर से एक त्रुटि संदेश का प्रतिनिधित्व करता है', : 'ResponseError', संदेश:, जानकारी 'गैर प्राथमिक कुंजी जहां खंड में पाया अंतिम नाम': नाम [ResponseError गैर प्राथमिक कुंजी जहां खंड में पाया LASTNAME] कोड: 8704, क्वेरी: 'अद्यतन उपयोगकर्ता SET आयु = 36 जहां अंतिम नाम = \' जोन्स \ ''} –

16

देख कैसेंड्रा एक छोटे से इस्तेमाल किया जा रहा है के लिए :) हम में से कुछ अतिरिक्त सामान आरडीबीएमएस आप के लिए करता है कि आप NoSQL से मुक्त करने के लिए नहीं मिलता है में से कुछ के द्वारा खराब कर दिया है ले लो।

यदि आप नियमित आरडीबीएमएस तालिका पर वापस सोचते हैं, तो यदि आप किसी ऐसे कॉलम पर चयन करते हैं जिसमें कोई अनुक्रमणिका नहीं है, तो डीबी को आपके द्वारा प्राप्त किए जाने वाले सभी मिलानों को ढूंढने के लिए एक पूर्ण-तालिका स्कैन करना होगा। यह कैसंद्रा में नो-नो है, और यदि आप ऐसा करने का प्रयास करते हैं तो यह शिकायत करेगा। कल्पना कीजिए कि क्या आपको इस क्वेरी में 10^32 मैचों मिले? यह एक उचित सवाल नहीं है।

अपनी तालिका में, आपने * प्राथमिक कुंजी (कर्मचारी_आईडी) कोड किया है; * यह पंक्ति की प्राथमिक और अद्वितीय पहचान कुंजी है। अब आप टेस्ट से * चयन कर सकते हैं जहां कर्मचारी_आईडी = '123'; यह पूरी तरह से उचित है और कैसंद्रा खुशी से परिणाम वापस कर देगा।

हालांकि, आपके परीक्षा से चुनें कर्मचारी_नाम = 'ई 27'; कैसंद्रा को जाने और प्रत्येक रिकॉर्ड को तब तक पढ़ता है जब तक कि इसे 'ई 27' पर कोई मिलान न मिल जाए। किसी भी सूचकांक पर भरोसा नहीं करने के साथ, यह विनम्रतापूर्वक आपको 'इसे भूलने' के लिए कहता है।

यदि आप कॉलम पर फ़िल्टर करना चाहते हैं, तो सुनिश्चित करें कि आपके पास उस कॉलम पर एक अनुक्रमणिका है ताकि कैसंड्रा आपको आवश्यक फ़िल्टरिंग कर सके।

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