Обновление индекса Titan занимает слишком много времени

Даже для пустой базы данных создание индекса в Titan 1.0 занимает несколько минут. Время кажется точным, что говорит о ненужной задержке.

У меня такой вопрос: как сократить или исключить количество времени, которое Титан тратит на переиндексацию? Концептуально, поскольку никакая работа не выполняется, время должно быть минимальным, конечно, не четыре минуты.

(NB. Ранее я уже указывал на решение, которое просто заставляет Titan ждать полную задержку без тайм-аута. Это неправильное решение - я хочу полностью устранить задержку.)

Код, который я использую для настройки базы данных с нуля:

graph = ... a local cassandra instance ...
graph.tx().rollback()

// 1. Check if the index already exists
mgmt = graph.openManagement()
i = mgmt.getGraphIndex('byIdent')
if(! i) {
  // 1a. If the index does not exist, add it
  idKey = mgmt.getPropertyKey('ident')
  idKey = idKey ? idKey : mgmt.makePropertyKey('ident').dataType(String.class).make()
  mgmt.buildIndex('byIdent', Vertex.class).addKey(idKey).buildCompositeIndex()
  mgmt.commit()
  graph.tx().commit()

  mgmt  = graph.openManagement()
  idKey = mgmt.getPropertyKey('ident')
  idx   = mgmt.getGraphIndex('byIdent')
  // 1b. Wait for index availability
  if ( idx.getIndexStatus(idKey).equals(SchemaStatus.INSTALLED) ) {
    mgmt.awaitGraphIndexStatus(graph, 'byIdent').status(SchemaStatus.REGISTERED).call()
  }
  // 1c. Now reindex, even though the DB is usually empty.
  mgmt.updateIndex(mgmt.getGraphIndex('byIdent'), SchemaAction.REINDEX).get()
  mgmt.commit()
  mgmt.awaitGraphIndexStatus(graph, 'byIdent').status(SchemaStatus.ENABLED).call()
} else { mgmt.commit() }

Кажется, это updateIndex...REINDEX вызывайте эти блоки до истечения времени ожидания. Это известная проблема или работа не устранена? Я делаю что-то неправильно?

РЕДАКТИРОВАТЬ: отключение REINDEX, как обсуждалось в комментариях, на самом деле не является исправлением, потому что индекс, кажется, не становится активным. Теперь я вижу:

WARN  com.thinkaurelius.titan.graphdb.transaction.StandardTitanTx  - Query requires iterating over all vertices [(myindexedkey = somevalue)]. For better performance, use indexes

1 ответ

Решение

Задержка во времени была / была совершенно ненужной из-за моего неправильного использования Titan (хотя шаблон действительно появляется в главе 28 документации по Titan 1.0.0).

Не блокируйте в транзакции!

Вместо:

  mgmt  = graph.openManagement()
  idKey = mgmt.getPropertyKey('ident')
  idx   = mgmt.getGraphIndex('byIdent')
  // 1b. Wait for index availability
  if ( idx.getIndexStatus(idKey).equals(SchemaStatus.INSTALLED) ) {
    mgmt.awaitGraphIndexStatus(graph, 'byIdent').status(SchemaStatus.REGISTERED).call()
  }

Рассматривать:

  mgmt  = graph.openManagement()
  idKey = mgmt.getPropertyKey('ident')
  idx   = mgmt.getGraphIndex('byIdent')
  // Wait for index availability
  if ( idx.getIndexStatus(idKey).equals(SchemaStatus.INSTALLED) ) {
    mgmt.commit()
    mgmt.awaitGraphIndexStatus(graph, 'byIdent').status(SchemaStatus.REGISTERED).call()
  } else { mgmt.commit() }

Используйте ENABLE_INDEX

Не: mgmt.updateIndex(mgmt.getGraphIndex('byIdent'), SchemaAction.REINDEX).get()

Скорее: mgmt.updateIndex(mgmt.getGraphIndex('byIdent'),SchemaAction.ENABLE_INDEX).get()

Другие вопросы по тегам