mirror of https://gitee.com/bigwinds/arangodb
parent
beea9033d3
commit
87567c3c2a
|
@ -1,6 +1,8 @@
|
||||||
devel
|
devel
|
||||||
-----
|
-----
|
||||||
|
|
||||||
|
* fixed issue #2876: wrong skiplist index usage in edge collection
|
||||||
|
|
||||||
* fixed issue #2868: cname missing from logger-follow results in rocksdb
|
* fixed issue #2868: cname missing from logger-follow results in rocksdb
|
||||||
|
|
||||||
* fixed issue #2889: Traversal query using incorrect collection id
|
* fixed issue #2889: Traversal query using incorrect collection id
|
||||||
|
|
|
@ -1281,6 +1281,7 @@ bool MMFilesSkiplistIndex::supportsFilterCondition(
|
||||||
arangodb::aql::AstNode const* node,
|
arangodb::aql::AstNode const* node,
|
||||||
arangodb::aql::Variable const* reference, size_t itemsInIndex,
|
arangodb::aql::Variable const* reference, size_t itemsInIndex,
|
||||||
size_t& estimatedItems, double& estimatedCost) const {
|
size_t& estimatedItems, double& estimatedCost) const {
|
||||||
|
|
||||||
std::unordered_map<size_t, std::vector<arangodb::aql::AstNode const*>> found;
|
std::unordered_map<size_t, std::vector<arangodb::aql::AstNode const*>> found;
|
||||||
std::unordered_set<std::string> nonNullAttributes;
|
std::unordered_set<std::string> nonNullAttributes;
|
||||||
size_t values = 0;
|
size_t values = 0;
|
||||||
|
@ -1349,12 +1350,19 @@ bool MMFilesSkiplistIndex::supportsFilterCondition(
|
||||||
if (attributesCoveredByEquality == _fields.size() &&
|
if (attributesCoveredByEquality == _fields.size() &&
|
||||||
(unique() || implicitlyUnique())) {
|
(unique() || implicitlyUnique())) {
|
||||||
// index is unique and condition covers all attributes by equality
|
// index is unique and condition covers all attributes by equality
|
||||||
if (estimatedItems >= values) {
|
if (itemsInIndex == 0) {
|
||||||
// reduce costs due to uniqueness
|
estimatedItems = 0;
|
||||||
estimatedItems = values;
|
estimatedCost = 0.0;
|
||||||
estimatedCost = static_cast<double>(estimatedItems);
|
return true;
|
||||||
}
|
}
|
||||||
// cost is already low... now slightly prioritize the unique index
|
|
||||||
|
if (estimatedItems >= values) {
|
||||||
|
TRI_ASSERT(itemsInIndex > 0);
|
||||||
|
|
||||||
|
estimatedItems = values;
|
||||||
|
estimatedCost = (std::max)(static_cast<double>(1), std::log2(static_cast<double>(itemsInIndex)) * values);
|
||||||
|
}
|
||||||
|
// cost is already low... now slightly prioritize unique indexes
|
||||||
estimatedCost *= 0.995 - 0.05 * (_fields.size() - 1);
|
estimatedCost *= 0.995 - 0.05 * (_fields.size() - 1);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -1367,11 +1375,15 @@ bool MMFilesSkiplistIndex::supportsFilterCondition(
|
||||||
// sparse indexes are contained in Index::canUseConditionPart)
|
// sparse indexes are contained in Index::canUseConditionPart)
|
||||||
estimatedItems = static_cast<size_t>((std::max)(
|
estimatedItems = static_cast<size_t>((std::max)(
|
||||||
static_cast<size_t>(estimatedCost * values), static_cast<size_t>(1)));
|
static_cast<size_t>(estimatedCost * values), static_cast<size_t>(1)));
|
||||||
estimatedCost *= static_cast<double>(values);
|
if (itemsInIndex == 0) {
|
||||||
|
estimatedCost = 0.0;
|
||||||
|
} else {
|
||||||
|
estimatedCost = (std::max)(static_cast<double>(1), std::log2(static_cast<double>(itemsInIndex)) * values);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// no condition
|
// index does not help for this condition
|
||||||
estimatedItems = itemsInIndex;
|
estimatedItems = itemsInIndex;
|
||||||
estimatedCost = static_cast<double>(estimatedItems);
|
estimatedCost = static_cast<double>(estimatedItems);
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -977,8 +977,22 @@ bool RocksDBVPackIndex::supportsFilterCondition(
|
||||||
|
|
||||||
if (attributesCoveredByEquality == _fields.size() && unique()) {
|
if (attributesCoveredByEquality == _fields.size() && unique()) {
|
||||||
// index is unique and condition covers all attributes by equality
|
// index is unique and condition covers all attributes by equality
|
||||||
|
if (itemsInIndex == 0) {
|
||||||
|
estimatedItems = 0;
|
||||||
|
estimatedCost = 0.0;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
estimatedItems = values;
|
estimatedItems = values;
|
||||||
estimatedCost = 0.995 * values;
|
estimatedCost = 0.995 * values;
|
||||||
|
if (values > 0) {
|
||||||
|
if (useCache()) {
|
||||||
|
estimatedCost = static_cast<double>(estimatedItems * values);
|
||||||
|
} else {
|
||||||
|
estimatedCost = (std::max)(static_cast<double>(1), std::log2(static_cast<double>(itemsInIndex)) * values);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// cost is already low... now slightly prioritize unique indexes
|
||||||
|
estimatedCost *= 0.995 - 0.05 * (_fields.size() - 1);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1000,11 +1014,19 @@ bool RocksDBVPackIndex::supportsFilterCondition(
|
||||||
estimatedItems = static_cast<size_t>(1.0 / estimate);
|
estimatedItems = static_cast<size_t>(1.0 / estimate);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
estimatedCost = static_cast<double>(estimatedItems);
|
if (itemsInIndex == 0) {
|
||||||
|
estimatedCost = 0.0;
|
||||||
|
} else {
|
||||||
|
if (useCache()) {
|
||||||
|
estimatedCost = static_cast<double>(estimatedItems * values);
|
||||||
|
} else {
|
||||||
|
estimatedCost = (std::max)(static_cast<double>(1), std::log2(static_cast<double>(itemsInIndex)) * values);
|
||||||
|
}
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// no condition
|
// index does not help for this condition
|
||||||
estimatedItems = itemsInIndex;
|
estimatedItems = itemsInIndex;
|
||||||
estimatedCost = static_cast<double>(estimatedItems);
|
estimatedCost = static_cast<double>(estimatedItems);
|
||||||
return false;
|
return false;
|
||||||
|
|
Loading…
Reference in New Issue