Вот запрос:
select nd1.ansos_id
from nursdate nd1
where nd1.division_id = 2
and nd1.unit_id = 19
and nd1.nursdate_start_date =
(select min(nd2.nursdate_start_date)
from nursdate nd2
where nd2.ansos_id = nd1.ansos_id
and nd2.nursdate_start_date >= all
(select nd3.nursdate_start_date
from nursdate nd3
where nd3.ansos_id = nd1.ANSOS_ID
and nd3.nursdate_start_date <= '2017-08-13 00:00:00'))
Ниже верно для обоих наборов данных
- Актуальная статистика;
- Индексы дефрагментированы
- Общие свойства для обоих наборов данных одинаковы: пример: сортировка;
- Кроме того, два набора данных содержат примерно одинаковое количество данных. На самом деле чем быстрее, тем больше данных
Теперь для запуска одного набора данных требуется ~8 секунд, а для другого набора данных — ‹1 секунды. Вот разница в плане выполнения между двумя наборами данных.
- «Фактическое количество строк» и «Количество выполнений» в более медленном наборе данных астрономически выше.
- Более быстрый также имеет дополнительный узел «Индексная катушка».
Снимок экрана № 1. Тот же запрос, план медленного выполнения в одном наборе данных
Снимок экрана № 2. Тот же запрос, план быстрого выполнения в другом наборе данных
Как решить эту проблему? Что я могу сделать, чтобы заставить его работать быстро в 1-м наборе данных? Спасибо!
[EDIT] План более медленного выполнения: (обратите внимание, что вся таблица «nursdate» содержит только 99 тыс. строк) https://www.brentozar.com/pastetheplan/?id=r1ZFFuNt-
Более быстрый план выполнения: (обратите внимание, что вся таблица «nursdate» содержит 333 000 строк. Это как-то быстрее) https://www.brentozar.com/pastetheplan/?id=rJYMc_EKb
[EDIT] Вот некоторая информация об объеме данных. Тот, что на «mmt», имеет меньше данных, но работает медленнее.
--mmt cnt: 99347
select count(*)
from mmt_sqa_v60.mmtsqav60.nursdate nd1
--heo cnt: 333275
select count(*)
from heo_sqa_v60_2k12.heosqav602k12.nursdate nd1
--mmt cnt: 2403
select count(*)
from mmt_sqa_v60.mmtsqav60.nursdate nd1
where nd1.division_id = 2
and nd1.unit_id = 19
and nd1.nursdate_start_date <= '2017-08-13 00:00:00'
--heo cnt: 5537
select count(*)
from heo_sqa_v60_2k12.heosqav602k12.nursdate nd1
where nd1.division_id = 1
and nd1.unit_id = 20
and nd1.nursdate_start_date <= '2017-08-13 00:00:00'