2013-03-07 28 views
1

我有一些問題圍繞着CQL進行包裝。我一直試圖在CQL3中使用列切片(我認爲這是正確的術語),但所有關於它的文檔似乎都涉及到CQL2。組合鍵上的CQL2列切片和CQL3是否相等?

例如,我有如下表:現在

CREATE TABLE eventindex (
    key uuid, 
    column1 int, 
    value uuid, 
    PRIMARY KEY (key, column1) 
) WITH COMPACT STORAGE 

,在CQL2我可以做到以下幾點:

select '1234567890'..'1234567895' from eventindex; 

橫跨所有行返回範圍內的所有列

現在,在CQL3我不能這樣做(至少,不是在cqlsh),但我可以這樣做:

select value from eventindex WHERE column1 > 1234567890 AND column1 <= 1234567895 allow filtering; 

這使我得到的信息基本相同,但格式略有不同。

問題是 - 這些是否相等?事實上,如果我不添加允許篩選,cqlsh會提醒我有關性能問題的事實告訴我,CQL2版本更高效,並且我的CQL3查詢的運行方式不同,但我確實無法找到確認的直接答案我的直覺在這裏。

編輯:,這讓我有關的具體事情是運行CQL2查詢沒有提出投訴cqlsh,但在運行CQL3查詢沒有「允許過濾」,使cqlsh拒絕執行查詢由於擔心憂慮不可預知的表現。

回答

2

我認爲他們基本上是一樣的,雖然我從來沒有遇到過「允許過濾」命令。我很驚訝你可以真正運行該cql,而不指定鍵。如果它不能是這樣的:

select value from eventindex WHERE key = '<key>' 
AND column1 > 1234567890 AND column1 <= 1234567895 

我發現這個職位是非常有用的理解什麼CQL3是引擎蓋下做:

http://www.datastax.com/dev/blog/thrift-to-cql3

+0

呀,實際上,我的鑰匙會像一整天,每一列,這一天中的時間標記,所以在幾乎所有情況下,我會使用關鍵也是如此。至於「allow filtering」命令,如果我想運行該查詢,cqlsh會告訴我使用它,因爲沒有它,它會拒絕運行,因爲查詢性能不可預知。正是那個讓我停下來的警告。 – darkliquid 2013-03-11 09:08:23

+0

看看那篇文章,它看起來很可能是相同的。感謝你的回答。 – darkliquid 2013-03-11 09:21:43

1

的允許過濾命令是存在的,因爲你的查詢可能會導致在讀取的大量(或至少未確定的)數據量中,不會在您的查詢中使用。

select value from eventindex WHERE column1 > 1234567890 AND column1 <= 1234567895; 

此查詢將需要讀取每一行 - 因爲沒有辦法知道特定的行是否在該範圍內具有column1值而不查看該行。不滿足WHERE謂詞的行將被過濾掉。

考慮到大型數據存儲中可能有多少行,默認情況下這是不允許的。但是,在某些情況下,您可能對您的數據足夠了解,以表示「這是合理的,我想這樣做」。在這種情況下,您可以通過使用ALLOW FILTERING來允許它。

當您使用指定分區鍵值的謂詞(例如,WHERE鍵= .....)時,您不會得到此消息,因爲只有滿足這部分謂詞的行需要被看待。

詳情請參見以下內容: http://cassandra.apache.org/doc/cql3/CQL.html#selectStmt

相關問題