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子句或如何重新编写查询以获取相同的输出,但性能得到改善。
答案 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秒,无法减少,并行提示可能会有所帮助。