我似乎无法减少查询时间
I can't seem to get my query times down
我在 google 上进行了搜索,想知道去哪里询问查询分析,但一切都让我回到了这里。如果我错了,我深表歉意,这应该放在其他地方。
这是我的数据库(运行ning Neo4j 服务器 v3.4)的当前统计信息:
我的 Neo4jClient 查询:
var query = graphClient
.Cypher
.Match("(cp:CurrencyPair) - [:Currency_Pair] -> (mkt:MarketInfo)")
.With("mkt, cp")
.Where((CurrencyPair cp) => cp.Name == Pair.Name)
.AndWhere((MarketInfo mkt) => mkt.StartTicksUTC >= startTicks)
.AndWhere((MarketInfo mkt) => mkt.EndTicksUTC <= endTicks)
.With("mkt, cp")
.OrderBy("mkt.EndTicksUTC DESC")
.Match("(mkt) -[Ask_Input_Data] - (a:Ask)")
.With("mkt, cp, a")
.Match("(mkt) -[Bid_Input_Data] - (b:Bid)")
.With("mkt, cp, a, b")
.Return((mkt, cp, a, b) => new
{
MarketInfo = mkt.As<MarketInfo>(),
CurrencyPair = cp.As<CurrencyPair>(),
Ask = a.As<Ask>(),
Bid = b.As<Bid>()
});
生成的 Neo4j 查询:
profile
MATCH (cp:CurrencyPair) - [Currency_Pair] -> (mkt:MarketInfo)
WITH mkt, cp
WHERE (cp.Name = "AUD/CAD") AND (mkt.StartUTC >= "2012-01-10T15:50:00+00:00" ) AND (mkt.StartUTC <= "2012-01-10T16:00:00+00:00" )
WITH mkt, cp
ORDER BY mkt.EndTicksUTC DESC
MATCH (mkt:MarketInfo) <-[Ask_Input_Data] - (a:Ask)
WITH mkt, cp, a
MATCH (mkt:MarketInfo) <-[Bid_Input_Data] - (b:Bid)
WITH mkt, cp, a, b
RETURN mkt AS MarketInfo, cp AS CurrencyPair, a AS Ask, b AS Bid
如您所见,我正在尝试查询数据库以查找与给定货币节点相关的所有 "MarketInfo" 节点,然后是仅在两个日期之间的 return 节点。
运行这个查询,需要7秒运行:
和returns 10个节点,15个关系
我在数据库中有索引:
索引
ON :NewsEvent(Date) ONLINE
ON :MarketInfo(EndTicksUTC) ONLINE
ON :MarketInfo(EndUTC) ONLINE
ON :MarketInfo(EndUTCTicks) ONLINE
ON :NewsEvent(EventID) ONLINE
ON :Ask(Id) ONLINE
ON :Component(Id) ONLINE
ON :NewsEvent(Id) ONLINE
ON :MarketInfo(Id) ONLINE
ON :Bid(Id) ONLINE
ON :NewsEvent(Id, Date) ONLINE
ON :MarketInfo(Interval) ONLINE
ON :MarketInfo(Name) ONLINE
ON :MarketInfo(StartTicksUTC) ONLINE
ON :MarketInfo(StartUTC) ONLINE
ON :MarketInfo(StartUTCTicks) ONLINE
关于如何加快此查询的任何想法?也许我只是想做错事?在 Neo4j 上销售我的老板而不是使用 "tried and true" MS SQL 服务器变得越来越难...
你犯了几个重大错误。
- 您用多余的
WITH
子句将 WHERE
子句与第一个 MATCH
子句分开。这导致 WHERE
子句根本无法过滤 MATCH
子句——因此它找到 all 个 (cp:CurrencyPair) - [:Currency_Pair] -> (mkt:MarketInfo)
模式的实例。
- 你的关系类型根本没有被指定,因为你没有在他们的名字前加上冒号。因此,匹配了您的模式中指定的节点之间的 所有 关系。
- 您缺少
:CurrencyPair(Name)
上的索引。 (你真的需要每一个其他索引吗?当 creating/deleting 相关节点时它们会引入开销。)
这是您的查询的固定版本,应该 运行 更快(尤其是在为 :CurrencyPair(Name)
添加索引之后):
MATCH (cp:CurrencyPair) - [:Currency_Pair] -> (mkt:MarketInfo)
WHERE cp.Name = "AUD/CAD" AND
"2012-01-10T15:50:00+00:00" <= mkt.StartUTC <= "2012-01-10T16:00:00+00:00"
MATCH (mkt) <-[:Ask_Input_Data] - (a:Ask)
MATCH (mkt) <-[:Bid_Input_Data] - (b:Bid)
RETURN mkt AS MarketInfo, cp AS CurrencyPair, a AS Ask, b AS Bid
ORDER BY MarketInfo.EndTicksUTC DESC
我在 google 上进行了搜索,想知道去哪里询问查询分析,但一切都让我回到了这里。如果我错了,我深表歉意,这应该放在其他地方。
这是我的数据库(运行ning Neo4j 服务器 v3.4)的当前统计信息:
我的 Neo4jClient 查询:
var query = graphClient
.Cypher
.Match("(cp:CurrencyPair) - [:Currency_Pair] -> (mkt:MarketInfo)")
.With("mkt, cp")
.Where((CurrencyPair cp) => cp.Name == Pair.Name)
.AndWhere((MarketInfo mkt) => mkt.StartTicksUTC >= startTicks)
.AndWhere((MarketInfo mkt) => mkt.EndTicksUTC <= endTicks)
.With("mkt, cp")
.OrderBy("mkt.EndTicksUTC DESC")
.Match("(mkt) -[Ask_Input_Data] - (a:Ask)")
.With("mkt, cp, a")
.Match("(mkt) -[Bid_Input_Data] - (b:Bid)")
.With("mkt, cp, a, b")
.Return((mkt, cp, a, b) => new
{
MarketInfo = mkt.As<MarketInfo>(),
CurrencyPair = cp.As<CurrencyPair>(),
Ask = a.As<Ask>(),
Bid = b.As<Bid>()
});
生成的 Neo4j 查询:
profile
MATCH (cp:CurrencyPair) - [Currency_Pair] -> (mkt:MarketInfo)
WITH mkt, cp
WHERE (cp.Name = "AUD/CAD") AND (mkt.StartUTC >= "2012-01-10T15:50:00+00:00" ) AND (mkt.StartUTC <= "2012-01-10T16:00:00+00:00" )
WITH mkt, cp
ORDER BY mkt.EndTicksUTC DESC
MATCH (mkt:MarketInfo) <-[Ask_Input_Data] - (a:Ask)
WITH mkt, cp, a
MATCH (mkt:MarketInfo) <-[Bid_Input_Data] - (b:Bid)
WITH mkt, cp, a, b
RETURN mkt AS MarketInfo, cp AS CurrencyPair, a AS Ask, b AS Bid
如您所见,我正在尝试查询数据库以查找与给定货币节点相关的所有 "MarketInfo" 节点,然后是仅在两个日期之间的 return 节点。
运行这个查询,需要7秒运行:
和returns 10个节点,15个关系
我在数据库中有索引:
索引
ON :NewsEvent(Date) ONLINE
ON :MarketInfo(EndTicksUTC) ONLINE
ON :MarketInfo(EndUTC) ONLINE
ON :MarketInfo(EndUTCTicks) ONLINE
ON :NewsEvent(EventID) ONLINE
ON :Ask(Id) ONLINE
ON :Component(Id) ONLINE
ON :NewsEvent(Id) ONLINE
ON :MarketInfo(Id) ONLINE
ON :Bid(Id) ONLINE
ON :NewsEvent(Id, Date) ONLINE
ON :MarketInfo(Interval) ONLINE
ON :MarketInfo(Name) ONLINE
ON :MarketInfo(StartTicksUTC) ONLINE
ON :MarketInfo(StartUTC) ONLINE
ON :MarketInfo(StartUTCTicks) ONLINE
关于如何加快此查询的任何想法?也许我只是想做错事?在 Neo4j 上销售我的老板而不是使用 "tried and true" MS SQL 服务器变得越来越难...
你犯了几个重大错误。
- 您用多余的
WITH
子句将WHERE
子句与第一个MATCH
子句分开。这导致WHERE
子句根本无法过滤MATCH
子句——因此它找到 all 个(cp:CurrencyPair) - [:Currency_Pair] -> (mkt:MarketInfo)
模式的实例。 - 你的关系类型根本没有被指定,因为你没有在他们的名字前加上冒号。因此,匹配了您的模式中指定的节点之间的 所有 关系。
- 您缺少
:CurrencyPair(Name)
上的索引。 (你真的需要每一个其他索引吗?当 creating/deleting 相关节点时它们会引入开销。)
这是您的查询的固定版本,应该 运行 更快(尤其是在为 :CurrencyPair(Name)
添加索引之后):
MATCH (cp:CurrencyPair) - [:Currency_Pair] -> (mkt:MarketInfo)
WHERE cp.Name = "AUD/CAD" AND
"2012-01-10T15:50:00+00:00" <= mkt.StartUTC <= "2012-01-10T16:00:00+00:00"
MATCH (mkt) <-[:Ask_Input_Data] - (a:Ask)
MATCH (mkt) <-[:Bid_Input_Data] - (b:Bid)
RETURN mkt AS MarketInfo, cp AS CurrencyPair, a AS Ask, b AS Bid
ORDER BY MarketInfo.EndTicksUTC DESC