Couchbase Analytics:无结果,Couchbase内部服务器错误,索引带有UNIXTIME毫秒时间戳

Couchbase Analytics:无结果,Couchbase内部服务器错误,索引带有UNIXTIME毫秒时间戳,couchbase,couchbase-analytics,Couchbase,Couchbase Analytics,当我在时间序列数据上添加类似以下内容的索引时,我遇到了奇怪的分析查询行为: { "clientId": "account-123", "orderCode": "49776599-cd7f-458a-b0f2-2d4f28aab85f", "timestamp": 1591869354000 // UNIX time milliseconds } 索引包含所有三个字段 index_clientId_timestamp_orderCode (clientId:string

当我在时间序列数据上添加类似以下内容的索引时,我遇到了奇怪的分析查询行为:

{
    "clientId": "account-123",
    "orderCode": "49776599-cd7f-458a-b0f2-2d4f28aab85f",
    "timestamp": 1591869354000 // UNIX time milliseconds
}
索引包含所有三个字段

index_clientId_timestamp_orderCode (clientId:string)(timestamp:int64)(orderCode:string)`
古怪的行为

  • 当我过滤
    clientId
    orderCode
  • 如果我在
    timestamp
    上添加一个过滤器,那么couchbase服务器会出错
  • 在Couchbase Enterprise Edition 6.5.0 build 4960上复制的步骤 在bucket中插入一些数据

    插入“数据”(键、值)
    值(“key1”,“clientId:“account-123”,“orderCode:“49776599-cd7f-458a-b0f2-2d4f28aab85f”,“timestamp:”1591869354000}),
    值(“key2”,“clientId:“account-123”,“orderCode:”8e2a8061-c69e-40ee-8ff4-e1fc6f03f76a”,“timestamp:”1591869355000}),
    值(“key3”、{“clientId”:“account-123”、“orderCode”:“757d33a6-85e7-4053-ad8b-bacc69ad0200”、“时间戳”:1591869356000}),
    值(“key4”,“clientId:“account-123”,“orderCode:“c6022d17-80bf-497f-8f9d-f865896231dc”,“时间戳”:1591869357000})
    
    创建分析数据集:

    在`data`上创建数据集订单,其中`clientId`=“account-123”;
    
    运行以下分析查询,该查询应按预期工作:

    选择“订单”*
    从“订单”到“订单”
    哪里
    `客户ID`='account-123'
    和“订单代码”=“49776599-cd7f-458a-b0f2-2d4f28aab85f”
    和'timestamp`>1591860000000
    
    创建索引以便查询能够更好地扩展:

    在'orders'('clientId`:STRING,'timestamp`:INT64,'orderCode`:STRING)上创建索引索引\u clientId\u timestamp\u orderCode
    
    再次运行查询:

    选择“订单”*
    从“订单”到“订单”
    哪里
    `客户ID`='account-123'
    和“订单代码”=“49776599-cd7f-458a-b0f2-2d4f28aab85f”
    和'timestamp`>1591860000000
    
    您应该会得到一个错误:

    [
      {
        "code": 25000,
        "msg": "Internal error",
        "query_from_user": "SELECT `orders`.*\nFROM `orders` orders\nWHERE\n  `clientId` = 'account-123'\n  AND `orderCode` = '49776599-cd7f-458a-b0f2-2d4f28aab85f'\n  AND `timestamp` > 1591860000000"
      }
    ]
    
    当我查看
    /opt/couchbase/var/lib/couchbase/logs/analytics\u error.log
    时,我看到以下错误

    2020-06-11T14:58:34.561+00:00 ERRO CBAS.apache.asterix [Executor-104:ClusterController] Unexpected exception
    java.lang.NullPointerException: null
            at org.apache.asterix.optimizer.rules.am.BTreeAccessMethod.createKeyVarsAndExprs(BTreeAccessMethod.java:773) ~[asterix-algebra.jar:6.5.0-4960]
            at org.apache.asterix.optimizer.rules.am.BTreeAccessMethod.createIndexSearchPlan(BTreeAccessMethod.java:585) ~[asterix-algebra.jar:6.5.0-4960]
            at org.apache.asterix.optimizer.rules.am.BTreeAccessMethod.applySelectPlanTransformation(BTreeAccessMethod.java:183) ~[asterix-algebra.jar:6.5.0-4960]
            at org.apache.asterix.optimizer.rules.am.IntroduceSelectAccessMethodRule.checkAndApplyTheSelectTransformation(IntroduceSelectAccessMethodRule.java:431) ~[asterix-algebra.jar:6.5.0-4960]
            at org.apache.asterix.optimizer.rules.am.IntroduceSelectAccessMethodRule.checkAndApplyTheSelectTransformation(IntroduceSelectAccessMethodRule.java:343) ~[asterix-algebra.jar:6.5.0-4960]
            at org.apache.asterix.optimizer.rules.am.IntroduceSelectAccessMethodRule.checkAndApplyTheSelectTransformation(IntroduceSelectAccessMethodRule.java:343) ~[asterix-algebra.jar:6.5.0-4960]
            at org.apache.asterix.optimizer.rules.am.IntroduceSelectAccessMethodRule.checkAndApplyTheSelectTransformation(IntroduceSelectAccessMethodRule.java:343) ~[asterix-algebra.jar:6.5.0-4960]
            at org.apache.asterix.optimizer.rules.am.IntroduceSelectAccessMethodRule.rewritePre(IntroduceSelectAccessMethodRule.java:168) ~[asterix-algebra.jar:6.5.0-4960]
            at org.apache.hyracks.algebricks.core.rewriter.base.AbstractRuleController.rewriteOperatorRef(AbstractRuleController.java:86) ~[algebricks-core.jar:6.5.0-4960]
            at org.apache.hyracks.algebricks.compiler.rewriter.rulecontrollers.SequentialFixpointRuleController.rewriteWithRuleCollection(SequentialFixpointRuleController.java:52) ~[algebricks-compiler.jar:6.5.0-4960]
            at org.apache.hyracks.algebricks.core.rewriter.base.HeuristicOptimizer.runOptimizationSets(HeuristicOptimizer.java:89) ~[algebricks-core.jar:6.5.0-4960]
            at org.apache.hyracks.algebricks.core.rewriter.base.HeuristicOptimizer.runLogicalOptimizationSets(HeuristicOptimizer.java:80) ~[algebricks-core.jar:6.5.0-4960]
            at org.apache.hyracks.algebricks.core.rewriter.base.HeuristicOptimizer.optimize(HeuristicOptimizer.java:61) ~[algebricks-core.jar:6.5.0-4960]
            at org.apache.hyracks.algebricks.compiler.api.HeuristicCompilerFactoryBuilder$1$1.optimize(HeuristicCompilerFactoryBuilder.java:94) ~[algebricks-compiler.jar:6.5.0-4960]
            at org.apache.asterix.api.common.APIFramework.compileQuery(APIFramework.java:255) ~[asterix-app.jar:6.5.0-4960]
            at org.apache.asterix.app.translator.QueryTranslator.rewriteCompileQuery(QueryTranslator.java:1982) ~[asterix-app.jar:6.5.0-4960]
            at org.apache.asterix.app.translator.QueryTranslator.lambda$handleQuery$3(QueryTranslator.java:2491) ~[asterix-app.jar:6.5.0-4960]
            at org.apache.asterix.app.translator.QueryTranslator.createAndRunJob(QueryTranslator.java:2623) ~[asterix-app.jar:6.5.0-4960]
            at org.apache.asterix.app.translator.QueryTranslator.deliverResult(QueryTranslator.java:2536) ~[asterix-app.jar:6.5.0-4960]
            at org.apache.asterix.app.translator.QueryTranslator.handleQuery(QueryTranslator.java:2506) ~[asterix-app.jar:6.5.0-4960]
            at org.apache.asterix.app.translator.QueryTranslator.compileAndExecute(QueryTranslator.java:399) ~[asterix-app.jar:6.5.0-4960]
            at org.apache.asterix.app.message.ExecuteStatementRequestMessage.handle(ExecuteStatementRequestMessage.java:153) ~[asterix-app.jar:6.5.0-4960]
            at org.apache.asterix.messaging.CCMessageBroker.receivedMessage(CCMessageBroker.java:64) ~[asterix-app.jar:6.5.0-4960]
            at org.apache.hyracks.control.cc.work.ApplicationMessageWork.lambda$notifyMessageBroker$0(ApplicationMessageWork.java:68) ~[hyracks-control-cc.jar:6.5.0-4960]
            at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [?:?]
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [?:?]
            at java.lang.Thread.run(Unknown Source) [?:?]
    
    从谓词中删除时间戳筛选器将导致搜索按预期返回。然而,当我为我的雇主在更大的数据集上有效地执行相同的操作时,我根本没有得到匹配项。不过,我无法用上面的例子重现这种行为


    感谢您的帮助:)

    这似乎是优化器中的一个错误

    请尝试创建两个索引:

    CREATE INDEX index_clientId_orderCode ON `orders`(`clientId`:STRING, `orderCode`:STRING)
    CREATE INDEX index_timestamp ON `orders`(`timestamp`:BIGINT)
    
    此外,orderCode值看起来是唯一的(或基数较低)。您是否可以在此基础上创建一个索引,并在查询执行时计算剩余的过滤器

    CREATE INDEX index_orderCode ON `orders`(`orderCode`:STRING)
    
    另一个解决方法是保留现有的索引定义,但在时间戳上添加一个上限过滤器:

    ... AND `timestamp` > 1591860000000 and `timestamp` < 9999999999999999
    
    。。。和'timestamp`>1591860000000和'timestamp`<999999999999
    
    我用最新版本复制了错误:Couchbase Enterprise Edition 6.5.1 build 6299。感谢Dmitry的建议,我将尝试并报告。我一直在使用不同的索引运行基准测试,到目前为止,我想到的最佳组合是在clientId和timestamp上有一个索引,然后在clientId和orderCode上再添加一个。任何其他组合都会导致上述错误,或导致整体性能更差。