Медленный SQL-оператор при использовании переменных - PullRequest
0 голосов
/ 25 ноября 2018

У меня следующий оператор SQL, работающий с MariaDB 10.1.26 с ~ 2.000 строк с мгновенными результатами.

select value, datetime from Schuppen 
where (value = (select min(value) from Schuppen where (measure = 'temp') 
    and datetime between '2018-11-01 00:00:00' and '2018-11-02 00:00:00')) 
and datetime between '2018-11-01 00:00:00' and '2018-11-02 00:00:00';

Когда я использую следующий оператор с переменными для полей даты и времени, выполнение занимает ~5,5 секунд

set @startdate = cast('2018-11-01 00:00:00' as datetime);
set @enddate = cast('2018-11-02 00:00:00' as datetime);
select value, datetime from Schuppen 
where (value = (select min(value) from Schuppen where (measure = 'temp') 
    and datetime between @startdate and @enddate)) 
and datetime between @startdate and @enddate;

Чем больше у меня строк данных, тем больше времени требуется для выполнения инструкции.Похоже, переменные как-то меняют поведение оператора.

Что здесь не так?

1 Ответ

0 голосов
/ 25 ноября 2018

Проблема в том, что оптимизатор запросов плохо выполняет поиск подходящего индекса при использовании переменных.Это известная проблема.

Если вы используете EXPLAIN в обоих запросах, вы увидите разницу.Просто старайтесь избегать переменных, когда в этом нет необходимости.

Для первого запроса оптимизатор "видит" выбранные значения и решает, что индекс может идеально использоваться для более эффективного удовлетворения выбранного диапазона.

Для второго запроса оптимизатор не знает двух значений, которые определяют диапазон, и вместо этого решает вернуться к ПОЛНОМУ СКАНИРОВАНИЮ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...