HBASE-14227 Reduce the number of time row comparison is done in a Scan
(Ram)
This commit is contained in:
parent
90ca944e1b
commit
e32e4df780
|
@ -283,23 +283,27 @@ public class ScanQueryMatcher {
|
|||
if (filter != null && filter.filterAllRemaining()) {
|
||||
return MatchCode.DONE_SCAN;
|
||||
}
|
||||
int ret = this.rowComparator.compareRows(row, this.rowOffset, this.rowLength,
|
||||
if (row != null) {
|
||||
int ret = this.rowComparator.compareRows(row, this.rowOffset, this.rowLength,
|
||||
cell.getRowArray(), cell.getRowOffset(), cell.getRowLength());
|
||||
if (!this.isReversed) {
|
||||
if (ret <= -1) {
|
||||
return MatchCode.DONE;
|
||||
} else if (ret >= 1) {
|
||||
// could optimize this, if necessary?
|
||||
// Could also be called SEEK_TO_CURRENT_ROW, but this
|
||||
// should be rare/never happens.
|
||||
return MatchCode.SEEK_NEXT_ROW;
|
||||
if (!this.isReversed) {
|
||||
if (ret <= -1) {
|
||||
return MatchCode.DONE;
|
||||
} else if (ret >= 1) {
|
||||
// could optimize this, if necessary?
|
||||
// Could also be called SEEK_TO_CURRENT_ROW, but this
|
||||
// should be rare/never happens.
|
||||
return MatchCode.SEEK_NEXT_ROW;
|
||||
}
|
||||
} else {
|
||||
if (ret <= -1) {
|
||||
return MatchCode.SEEK_NEXT_ROW;
|
||||
} else if (ret >= 1) {
|
||||
return MatchCode.DONE;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (ret <= -1) {
|
||||
return MatchCode.SEEK_NEXT_ROW;
|
||||
} else if (ret >= 1) {
|
||||
return MatchCode.DONE;
|
||||
}
|
||||
return MatchCode.DONE;
|
||||
}
|
||||
|
||||
// optimize case.
|
||||
|
|
|
@ -491,8 +491,7 @@ public class StoreScanner extends NonReversedNonLazyKeyValueScanner
|
|||
// If no limits exists in the scope LimitScope.Between_Cells then we are sure we are changing
|
||||
// rows. Else it is possible we are still traversing the same row so we must perform the row
|
||||
// comparison.
|
||||
if (!scannerContext.hasAnyLimit(LimitScope.BETWEEN_CELLS) || matcher.row == null ||
|
||||
!Bytes.equals(row, offset, length, matcher.row, matcher.rowOffset, matcher.rowLength)) {
|
||||
if (!scannerContext.hasAnyLimit(LimitScope.BETWEEN_CELLS) || matcher.row == null) {
|
||||
this.countPerRow = 0;
|
||||
matcher.setRow(row, offset, length);
|
||||
}
|
||||
|
@ -540,6 +539,10 @@ public class StoreScanner extends NonReversedNonLazyKeyValueScanner
|
|||
if (!matcher.moreRowsMayExistAfter(cell)) {
|
||||
return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();
|
||||
}
|
||||
// Setting the matcher.row = null, will mean that after the subsequent seekToNextRow()
|
||||
// the heap.peek() will any way be in the next row. So the SQM.match(cell) need do
|
||||
// another compareRow to say the current row is DONE
|
||||
matcher.row = null;
|
||||
seekToNextRow(cell);
|
||||
break LOOP;
|
||||
}
|
||||
|
@ -567,6 +570,10 @@ public class StoreScanner extends NonReversedNonLazyKeyValueScanner
|
|||
if (!matcher.moreRowsMayExistAfter(cell)) {
|
||||
return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();
|
||||
}
|
||||
// Setting the matcher.row = null, will mean that after the subsequent seekToNextRow()
|
||||
// the heap.peek() will any way be in the next row. So the SQM.match(cell) need do
|
||||
// another compareRow to say the current row is DONE
|
||||
matcher.row = null;
|
||||
seekToNextRow(cell);
|
||||
} else if (qcode == ScanQueryMatcher.MatchCode.INCLUDE_AND_SEEK_NEXT_COL) {
|
||||
seekAsDirection(matcher.getKeyForNextColumn(cell));
|
||||
|
@ -583,6 +590,10 @@ public class StoreScanner extends NonReversedNonLazyKeyValueScanner
|
|||
continue;
|
||||
|
||||
case DONE:
|
||||
// We are sure that this row is done and we are in the next row.
|
||||
// So subsequent StoresScanner.next() call need not do another compare
|
||||
// and set the matcher.row
|
||||
matcher.row = null;
|
||||
return scannerContext.setScannerState(NextState.MORE_VALUES).hasMoreValues();
|
||||
|
||||
case DONE_SCAN:
|
||||
|
@ -595,7 +606,10 @@ public class StoreScanner extends NonReversedNonLazyKeyValueScanner
|
|||
if (!matcher.moreRowsMayExistAfter(cell)) {
|
||||
return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();
|
||||
}
|
||||
|
||||
// Setting the matcher.row = null, will mean that after the subsequent seekToNextRow()
|
||||
// the heap.peek() will any way be in the next row. So the SQM.match(cell) need do
|
||||
// another compareRow to say the current row is DONE
|
||||
matcher.row = null;
|
||||
seekToNextRow(cell);
|
||||
break;
|
||||
|
||||
|
|
Loading…
Reference in New Issue