Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 为什么在使用默认计划器时,参数化密码查询比未参数化查询花费的时间更长_Performance_Neo4j_Cypher - Fatal编程技术网

Performance 为什么在使用默认计划器时,参数化密码查询比未参数化查询花费的时间更长

Performance 为什么在使用默认计划器时,参数化密码查询比未参数化查询花费的时间更长,performance,neo4j,cypher,Performance,Neo4j,Cypher,我正在使用neo4j-2.2.1并使用事务性Cypher Restful端点进行查询。我正在尝试使用以下查询匹配电子邮件节点 match (e:Email) where e.email in ['gxxxxxxs@yyy.com'] return count(e); “电子邮件”节点中的“电子邮件”属性对其具有唯一的约束,因此有一个自动围绕其构建的索引。当我使用{“statements”:[{“parameters”:{“emails”:[gxxxxxxs@yyy.com“]},”语句“:“匹

我正在使用neo4j-2.2.1并使用事务性Cypher Restful端点进行查询。我正在尝试使用以下查询匹配电子邮件节点

match (e:Email) where e.email in ['gxxxxxxs@yyy.com'] return count(e);
“电子邮件”节点中的“电子邮件”属性对其具有唯一的约束,因此有一个自动围绕其构建的索引。当我使用
{“statements”:[{“parameters”:{“emails”:[gxxxxxxs@yyy.com“]},”语句“:“匹配(c:Email)其中c.Email在{emails}返回计数(c)”}]}
where as当我在没有任何参数的情况下直接运行它时,只花了0.0134秒,如中所示
{“语句”:[{“语句”:“匹配(c:Email),其中c.Email在['gxxxxxxs@yyy.com“]返回计数(c)”}]}

我试图对其进行分析,以了解查询是如何执行的,令我惊讶的是,参数化查询没有使用我期望它使用的唯一索引seek

分析结果如下所示-

非参数化查询的配置文件 {“statements”:[{“statement”:“PROFILE match(c:Email),其中c.Email位于['gxxxxxxs@yyy.com“]返回计数(c)”}]}

{“结果”:[{“列”:[“计数(c)”],“数据”:[{“行”:[1]}],“计划”:{“根”:{“运算符类型”:“聚合”,“数据点击数”:0,“行”:1,版本”:“CYPHER 2.2,“键名”:“估计数”:1.0000000000 279299,计划员:“”,“标识符”:[“计数(c)”,“子项”:“NodeUniqueIndexSeek,“索引”:“:Email(Email)”,“Rows”:1,“DbHits”:1,“EstimatedRows”:1.0000000000 5586,“标识符”:[“c”],“子项”:[]}],“错误”:[]}

以0.01340048461914秒完成

参数化查询的配置文件 {“语句”:[{“参数”:{“电子邮件”:[”gxxxxxx@yyy.com“]},”语句“:“配置文件匹配(c:Email),其中c.Email在{emails}返回计数(c)}]} {“结果”:[{“列”:[“计数(c)”],“数据”:[{“行”:[1]}],“计划”:{“根”:{“运算符类型”:“聚合”,“数据点击数”:0,“行”:1,版本”:“CYPHER 2.2,“键名”:“估计数”:1384.8193022918188,计划员:“成本”;“标识符”:[“计数(c)”,“子项”:“{“运算符类型”:“过滤器”,“LegacyExpression”:“任何”(-INNER--in{emails},其中c.email==--INNER--),“Rows”:1,“DbHits”:5114522,“EstimatedRows”:1917724.49999998,“identifiers”:[“c”],“children”:[{“运算符类型”:“NodeByLabelScan,“LabelName”:“email”,“Rows”:2557261,“DbHits”:2557262,“EstimatedRows”:2556966.0,“identifiers”:[“c”],“children”;“children:[]}],“errors[]}}

以23.5868499279秒完成


有人能帮我理解为什么参数化密码查询没有使用唯一索引seek

对于参数化查询,密码引擎似乎没有推断要使用的正确模式索引,因此正在进行扫描。通常,密码引擎需要通过查看他将
匹配
子句和
WHERE
条件,并使用该信息查找有用的索引

您可以使用,要求它使用一个特定的索引

MATCH (c:Email) 
USING INDEX c:Email(email)
WHERE c.email in ['gxxxxxxs@yyy.com'] 
RETURN count(c)
您应该发现查询是使用
NodeUniqueIndexSeek
执行的

{
    "statements": [{
        "parameters": {
            "emails": ["gxxxxxxs@yyy.com"]
        }, 
        "statement": "MATCH (c:Email) 
                      USING INDEX c:Email(email) 
                      WHERE c.email IN {emails} 
                      RETURN count(c)"
    }]
}

(为便于阅读,增加了换行符)

对于参数化查询,密码引擎似乎没有推断出要使用的正确模式索引,因此正在进行扫描。通常,密码引擎需要通过查看
MATCH
子句和
where
条件并使用该信息查找usef来推断在图中的何处开始查询ul索引

您可以使用
,要求它使用一个特定的索引

MATCH (c:Email) 
USING INDEX c:Email(email)
WHERE c.email in ['gxxxxxxs@yyy.com'] 
RETURN count(c)
您应该发现查询是使用
NodeUniqueIndexSeek
执行的

{
    "statements": [{
        "parameters": {
            "emails": ["gxxxxxxs@yyy.com"]
        }, 
        "statement": "MATCH (c:Email) 
                      USING INDEX c:Email(email) 
                      WHERE c.email IN {emails} 
                      RETURN count(c)"
    }]
}

(为便于阅读,增加了换行符)

对于参数化查询,密码引擎似乎没有推断出要使用的正确模式索引,因此正在进行扫描。通常,密码引擎需要通过查看
MATCH
子句和
where
条件并使用该信息查找usef来推断在图中的何处开始查询ul索引

您可以使用
,要求它使用一个特定的索引

MATCH (c:Email) 
USING INDEX c:Email(email)
WHERE c.email in ['gxxxxxxs@yyy.com'] 
RETURN count(c)
您应该发现查询是使用
NodeUniqueIndexSeek
执行的

{
    "statements": [{
        "parameters": {
            "emails": ["gxxxxxxs@yyy.com"]
        }, 
        "statement": "MATCH (c:Email) 
                      USING INDEX c:Email(email) 
                      WHERE c.email IN {emails} 
                      RETURN count(c)"
    }]
}

(为便于阅读,增加了换行符)

对于参数化查询,密码引擎似乎没有推断出要使用的正确模式索引,因此正在进行扫描。通常,密码引擎需要通过查看
MATCH
子句和
where
条件并使用该信息查找usef来推断在图中的何处开始查询ul索引

您可以使用
,要求它使用一个特定的索引

MATCH (c:Email) 
USING INDEX c:Email(email)
WHERE c.email in ['gxxxxxxs@yyy.com'] 
RETURN count(c)
您应该发现查询是使用
NodeUniqueIndexSeek
执行的

{
    "statements": [{
        "parameters": {
            "emails": ["gxxxxxxs@yyy.com"]
        }, 
        "statement": "MATCH (c:Email) 
                      USING INDEX c:Email(email) 
                      WHERE c.email IN {emails} 
                      RETURN count(c)"
    }]
}

(为了可读性增加了换行符)

这是自2.2+以来Cypher中报告的一个错误。(不使用带参数的索引)

您可以通过在查询前面加上规划器规则来避免这种情况,以便使用以前的Cypher规划器并获得性能,直到修复错误为止

PLANNER RULE MATCH (e:Email) where e.email IN {emails} RETURN count(e);

这是自2.2+以来Cypher中报告的错误(不使用带参数的索引)

您可以通过在查询前面加上规划器规则来避免这种情况,以便使用以前的Cypher规划器并获得性能,直到修复错误为止

PLANNER RULE MATCH (e:Email) where e.email IN {emails} RETURN count(e);

这是自2.2+以来Cypher中报告的错误(不使用带参数的索引)