2015-11-01 73 views
1

我有Couchbase社区版v4,编译版本4047.一切似乎都很棒,直到我开始发布针对简单视图的查询。该视图仅仅状地突出的单据,这似乎是无害的:Couchbase性能

function (doc, meta) { 
    if(doc.applicationId){ 
    emit(doc.applicationId,meta.id); 
    } 
} 

我使用.NET客户端进行连接,并从我的应用程序执行查询,但我不认为事情做。这是一个单节点配置。我在实际的http请求之间计时,如果我通过Fiddler发送类似15个请求的请求,查询需要4秒到2分钟以上。

我正在使用陈旧的索引来尝试和提高那个时间,但它似乎没有太大的影响。水桶不是很大。桶中只有几个文件。我已经为索引分配了100M RAM。至少我们目前正在使用的少数文档,我认为这很好。

这主要是本地开发,但我们在提升到服务器时观察到类似的行为。服务器也不使用大量的RAM,但同时我们不存储大量的文档。我们最多只谈10或20个?这些文档只包含5个原始类型的属性。

您是否对诊断有一些建议?通过couchbase管理控制台的日志没有显示任何异常,据我所知,这似乎不像正常行为。

更新: 这里是我的代码来查询文件

 public async Task ExpireCurrentSession(string applicationId) 
     { 
      using (var bucket = GetSessionBucket()) 
      { 
       var query = bucket 
        .CreateQuery("activeSessions", "activeSessionsByApplicationId") 
        .Key(applicationId) 
        .Stale(Couchbase.Views.StaleState.Ok); 

       var result = await bucket.QueryAsync<string>(query); 

       foreach (var session in result.Rows) 
       { 
        await bucket.RemoveAsync(session.Value); 
       } 
      } 
     } 
+0

你可以张贴片断您使用查询索引的C#代码?特别是,你如何创建和向QueryView arg添加参数。另外,你为什么发出meta.id作为价值?无论如何,该视图会自动将原始文档的ID发送到索引中(您从查询中获得的每一行结果都有一个Id属性。) –

+0

嗨大卫,我发布了查询的代码。至于为什么我提取id时它已经是文档的一部分,因为我真的不想要整个文档。没有必要传输一切。我只是想把所有包含特定应用程序标识的id都拉出来。谢谢。 – Fratt

回答

0

代码似乎罚款,并按照您的预期应该工作。您提到的100mb RAM实际上并不适用于视图,它仅影响N1QL全局二级索引。这给我带来了以下建议:

您不需要在Couchbase 4.0中使用此视图;你可以使用N1QL来做到这一点更简单和(可能)更有效。

创建的applicationId领域N1QL指数(无论是从cbq命令行shell代码),像这样:

CREATE INDEX ix_applicationId ON bucketName(applicationId) USING GSI; 

然后,您可以使用一个简单的SELECT查询来获得相关文档ID:

SELECT META(bucketName) FROM bucketName WHERE applicationId = '123'; 

或者更简单,你可以只使用一个DELETE查询,直接删除它们:

DELETE FROM bucketName WHERE applicationId = '123'; 

请注意,DOLL语句(如DELETE)仍然被认为是Couchbase 4.0中的测试版功能,所以请自行进行风险评估。

运行从.NET使用几乎相同的语法观点N1QL查询:

await bucket.QueryAsync<dynamic>("QUERY GOES HERE");