2010-11-10 74 views
2

我有类似下面的SQL查询:查询优化(ORDER BY)

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

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

有没有人有关于如何加快此查询的任何建议。

+1

您说“相似”。真正的查询在哪些方面不同 - 它是否连接多个表(或者它是基于一个视图吗?)它实际上是否也从表中选择了许多其他列? – 2010-11-10 13:15:55

+1

另外,当你说如果没有ORDER BY它会在几秒钟内执行,是返回所有数据还是仅返回第N行来显示? – 2010-11-10 13:16:46

+1

@PeteDaMeat,你有比较两个查询的查询计划吗? – 2010-11-10 13:22:41

回答

0

使用EXPLAIN语句,看看那里的问题是

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

如果创建my_function是确定的(即始终返回相同的输入值相同的结果),那么你可以创建(名称,创建my_function(名))的指数,它可以帮助(或可能不会!)

+0

我不明白为什么(NAME,MY_FUNCTION(NAME))上的索引能够帮助他/她的查询。 :( – 2010-11-10 12:46:09

+1

因为查询可以通过单独阅读索引来解决,而不是表格 - 索引已经按照NAME顺序。 – 2010-11-10 12:50:32

+0

好点。没想到那个。 – 2010-11-10 13:15:52

0

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

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

+0

不是很奇怪的是,ORDER BY可能导致所有数据在被返回前执行SORT – 2010-11-10 12:51:46

+0

同意但是'ORDER BY'可以在'name'上使用索引,他/她声称必须避免排序,另外,排序12000条记录应该不会超过几秒钟,显然需要5分钟! – 2010-11-10 12:56:15

+0

确实,5分钟是12000行很长的时间 – 2010-11-10 13:14:23

1

在这个问题下评论,你说,它需要2秒。“来而不顺序返回N行BY”。这是有道理的:如果没有ORDER BY,只要碰到它们,你就会得到遇到的前N行。使用ORDER BY,在之后,只有返回前N行,结果已按正确顺序排序。

如果查询在快速获得第N行的情况下使用是很重要的(如在线报告与分页),那么你可以尝试添加FIRST_ROWS或FIRST_ROWS_ ñ提示查询,尝试说服它使用索引。请参阅Choosing an Optimizer Goal