[ https://issues.apache.org/jira/browse/PHOENIX-3128?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15399832#comment-15399832 ]
James Taylor commented on PHOENIX-3128: --------------------------------------- Good catch, [~junegunn]. The first change in MutationState looks correct - we shouldn't be adding local index maintainers to that list as that'll cause the client to send over the mutations for local indexes. There might be a corner case for IndexTool where we're generating HFiles and need to include *all* non disabled indexes (based on {{includeMutableIndexes}} which should probably be includeAllIndexes). So maybe there should be three separate cases there: includeAllIndexes, table.isImmutable(), and other/none case. The second change in PhoenixIndexCodec isn't quite right - it's a little too general. There's a corner case in rollback of transactions that needs to issue deletes for local indexes (from MutationState): {code} // If we have mutable indexes, local immutable indexes, or global immutable indexes // that reference key value columns, setup index meta data and attach here. In this // case updates to the indexes will be generated on the server side. // An alternative would be to let Tephra track the row keys for the immutable index // by adding it as a transaction participant (soon we can prevent any conflict // detection from occurring) with the downside being the additional memory required. if (!keyValueIndexes.isEmpty()) { attachMetaData = true; IndexMaintainer.serializeAdditional(table, indexMetaDataPtr, keyValueIndexes, connection); } if (attachMetaData) { cache = setMetaDataOnMutations(tableRef, deletes, indexMetaDataPtr); } {code} Instead, I think it'd be safe to: - not call generateDeletes() in PhoenixTransactionalIndexer.processMutation() if the table is immutable, and - not call codec.getIndexDeletes() in NonTxIndexBuilder.addDeleteUpdatesToMap() if table is immutable. Currently we don't support a mix of immutable and mutable indexes, so if the first index maintainer has indexMaintainer.isImmutableRows() of true, then we know the table is immutable. Slightly more flexible would be to filter the indexMaintainers where indexMaintainer.isImmutableRows() is true. > Remove extraneous operations during upsert with local immutable index > --------------------------------------------------------------------- > > Key: PHOENIX-3128 > URL: https://issues.apache.org/jira/browse/PHOENIX-3128 > Project: Phoenix > Issue Type: Bug > Reporter: Junegunn Choi > Assignee: Junegunn Choi > Fix For: 4.8.0 > > Attachments: PHOENIX-3128.patch > > > Upsert to a table with a local immutable index is supposed to be more > efficient than to a table with a local mutable index, but it's actually > slower (in our environment by 30%) due to extraneous operations involved. > The problem is twofold: > 1. Client unnecessarily prepares and sends index update. > 2. Index cleanup is done regardless of the immutability of the table. -- This message was sent by Atlassian JIRA (v6.3.4#6332)