cassandra 'in' query 지원

nosql 2013. 11. 7. 10:45

cassandra 2.0.2를 사용하고 있다. (1.2부터 지원된 듯 하다.. 정확한 것은 잘 모름..)


cassandra in query가 지원될까 테스트해봤는데, 지원이 된다. primary key로 지정한 column 에 대해서 in query를 사용하면 에러 난다. 



cqlsh:userkeyspace> describe table cf21;


CREATE TABLE cf21 (

  key text,

  number text,

  name text,

  PRIMARY KEY (key, number)

) WITH COMPACT STORAGE AND

  bloom_filter_fp_chance=0.010000 AND

  caching='KEYS_ONLY' AND

  comment='' AND

  dclocal_read_repair_chance=0.000000 AND

  gc_grace_seconds=864000 AND

  index_interval=128 AND

  read_repair_chance=0.100000 AND

  replicate_on_write='true' AND

  populate_io_cache_on_flush='false' AND

  default_time_to_live=0 AND

  speculative_retry='NONE' AND

  memtable_flush_period_in_ms=0 AND

  compaction={'class': 'SizeTieredCompactionStrategy'} AND

  compression={'sstable_compression': 'LZ4Compressor'};


아래와 같이 primary key단위로 사용하면 동작된다. 

cqlsh:userkeyspace> select * from cf21 where key in ('row1') and number in ('1') ;


 key  | number | name

------+--------+------

 row1 |      1Kim


(1 rows)


cqlsh:userkeyspace> select * from cf21 where key in ('row1')  ;


 key  | number | name

------+--------+------

 row1 |      1Kim

 row1 |      2Yun

 row1 |      3 | Park




그러나 pk 중 두번째 에 대해서  in query를 사용하면 에러가 발생한다.  


cqlsh:userkeyspace> select * from cf21 where number in ('1');

Bad Request: Cannot execute this query as it might involve data filtering and thus may have unpredictable performance. If you want to execute this query despite the performance unpredictability, use ALLOW FILTERING



ALLOW FILTERING; 을 query 끝에 붙여주면 된다. 성능 저하가 되는 이유는 cluster 모두에 요청을 하기 때문에 성능에 제약을 걸린다는 얘기라 할 수 있다. 데이터 모델링을 잘 해야 한다. 



cqlsh:userkeyspace> select * from cf21 where number in ('1', '2') ALLOW FILTERING;


 key  | number | name

------+--------+------

 row1 |      1Kim

 row1 |      2Yun

 row2 |      1 | Choi


(3 rows)





참고로 index만 걸려 있게 하고, in query를 사용하면 에러 난다.


cqlsh:userkeyspace> describe table cf33;


CREATE TABLE cf33 (

  key text,

  name text,

  number text,

  PRIMARY KEY (key)

) WITH

  bloom_filter_fp_chance=0.010000 AND

  caching='KEYS_ONLY' AND

  comment='' AND

  dclocal_read_repair_chance=0.000000 AND

  gc_grace_seconds=864000 AND

  index_interval=128 AND

  read_repair_chance=0.100000 AND

  replicate_on_write='true' AND

  populate_io_cache_on_flush='false' AND

  default_time_to_live=0 AND

  speculative_retry='NONE' AND

  memtable_flush_period_in_ms=0 AND

  compaction={'class': 'SizeTieredCompactionStrategy'} AND

  compression={'sstable_compression': 'LZ4Compressor'};


CREATE INDEX name ON cf33 (name);



cqlsh:userkeyspace> select * from cf33 where name in ('John') ALLOW FILTERING;

Bad Request: No indexed columns present in by-columns clause with Equal operator

cqlsh:userkeyspace> select * from cf33 where key in ('John') ALLOW FILTERING;


(0 rows)




Posted by '김용환'
,