добавление условий делает запрос медленным - oracle - PullRequest
0 голосов
/ 05 марта 2020

Уважаемая нация Stackoverflow,
Этот пост связан с выполнением запроса.
Я выполняю простой запрос, как показано ниже

выберите wonum, siteid из workorder, где workorder.siteid = 'MCT' и istask = 0 и декодировать (workorder.pmnum, null, workorder.reportdate, workorder.targstartdate)> = '12 -MAR-18 'и декодировать (workorder.pmnum, null, workorder.reportdate, workorder.targstartdate ) <= '14 -MAR-18 '; </strong>

Выполнено отлично, заняло 6 сек c
, поскольку я добавил еще одно условие type =' MAINTENANCE ' запрос занял 28 se c

выберите wonum, siteid из workorder, где workorder.siteid = 'MCT' и istask = 0 и type = 'MAINTENANCE' и декодируйте (workorder.pmnum, null, workorder.reportdate, workorder.targstartdate)> = '12 -MAR-18 'и декодируйте (workorder.pmnum, null, workorder.reportdate, workorder.targstartdate) <= '14 -MAR-18'; </strong> - 28,73

Как я знаю, мне нужно создать индекс для таблицы рабочих заказов,
, но я не могу понять в каком поле мне нужно создать индекс и как он помогает быстро выполнять запрос.
(Примечание: в системе уже есть индекс (ind_1 - с атрибутами wonum, siteid)
любезно help.Apologize, если это базовый c вопрос для PRos

1 Ответ

1 голос
/ 05 марта 2020

Вообще говоря, создайте индексы для столбцов, участвующих в предложении where. Как вы описали, индексирование type столбца может помочь.

Это действительно поможет? Кто знает ... проверьте объясните план. Соберите статистику для таблицы, чтобы Оптимизатор знал, что делать (т.е. выбирал лучший план выполнения). Тогда вы сможете понять, что делать.


Более того, кажется, что вы заставляете Oracle выполнять неявные преобразования. Сказать, что

some_date >= '12-mar-18'

означает, что - если some_date тип данных столбца date (похоже, что это так; в противном случае вы получите неправильный результат) - Oracle должен преобразовать строку '12-mar-18' в действительный date путем применения маски правильного формата (например, dd-mon-yy). Почему вы хотите это сделать? Обеспечьте date ценность для себя!

some_date >= date '2018-03-12'

или

some_date >= to_date('12-mar-18', 'dd-mon-yy')

Но будьте осторожны; mar означает «март». Этот запрос, безусловно, потерпит неудачу в моей базе данных, которая говорит на хорватском, и у нас здесь нет 1030 * месяцев (это ožu). Возможно, Вы бы предпочли придерживаться здесь чисел, то есть 12-03-18. Еще одно замечание: это значение трудно понять; что такое 12? Это 12-й день месяца или декабрь? То же самое касается 03. Поэтому всегда используют значения, которые не вызывают путаницы, либо предоставляя литералы даты (которые всегда в формате yyyy-mm-dd - тот, который я предложил первым), либо используйте функцию to_date с соответствующей маской формата.

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