SQL子查询排序

时间:2013-05-14 21:31:12

标签: sql postgresql query-optimization

有人可以帮助我做一个以下的事情:

我有一个查询导致两个列一个是直的( columnA )来自一个表,而另一个是从子查询( columnB )生成的。如果我在columnB上进行排序(即ORDER BY),那么当在columnA上执行相同操作(50次以上)时,响应会慢得多。有没有办法加快 columnB 的排序,以便接近排序 columnA 时达到的速度?

注意:引擎是Postgres

更新: 查询类似于:

select columnA, array_to_string(array(select ... from tableB where ...), '%') as columnB
from tableA
where ... 
order by columnA

非常感谢任何建议。

更新#2 : 通过在新查询中进行排序然后将结果提供给主查询来解决它(使用where语句仅选择部分行数而不是整个集合,这给了我所需的性能)。谢谢所有回复的人。

3 个答案:

答案 0 :(得分:2)

在您的查询中

select columnA, array_to_string(array(select ... from tableB where ...), '%') as columnB
from tableA
where ... 
order by columnA

columnB上的操作无法利用索引。不仅如此,排序还必须处理列中许多连接行的宽度。

您最好的选择是重新考虑您需要排序的原因,因为表达式array_to_string(...)的排序顺序是任意的。它是随意的,因为你说你没有在SELECT语句中排序array()的参数。


  

我正在使用array_to_string来捕获我稍后需要处理的许多值。你看到了另一种选择吗?

SELECT语句将捕获任意数量的值。

如果您需要按排序顺序“进一步处理”某些值,那么最好在不使用任何数组函数的情况下返回SELECT ... ORDER BY语句的结果。这样,您的应用程序代码可以通过遍历结果集来按顺序处理值。您不必从“%”分隔的字符串中解析值。

答案 1 :(得分:2)

您可以将未排序的数据放入临时表,然后索引列b。然后在现在索引的列上运行带有order by的简单选择。不能保证这会更快,但这是值得尝试的。

答案 2 :(得分:1)

由于您的“ColumnB”是计算值,因此没有可用于加速排序的索引。 ColumnA可能已经排序,所以它很快。除了预先计算它们并将它们放在表格中之外,您无法做任何事情来加速这些计算值的排序。这就是为什么数据仓库通常不会对实时数据起作用,而是导出每日汇总的一个重要原因。