查询优化(ORDER BY)

时间:2010-11-10 12:38:15

标签: sql oracle10g performance sql-order-by

我有一个类似于下面的SQL查询:

SELECT NAME,
       MY_FUNCTION(NAME) -- carries out some string manipulation
  FROM TITLES
  ORDER BY NAME; -- has an index.

TITLES表有大约12,000条记录。目前查询需要5分钟才能执行,但是如果我删除了ORDER BY子句,那么它会在几秒钟内执行。

有没有人对如何加快此查询提出任何建议。

4 个答案:

答案 0 :(得分:1)

如果MY_FUNCTION是确定性的(即总是为相同的输入值返回相同的结果),那么你可以在(NAME,MY_FUNCTION(NAME))上创建一个索引,它可以帮助(或者可能不会!)

答案 1 :(得分:1)

在问题的评论中,你说在没有ORDER BY的情况下返回N行需要2秒。这是有道理的:没有ORDER BY,只要遇到它们就会遇到遇到的前N行。使用ORDER BY,前N行只返回 后,结果已按正确的顺序排序。

如果在快速获取前N行的情况下使用查询(例如,具有分页的在线报告),那么您可以尝试向查询添加FIRST_ROWS或FIRST_ROWS_ n 提示,试图说服它使用索引。见Choosing an Optimizer Goal

答案 2 :(得分:0)

听起来很奇怪。什么是name列类型?

您是否检查过硬件错误?也许(只是可能)使用order by子句的查询正在使用您的索引,并且您的索引位于有缺陷的磁盘中(如果它们位于不同的表空间中,它可能位于与表不同的磁盘中)。 / p>

答案 3 :(得分:0)

使用EXPLAIN语句查看问题所在

EXPLAIN SELECT NAME, MY_FUNCTION(NAME) FROM TITLES ORDER BY NAME;