Oracle-NVL(col1,col2)按速度排序

时间:2019-06-27 06:37:46

标签: sql oracle oracle11g sql-tuning

Select子句NVL(b.name,a.name)中有一个列,由于此原因,Oracle查询变得很慢,因此我在Order By中使用此列。

我尝试在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 :(得分:0)

您可以在不使用子查询的情况下编写查询,尽管不确定它是否会提高性能

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

答案 1 :(得分:0)

如何从IGrouping中删除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

答案 2 :(得分:0)

这里的时间是IO时间所花费的时间,而(CPU time)Order By子句没有降低时间。我通过将所有查询数据放入表中然后应用Order by来确认这一点。通过将数据写入表已消耗了所有时间。响应时间为0.2秒,但IO时间为6秒,无法减少,并行提示可能会有所帮助。