Oracle - NVL (col1, col2) Сортировка по медлительности - PullRequest
0 голосов
/ 27 июня 2019

В предложении Select есть столбец NVL (b.name, a.name), и я использую этот столбец в Order By, из-за чего запрос Oracle стал медленным.

Я пытался создать индекс для столбца NAME, но безрезультатно.

SELECT
    *
FROM
    (
        SELECT
            nvl(b.name,a.name) AS b_a_name, -- Order by is using this column and hence the slowness. Index is present on NAME column but of no use
            b.name b_name,
            a.name a_name
        FROM
            employee a
            LEFT JOIN employee b ON a.parent_id = b.child_id
    )
ORDER BY b_a_name --- this Order By is taking time
;

Я ожидаю, как настроить предложение Order By или как мне переписать запрос, чтобы получить тот же результат, но с улучшенной производительностью.

Ответы [ 3 ]

0 голосов
/ 27 июня 2019

Как насчет удаления NVL из ORDER BY?

SELECT NVL(b.name, a.name) AS b_a_name,
       b.name a_name,
       a.name b_name
  FROM employee a
       LEFT JOIN employee b ON a.parent_id = b.child_id
  ORDER BY b.name, a.name;

В любом случае, ORDER BY будет замедлять процесс.Неупорядоченный набор всегда получается быстрее.


Кстати, почему вы сделали это с псевдонимами столбцов?Смутить врага?Ну, ты запутал меня .

b.name a_name      --> shouldn't that be b_name
a.name b_name      -->                   a_name
0 голосов
/ 27 июня 2019

Здесь время заняло время ввода-вывода, а ухудшение не было по (CPU time) предложению Order By. Я подтвердил это, поместив все данные запроса в таблицу, а затем применил Order by. Все время было потрачено на запись данных в таблицу. Время отклика составляет 0,2 с, но время ввода-вывода составляет 6 с, которое не может быть уменьшено, параллельная подсказка может помочь.

0 голосов
/ 27 июня 2019

вы можете написать свой запрос без использования подзапроса, хотя не уверены, что это улучшит какую-либо производительность или нет

SELECT      nvl(b.name,a.name) AS b_a_name, 
            b.name a_name,
            a.name b_name
        FROM
            employee a
            LEFT JOIN employee b ON a.parent_id = b.child_id
    order by b_a_name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...