2015-09-15 48 views
0

我想知道,使用apache cassandra與java結合使用會更快。我有以下幾種選擇讓我的結果:Cassandra java查詢性能計數(*)或全部()。size()

Statement s = QueryBuilder.select().from("table").where(QueryBuilder.eq("source",source)); 
      ResultSet resultSet = session.execute(s); 
if(resultSet.all().size() == 0){ 
//DO SOMETHING 
} 

第二個選項來實現我的計數:

ResultSet rs = session.execute("SELECT COUNT(*) as coun FROM table WHERE source = '"+source+"'"); 
Row r = rs.one(); 
if(r.getLong("coun")==0){ 
//... 
} 

在每個查詢中的最大數爲1。現在我的問題是,這將是一般來說更快。

+1

只有知道的方法是分析它。但作爲第二個不會返回行,我會默認情況下,該行。 – weston

+2

也不,如果你正在做count(*)等分析查詢,你可能需要像cassandra的Spark ontop那樣的東西。 – phact

回答

0

我在多個表上測試了查詢,該版本與COUNT(*)比使用resultSet.all快得多()。大小()== 0。我用CQLSH嘗試這與下面的查詢,這應該等於更快java的一個的:

SELECT COUNT(*) as coun FROM table WHERE source = '...'; 

而一個較慢:

SELECT * FROM table WHERE source = '...'; 
0

只需撥打System.currentTimeMillis()即可將這兩個選項打印出來。 如果毫秒的精度是不夠的嘗試System.nanoTime()

long start = System.currentTimeMillis(); 
<YourMethod> 
long end = System.currentTimeMillis(); 
long dif = end-start; 
+0

確保多次運行查詢以獲得一個好的示例。在嘗試優化CQLSH中的查詢時,NODETOOL可以提供幫助。 – Nathan

0

你必須THI根據網絡流量來查詢這兩個查詢,並且這不僅對cassandra有效,而且對網絡上的任何請求(例如, JDBC請求,其餘請求)

SELECT * FROM table WHERE source = '...'; 

當你執行這個查詢然後調用的ResultSet#你是檢索所有(*)的分區(在where子句顯然持有至極的)的進程的內存使用datastax驅動程序並使用所有行實例化ArrayList,最後調用一個簡單的List#大小。 你要記住,Latency is evil

(*)請注意,所有的方法也可以產卵在網絡上的多個請求時,查詢檢索的行數比fetch size更大。這是更多的延遲!

SELECT COUNT(*) as coun FROM table WHERE source = '...'; 

使用此查詢,您也支付延遲,但只有不可避免的。這就是將查詢發送到cassandra集羣並接收響應的RTT。 由於這是一個簡單的整數,它不會因分頁而產生多個請求,而且會消耗很少的帶寬。

此外,恕我直言,它將是一個更好的選擇使用選擇計數(如果你根本不需要行信息),因爲你正在明確你需要什麼,這可能會給服務器的機會(數據庫,Web服務器等)以特定方式處理請求並提高性能。 例如,如果您的查詢沒有where子句並且您只需要總行數,那麼服務器可以利用每個表的內部計數器並更快地提供查詢。但是,this is not the case in cassandra(因爲在cassandra模型中不可能保持計數器的一致性),但我認爲這很清楚我的意思。