Skip to content

Commit

Permalink
Merge pull request #1924 from kuzudb/string-column-perf
Browse files Browse the repository at this point in the history
Fix var-size seq scan perf
  • Loading branch information
acquamarin committed Aug 14, 2023
2 parents 1f0d8ac + 4864c94 commit 86b089d
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 8 deletions.
2 changes: 1 addition & 1 deletion src/include/storage/store/string_node_column.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ class StringNodeColumn : public NodeColumn {

private:
void readStringValueFromOvf(transaction::Transaction* transaction, common::ku_string_t& kuStr,
common::ValueVector* resultVector, common::node_group_idx_t nodeGroupIdx);
common::ValueVector* resultVector, common::page_idx_t overflowPageIdx);

private:
std::unique_ptr<InMemDiskArray<ColumnChunkMetadata>> overflowMetadataDA;
Expand Down
21 changes: 14 additions & 7 deletions src/storage/store/string_node_column.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,13 +40,15 @@ void StringNodeColumn::scan(transaction::Transaction* transaction, node_group_id
NodeColumn::scan(transaction, nodeGroupIdx, startOffsetInGroup, endOffsetInGroup, resultVector,
offsetInVector);
auto numValuesToRead = endOffsetInGroup - startOffsetInGroup;
auto overflowPageIdx =
overflowMetadataDA->get(nodeGroupIdx, TransactionType::READ_ONLY).pageIdx;
for (auto i = 0u; i < numValuesToRead; i++) {
auto pos = offsetInVector + i;
if (resultVector->isNull(pos)) {
continue;
}
readStringValueFromOvf(
transaction, resultVector->getValue<ku_string_t>(pos), resultVector, nodeGroupIdx);
transaction, resultVector->getValue<ku_string_t>(pos), resultVector, overflowPageIdx);
}
}

Expand Down Expand Up @@ -79,39 +81,44 @@ void StringNodeColumn::scanInternal(
assert(startNodeOffset % DEFAULT_VECTOR_CAPACITY == 0);
auto nodeGroupIdx = StorageUtils::getNodeGroupIdxFromNodeOffset(startNodeOffset);
NodeColumn::scanInternal(transaction, nodeIDVector, resultVector);
auto overflowPageIdx =
overflowMetadataDA->get(nodeGroupIdx, TransactionType::READ_ONLY).pageIdx;
for (auto i = 0u; i < nodeIDVector->state->selVector->selectedSize; i++) {
auto pos = nodeIDVector->state->selVector->selectedPositions[i];
if (resultVector->isNull(pos)) {
continue;
}
readStringValueFromOvf(
transaction, resultVector->getValue<ku_string_t>(pos), resultVector, nodeGroupIdx);
transaction, resultVector->getValue<ku_string_t>(pos), resultVector, overflowPageIdx);
}
}

void StringNodeColumn::lookupInternal(
Transaction* transaction, ValueVector* nodeIDVector, ValueVector* resultVector) {
assert(dataType.getPhysicalType() == PhysicalTypeID::STRING);
auto startNodeOffset = nodeIDVector->readNodeOffset(0);
auto nodeGroupIdx = StorageUtils::getNodeGroupIdxFromNodeOffset(startNodeOffset);
auto overflowPageIdx = overflowMetadataDA
->get(StorageUtils::getNodeGroupIdxFromNodeOffset(startNodeOffset),
TransactionType::READ_ONLY)
.pageIdx;
NodeColumn::lookupInternal(transaction, nodeIDVector, resultVector);
for (auto i = 0u; i < nodeIDVector->state->selVector->selectedSize; i++) {
auto pos = resultVector->state->selVector->selectedPositions[i];
if (!resultVector->isNull(pos)) {
readStringValueFromOvf(
transaction, resultVector->getValue<ku_string_t>(pos), resultVector, nodeGroupIdx);
readStringValueFromOvf(transaction, resultVector->getValue<ku_string_t>(pos),
resultVector, overflowPageIdx);
}
}
}

void StringNodeColumn::readStringValueFromOvf(Transaction* transaction, ku_string_t& kuStr,
ValueVector* resultVector, node_group_idx_t nodeGroupIdx) {
ValueVector* resultVector, page_idx_t overflowPageIdx) {
if (ku_string_t::isShortString(kuStr.len)) {
return;
}
PageByteCursor cursor;
TypeUtils::decodeOverflowPtr(kuStr.overflowPtr, cursor.pageIdx, cursor.offsetInPage);
cursor.pageIdx += overflowMetadataDA->get(nodeGroupIdx, TransactionType::READ_ONLY).pageIdx;
cursor.pageIdx += overflowPageIdx;
auto [fileHandleToPin, pageIdxToPin] =
StorageStructureUtils::getFileHandleAndPhysicalPageIdxToPin(
*dataFH, cursor.pageIdx, *wal, transaction->getType());
Expand Down

0 comments on commit 86b089d

Please sign in to comment.