【问题标题】:Couchbase Performance沙发底座性能
【发布时间】:2015-11-04 00:58:47
【问题描述】:

我有 Couchbase 社区版 v4,构建 4047。在我开始针对简单视图发出查询之前,一切似乎都很棒。视图只是像这样投影文档,这似乎无害:

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);
                }
            }
        }

【问题讨论】:

  • 你能贴出你用来查询索引的c#代码sn-p吗?特别是,如何创建参数并将其添加到 QueryView arg。另外,为什么要发出 meta.id 作为值?无论如何,视图都会自动将原始文档的 id 发送到索引中(您从查询中获得的每一行结果都有一个 Id 属性。)
  • 嗨大卫,我发布了查询的代码。至于为什么我在它已经是文档的一部分时提取 id 是因为我真的不想要整个文档。没有必要传输所有内容。我只想提取包含特定应用程序 ID 的所有内容的 ID。谢谢。

标签: couchbase


【解决方案1】:

代码看起来不错,应该可以按预期工作。您提到分配的 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';

请注意,像 DELETE 这样的 DML 语句仍被视为 Couchbase 4.0 中的测试版功能,因此请自行进行风险评估。

要从 .NET 运行 N1QL 查询,您可以使用与视图几乎相同的语法:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多