Repository navigation
[Improvement](topn) order by key topn query optimization - #15663
Conversation
|
clang-tidy review says "All clean, LGTM! 👍" |
|
TeamCity pipeline, clickbench performance test result: |
| std::string MutableBlock::dump_names() const { | ||
| std::stringstream out; | ||
| for (auto it = _names.begin(); it != _names.end(); ++it) { | ||
| if (it != _names.begin()) out << ", "; |
There was a problem hiding this comment.
warning: statement should be inside braces [readability-braces-around-statements]
| if (it != _names.begin()) out << ", "; | |
| if (it != _names.begin()) { out << ", "; | |
| } |
|
clang-tidy review says "All clean, LGTM! 👍" |
bcd9089 to
809e555
Compare
| const MutableBlock* _mutable_block = nullptr; | ||
| const std::vector<uint32_t>* _compare_columns; | ||
| // reverse the compare order | ||
| const bool _is_reverse = false; |
There was a problem hiding this comment.
warning: private field '_is_reverse' is not used [clang-diagnostic-unused-private-field]
const bool _is_reverse = false;
^809e555 to
5961ee2
Compare
|
clang-tidy review says "All clean, LGTM! 👍" |
1 similar comment
|
clang-tidy review says "All clean, LGTM! 👍" |
* delete setting read_options.block_row_max to key topn limit * fix core by delete rs_reader _empty logic
since key is already sorted and topn_next only need first N rows from each segment, but runtime predicate will filter some rows and read more than N rows. should add add for order by none-key column, since none-key column is not sorted and all rows should be read, so runtime predicate will reduce rows for topn node
0e6c0ea to
deae14c
Compare
|
clang-tidy review says "All clean, LGTM! 👍" |
Issue Number: close http://jira.selectdb-in.cc/browse/CORE-1462 Describe the overview of changes. commit e1697741a82f875ca42b0d18caa7972eaa225bee Author: Kang <[email protected]> Date: Thu Jan 19 22:59:29 2023 +0800 [opt](test) scalar_types_p0 use 100k lines dataset and scalar_types_p2 use 1000k (apache#16104) commit 33a47e8d02644123ffd8c5c4353653c1c175e96a Author: Kang <[email protected]> Date: Wed Jan 18 14:17:24 2023 +0800 [testcase](bitmap index)bitmap index testcase (apache#15975) * add bitmap index testcases for all scalar types commit 260a631441834ca7e23da4b77c922eb818eddca7 Author: Kang <[email protected]> Date: Mon Jan 16 16:49:59 2023 +0800 [regression-test](topn)add test cases for nonkey topn query for each scalar type (apache#15790) related to apache#15558 apache#15693 1. dup key table with 17 scalar datatypes 2. unique key table with mow enabled 3. unique key table with mow disabled commit 81cea5219ae86df950f10aa123072df78c7cdf23 Author: Kang <[email protected]> Date: Sun Feb 19 23:28:33 2023 +0800 [bugfix](topn) fix topn read_orderby_key_columns nullptr (apache#16896) The SQL `SELECT nationkey FROM regression_test_query_p0_limit.tpch_tiny_nation ORDER BY nationkey DESC LIMIT 5` make be core dump since dereference a nullptr `read_orderby_key_columns in VCollectIterator::_topn_next`, triggered by skipping _colname_to_value_range init in apache#16818 . This PR makes two changes: 1. avoid read_orderby_key_columns nullptr in TabletReader::_init_orderby_keys_param 2. return error if read_orderby_key_columns is nullptr unexpected in VCollectIterator::_topn_next to avoid core dump commit 2fee1d1d79942e49eddaafdc2b49e49b0651b109 Author: Kang <[email protected]> Date: Fri Feb 10 12:56:33 2023 +0800 [Improvement](topn) add limit threashold session variable and fuzzy for topn optimizations (apache#16514) 1. add limit threshold for topn runtime pushdown and key topn optimization 2. use unified session variable topn_opt_limit_threshold for all topn optimizations 3. add fuzzy support for topn_opt_limit_threshold commit 1696bed39129fcc891f32f64ff1fb43f9531fcd4 Author: Kang <[email protected]> Date: Thu Feb 2 09:13:32 2023 +0800 [bugfix](topn) fix topn runtime predicate getting value bug for decimal type (apache#16331) * fix topn runtime predicate getting value bug for decimal type * fix cast_to_string bug for TYPE_DECIMALV2 commit d70cdf61521a23417c9bc734a3cdb668265a15b0 Author: Kang <[email protected]> Date: Wed Feb 22 16:18:46 2023 +0800 topn sync doris order by key topn query optimization apache#15663 commit 1df514c8f0b66ae9a8438617163a31848e519949 Author: Kang <[email protected]> Date: Wed Feb 22 15:14:43 2023 +0800 sync with doris runtime prune for topn query apache#15558
Issue Number: close http://jira.selectdb-in.cc/browse/CORE-1462 Describe the overview of changes. commit e1697741a82f875ca42b0d18caa7972eaa225bee Author: Kang <[email protected]> Date: Thu Jan 19 22:59:29 2023 +0800 [opt](test) scalar_types_p0 use 100k lines dataset and scalar_types_p2 use 1000k (apache#16104) commit 33a47e8d02644123ffd8c5c4353653c1c175e96a Author: Kang <[email protected]> Date: Wed Jan 18 14:17:24 2023 +0800 [testcase](bitmap index)bitmap index testcase (apache#15975) * add bitmap index testcases for all scalar types commit 260a631441834ca7e23da4b77c922eb818eddca7 Author: Kang <[email protected]> Date: Mon Jan 16 16:49:59 2023 +0800 [regression-test](topn)add test cases for nonkey topn query for each scalar type (apache#15790) related to apache#15558 apache#15693 1. dup key table with 17 scalar datatypes 2. unique key table with mow enabled 3. unique key table with mow disabled commit 81cea5219ae86df950f10aa123072df78c7cdf23 Author: Kang <[email protected]> Date: Sun Feb 19 23:28:33 2023 +0800 [bugfix](topn) fix topn read_orderby_key_columns nullptr (apache#16896) The SQL `SELECT nationkey FROM regression_test_query_p0_limit.tpch_tiny_nation ORDER BY nationkey DESC LIMIT 5` make be core dump since dereference a nullptr `read_orderby_key_columns in VCollectIterator::_topn_next`, triggered by skipping _colname_to_value_range init in apache#16818 . This PR makes two changes: 1. avoid read_orderby_key_columns nullptr in TabletReader::_init_orderby_keys_param 2. return error if read_orderby_key_columns is nullptr unexpected in VCollectIterator::_topn_next to avoid core dump commit 2fee1d1d79942e49eddaafdc2b49e49b0651b109 Author: Kang <[email protected]> Date: Fri Feb 10 12:56:33 2023 +0800 [Improvement](topn) add limit threashold session variable and fuzzy for topn optimizations (apache#16514) 1. add limit threshold for topn runtime pushdown and key topn optimization 2. use unified session variable topn_opt_limit_threshold for all topn optimizations 3. add fuzzy support for topn_opt_limit_threshold commit 1696bed39129fcc891f32f64ff1fb43f9531fcd4 Author: Kang <[email protected]> Date: Thu Feb 2 09:13:32 2023 +0800 [bugfix](topn) fix topn runtime predicate getting value bug for decimal type (apache#16331) * fix topn runtime predicate getting value bug for decimal type * fix cast_to_string bug for TYPE_DECIMALV2 commit d70cdf61521a23417c9bc734a3cdb668265a15b0 Author: Kang <[email protected]> Date: Wed Feb 22 16:18:46 2023 +0800 topn sync doris order by key topn query optimization apache#15663 commit 1df514c8f0b66ae9a8438617163a31848e519949 Author: Kang <[email protected]> Date: Wed Feb 22 15:14:43 2023 +0800 sync with doris runtime prune for topn query apache#15558
… storage TopN fix ### What problem does this PR solve? Issue Number: None Related PR: apache#15663 Problem Summary: Follow-up to the previous commit, from its review: - The regression test also covers `ORDER BY k1 DESC LIMIT 10` and a cluster key table read by `ORDER BY <cluster key prefix> LIMIT 10`, which lost rows the same way (on the unfixed BE they return k1 = 19..10 and v = 0..9 once each), checks with explain that the TopN reaches the scan, and adds a table whose two segments hold the same full keys: the storage TopN no longer drops rows itself, and the delete bitmap of the merge-on-write table hides the older row of each key, so every key comes back once with the newest value. The needless `SET batch_size = 4064` is gone; the `.out` is regenerated on the fixed build. - The compare contract error names the condition it checks, `is_unique with read_orderby_key_columns set`, and the unit test matches it; the comments say rows equal on the ORDER BY columns may be different keys, not that they are. - The rowset writing helper of BetaRowsetTest stops at the first failed step and prints its status. Corrections to the previous commit message: the bug came with apache#15663 (2023-02-06), which extended the storage TopN to merge-on-write tablets; apache#10694 had introduced the merge by the ORDER BY columns for DUP tablets only, which drop nothing. The query returns wrong rows: the rows equal on the prefix are lost and rows of later prefixes take their place, so it is short only when too few rows remain. Every branch since apache#15663 has the bug (branch-2.0 to branch-4.2 by reading the code); a backport takes the BetaRowsetReader change only, since the release branches have no compare contract check and `enable_segment_limit_pushdown` exists only on branch-4.2 and master. ### Release note None ### Check List (For Author) - Test: Unit Test / Regression test - BetaRowsetTest and VGenericIteratorsTest: 24 pass. - fault_injection_p0/test_mow_topn_key_prefix_overlapping_segments passes on the fixed BE; on an unfixed BE the prefix, DESC and cluster key queries return the wrong rows above, and the same-key table returns one row per key with the newest value. - clang-format 16 and clang-tidy clean on the changed lines; build hygiene passes. - Behavior changed: No - Does this need documentation: No Co-Authored-By: Claude Opus 5.5 <[email protected]>
…y prefix ### What problem does this PR solve? Issue Number: None Related PR: apache#15663 Problem Summary: Follow-up from review: the fix stays the one decision in BetaRowsetReader (do not skip rows equal on the ORDER BY key prefix, even for UNIQUE_KEYS), with a one-line comment. The extra check in VMergeIterator's compare contract that rejected is_unique together with read_orderby_key_columns, its comment on new_merge_iterator and its unit test are removed: no caller passes that combination any more, and the change is meant to stay a one-line fix that backports as is. ### Release note None ### Check List (For Author) - Test: Unit Test / Regression test - BetaRowsetTest and VGenericIteratorsTest: 23 pass. - fault_injection_p0/test_mow_topn_key_prefix_overlapping_segments passes. - Behavior changed: No - Does this need documentation: No Co-Authored-By: Claude Opus 5.5 <[email protected]>
### What problem does this PR solve? Issue Number: None Related PR: apache#15663 Problem Summary: Comment only: the condition in BetaRowsetReader now says why the merge of a storage TopN must not drop the older versions of a key (it merges by the ORDER BY key prefix, on which rows of different keys compare equal) and why no duplicate key comes back (it only reads merge-on-write tables, whose delete bitmap already filters the older versions). ### Release note None ### Check List (For Author) - Test: Unit Test - BetaRowsetTest and VGenericIteratorsTest: 23 pass; BE builds. - Behavior changed: No - Does this need documentation: No Co-Authored-By: Claude Opus 5.5 <[email protected]>
…rite storage TopN ### What problem does this PR solve? Issue Number: None Related PR: apache#15663 Problem Summary: Storage TopN on a merge-on-write table merged overlapping segments by the ORDER BY key prefix but still dropped "same key" rows (`is_unique`), so `ORDER BY <key prefix> LIMIT n` lost rows that share the prefix; now the merge drops rows only when it compares the whole key, since the delete bitmap already filters older versions. ### Release note Fix `ORDER BY <key prefix> LIMIT n` on a merge-on-write UNIQUE KEY table returning wrong rows when one load wrote rows sharing that prefix into several segments of one rowset. ### Check List (For Author) - Test: Unit Test / Regression test - New UT in BetaRowsetTest; new regression fault_injection_p0/test_mow_topn_key_prefix_overlapping_segments (fails before the fix). - Behavior changed: Yes, the fix above. - Does this need documentation: No Co-Authored-By: Claude Opus 5.5 <[email protected]>
…rite storage TopN ### What problem does this PR solve? Issue Number: None Related PR: apache#15663 Problem Summary: Storage TopN on a merge-on-write table merged overlapping segments by the ORDER BY key prefix but still dropped "same key" rows (`is_unique`), so `ORDER BY <key prefix> LIMIT n` lost rows that share the prefix; now the merge drops rows only when it compares the whole key, since the delete bitmap already filters older versions. ### Release note Fix `ORDER BY <key prefix> LIMIT n` on a merge-on-write UNIQUE KEY table returning wrong rows when one load wrote rows sharing that prefix into several segments of one rowset. ### Check List (For Author) - Test: Unit Test / Regression test - New UT in BetaRowsetTest; new regression fault_injection_p0/test_mow_topn_key_prefix_overlapping_segments (fails before the fix). - Behavior changed: Yes, the fix above. - Does this need documentation: No Co-Authored-By: Claude Opus 5.5 <[email protected]>
Proposed changes
Issue Number: close #xxx
Problem summary
Describe your changes.
Optimize for order by key topn query like
SELECT * FROM table1 ORDER BY k1, k2 LIMIT nin which k1 and k2 is the prefix of table sort key.This optimization is only for table with DUP_KEYS and UNQIUE_KEYS with merge on write.
Checklist(Required)
Further comments
If this is a relatively large or complex change, kick off the discussion at [email protected] by explaining why you chose the solution you did and what alternatives you considered, etc...