1
0
Fork 0

Restrict prefetching of PKs to the number of rows in the current output block

This commit is contained in:
Tobias Gödderz 2019-03-25 15:26:14 +01:00
parent c09d35864c
commit e0fd8698a3
3 changed files with 18 additions and 10 deletions

View File

@ -224,9 +224,10 @@ inline std::shared_ptr<arangodb::LogicalCollection> lookupCollection( // find c
}
template <bool ordered>
void IResearchViewExecutor<ordered>::fillPkBuffer(
irs::doc_iterator& it, irs::columnstore_reader::values_reader_f const& values) {
while (!_pkBuffer.full() && it.next()) {
void IResearchViewExecutor<ordered>::fillPkBuffer(irs::doc_iterator& it,
irs::columnstore_reader::values_reader_f const& values,
size_t atMost) {
while (!_pkBuffer.full() && it.next() && _pkBuffer.size() < atMost) {
irs::bytes_ref key;
irs::doc_id_t const docId = it.value();
if (values(docId, key)) {
@ -250,15 +251,15 @@ void IResearchViewExecutor<ordered>::fillPkBuffer(
}
}
template<bool ordered>
template <bool ordered>
LocalDocumentId IResearchViewExecutor<ordered>::getNextPk(
irs::doc_iterator &it, irs::columnstore_reader::values_reader_f const &values
) {
irs::doc_iterator& it,
irs::columnstore_reader::values_reader_f const& values, size_t atMost) {
LocalDocumentId id = LocalDocumentId::none();
if (_pkBuffer.empty()) {
// Try to fill the buffer if it's empty
fillPkBuffer(it, values);
fillPkBuffer(it, values, atMost);
}
if (!_pkBuffer.empty()) {
@ -298,7 +299,7 @@ bool IResearchViewExecutor<ordered>::next(ReadContext& ctx) {
TRI_ASSERT(_pkReader);
// try to read a document PK from iresearch
LocalDocumentId documentId = getNextPk(*_itr, _pkReader);
LocalDocumentId documentId = getNextPk(*_itr, _pkReader, ctx.outputRow.numRowsLeftToWrite());
// read document from underlying storage engine, if we got an id
if (documentId.isSet() &&

View File

@ -182,10 +182,11 @@ class IResearchViewExecutor {
IndexIterator::DocumentCallback const& callback);
LocalDocumentId getNextPk(irs::doc_iterator& it,
irs::columnstore_reader::values_reader_f const& values);
irs::columnstore_reader::values_reader_f const& values,
size_t atMost);
void fillPkBuffer(irs::doc_iterator& it,
irs::columnstore_reader::values_reader_f const& values);
irs::columnstore_reader::values_reader_f const& values, size_t atMost);
private:
Infos const& _infos;

View File

@ -192,6 +192,12 @@ class OutputAqlItemRow {
// return lastWrittenIndex + 1;
}
/**
* @brief Returns the number of rows left to write. *Always* includes the
* current row, whether it was already written or not!
*/
size_t numRowsLeftToWrite() const { return block().size() - _baseIndex; }
// Use this function with caution! We need it only for the ConstrainedSortExecutor
void setBaseIndex(std::size_t index) {
#ifdef ARANGODB_ENABLE_MAINTAINER_MODE