Titan索引更新耗时太长

时间:2016-06-01 21:22:21

标签: database titan tinkerpop gremlin-server

即使在空数据库中,在Titan 1.0中创建索引也需要几分钟时间。时间似乎很准确,这表明存在不必要的延迟。

我的问题是:如何缩短或消除Titan重新索引所需的时间?从概念上讲,由于没有工作,所以时间应该是最小的,当然不是四分钟。< / p>

(N.B。我之前已经指出了一个解决方案,只是让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 个答案:

答案 0 :(得分:3)

时间延迟完全是不必要的,并且由于我滥用Titan(尽管该模式确实出现在Titan 1.0.0文档第28章中)。

请勿在交易中屏蔽!

而不是:

  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()