@@ -73,14 +73,16 @@ ScannerContext::ScannerContext(
7373 limit(limit_),
7474 _scanner_scheduler_global(state->exec_env ()->scanner_scheduler()),
7575 _all_scanners(scanners.begin(), scanners.end()),
76- _min_scan_concurrency_of_scan_scheduler(_state->min_scan_concurrency_of_scan_scheduler ()),
77- _min_scan_concurrency(_state->min_scan_concurrency_of_scanner ()) {
7876#ifndef BE_TEST
79- _max_scan_concurrency =
80- std::min (local_state->max_scanners_concurrency (state), cast_set<int >(scanners.size ()));
77+ _scanner_scheduler (local_state->scan_scheduler (state)),
78+ _min_scan_concurrency_of_scan_scheduler(local_state->min_scanners_concurrency (state)),
79+ _max_scan_concurrency(std::min(local_state->max_scanners_concurrency (state), cast_set<int>(scanners.size()))),
8180#else
82- _max_scan_concurrency = num_parallel_instances;
81+ _scanner_scheduler (state->get_query_ctx ()->get_scan_scheduler()),
82+ _min_scan_concurrency_of_scan_scheduler(0 ),
83+ _max_scan_concurrency(num_parallel_instances),
8384#endif
85+ _min_scan_concurrency (local_state->should_run_serial () ? 1 : std::min(_state->min_scan_concurrency_of_scanner (), _max_scan_concurrency)) {
8486 DCHECK (_state != nullptr );
8587 DCHECK (_output_row_descriptor == nullptr ||
8688 _output_row_descriptor->tuple_descriptors ().size () == 1 );
@@ -117,16 +119,8 @@ Status ScannerContext::init() {
117119 auto scanner = _all_scanners.front ().lock ();
118120 DCHECK (scanner != nullptr );
119121
120- // TODO: Maybe need refactor.
121- // A query could have remote scan task and local scan task at the same time.
122- // So we need to compute the _scanner_scheduler in each scan operator instead of query context.
123- if (scanner->_scanner ->get_storage_type () == TabletStorageType::STORAGE_TYPE_LOCAL) {
124- _scanner_scheduler = _state->get_query_ctx ()->get_scan_scheduler ();
125- } else {
126- _scanner_scheduler = _state->get_query_ctx ()->get_remote_scan_scheduler ();
127- }
128- if (auto * task_executor_scheduler =
129- dynamic_cast <TaskExecutorSimplifiedScanScheduler*>(_scanner_scheduler)) {
122+ if (const auto * task_executor_scheduler =
123+ dynamic_cast <const TaskExecutorSimplifiedScanScheduler*>(_scanner_scheduler)) {
130124 std::shared_ptr<TaskExecutor> task_executor = task_executor_scheduler->task_executor ();
131125 vectorized::TaskId task_id (fmt::format (" {}-{}" , print_id (_state->query_id ()), ctx_id));
132126 _task_handle = DORIS_TRY (task_executor->create_task (
@@ -143,11 +137,6 @@ Status ScannerContext::init() {
143137 // Provide more memory for wide tables, increase proportionally by multiples of 300
144138 _max_bytes_in_queue *= _output_tuple_desc->slots ().size () / 300 + 1 ;
145139
146- if (_min_scan_concurrency_of_scan_scheduler == 0 ) {
147- // _scanner_scheduler->get_max_threads() is setted by workload group.
148- _min_scan_concurrency_of_scan_scheduler = 2 * _scanner_scheduler->get_max_threads ();
149- }
150-
151140 if (_all_scanners.empty ()) {
152141 _is_finished = true ;
153142 _set_scanner_done ();
@@ -175,15 +164,6 @@ Status ScannerContext::init() {
175164 }
176165 }
177166
178- // For select * from table limit 10; should just use one thread.
179- if (_local_state->should_run_serial ()) {
180- _max_scan_concurrency = 1 ;
181- _min_scan_concurrency = 1 ;
182- }
183-
184- // Avoid corner case.
185- _min_scan_concurrency = std::min (_min_scan_concurrency, _max_scan_concurrency);
186-
187167 COUNTER_SET (_local_state->_max_scan_concurrency , (int64_t )_max_scan_concurrency);
188168 COUNTER_SET (_local_state->_min_scan_concurrency , (int64_t )_min_scan_concurrency);
189169
0 commit comments