我有一个类似于下面的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子句,那么它会在几秒钟内执行。
有没有人对如何加快此查询提出任何建议。
答案 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;