2016-06-01 5 views
3

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

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

(. 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 вызов, который блокирует до тайм-аута. Является ли это известной проблемой или workformewon'tfix? Я делаю что-то неправильно?

EDIT: Отключение REINDEX, как обсуждалось в комментариях, на самом деле не является исправлением, потому что индекс, похоже, не активируется. Теперь я вижу:

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

Возможный дубликат [Состояние индекса никогда не изменяется на ENABLED на Titan с использованием бэкэнда Amazon DynamoDB] (http://stackoverflow.com/questions/35088574/index-state-never-change-to-enabled-on-titan-with -amazon-dynamodb-backend) –

+0

Устранить вызов 'REINDEX', если нет существующих данных, например, при создании ключа свойства и индекса в первый раз. –

+0

@JasonPlurad Это хорошая стратегия для большинства моих целей. Что делать, если база данных крошечная во время создания индекса? Скажем, что, если у меня очень мало, но ненулевых вершин? Должен ли я переиндексировать и понести эту кажущуюся бессмысленную задержку (до тех пор, пока я не отправлю запрос на тяну, по крайней мере)? –

ответ

3

Задержка времени/была совершенно ненужным и из-за мои неправильный Титан (хотя картина появляется в 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()

Смежные вопросы