0

有没有人能帮我做以下事情:

我有一个查询导致两列直接来自表(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 语句仅选择部分行数而不是整个集合,这给了我所需的性能)。谢谢所有回复的人。

4

3 回答 3

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 语句的结果。这样,您的应用程序代码只需遍历结果集即可按顺序处理这些值。您不必从“%”分隔的字符串中解析值。

于 2013-05-14T21:55:03.090 回答
2

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

于 2013-05-14T22:12:22.560 回答
1

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

于 2013-05-14T21:43:20.423 回答