Кажется, я не могу сократить время запроса - PullRequest
0 голосов
/ 08 июня 2018

Я выполнил поиск в Google, чтобы выяснить, куда обратиться, чтобы спросить об анализе запросов, но все вернуло меня сюда.Я прошу прощения, если я ошибаюсь, и это должно пойти куда-то еще.

Вот текущая статистика моей базы данных (работает сервер Neo4j v3.4):

Database Info

Мой запрос 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", которые связаны сданный узел валюты, а затем вернуть узлы, которые находятся только между двумя датами.

Выполнение этого запроса занимает 7 секунд:

Query Breakdown

и возвращает 10 узлов, 15 отношений

enter image description here

У меня есть индексы в базе данных:

Индексы

   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 становится все труднее, чем использовать проверенный и проверенный MS SQL Server ...

1 Ответ

0 голосов
/ 08 июня 2018

Вы допустили несколько серьезных ошибок.

  1. Вы отделили свое предложение WHERE от первого предложения MATCH лишним предложением WITH.Это привело к тому, что предложение WHERE вообще не фильтровало предложение MATCH - поэтому он обнаружил все экземпляров шаблона (cp:CurrencyPair) - [:Currency_Pair] -> (mkt:MarketInfo).
  2. Типы ваших отношений не проверялисьуказано вообще, так как их имена не предшествуют двоеточию.Следовательно, все взаимосвязи между узлами, указанными в ваших шаблонах, были сопоставлены.
  3. Отсутствует индекс для :CurrencyPair(Name).(И действительно ли вам нужны все остальные индексы? Они вносят накладные расходы при создании / удалении соответствующих узлов.)

Вот фиксированная версия вашего запроса, которая должна выполняться быстрее (особенно после того, как выдобавить индекс для :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 
...