【问题标题】:SQL subquery sortSQL子查询排序
【发布时间】:2013-05-14 21:31:12
【问题描述】:

谁能帮我解决以下问题:

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

【问题讨论】:

  • 一些额外的信息会很有用,比如表的架构和引擎(sqlite、sqlserver、postgres、mysql)以获得更多信息
  • 请发布查询。我想您正在另一个窗口中使用它,为我们复制和粘贴它有那么难吗?为什么人们总是忘记这一点?
  • 好吧,我们很难在没有看到您的查询(或至少是它的简化版本)的情况下为您提供帮助。您可能会遇到子查询可以替换为 JOIN 的情况
  • 感谢您的回复!引擎是postgres。查询相当大,包括连接数。我正在寻找更通用的方法来加速查询而不是特定查询(如果这不便,我深表歉意)。
  • 我根本不会尝试格式化 SQL 中的输出。这不是 SQL 的用途。告诉我们更多关于您在此处尝试实现的目标以及实际的排序标准是什么(由于子查询中没有 ORDER BY,您目前只是获得随机顺序)。

标签: sql postgresql query-optimization


【解决方案1】:

在您的查询中

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

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

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


我正在使用 array_to_string 来捕获我需要稍后处理的一些值。你看到替代品了吗?

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

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

【讨论】:

  • 您正确地指出了我的下一个问题(使用 array_to_string)。但是,在决定如何解决排序顺序之前,我必须先确定速度。感谢您的回复。
  • 如果不重新考虑使用 array_to_string(),就不可能修复速度。
  • @Bo.速度问题的解决方案是在生成字符串之前对进行排序(以便您可以相应地调整索引),为此您需要知道要排序的内容。
  • @BrankoDimitrijevic:你会怎么做?我不确定这会有什么帮助。
  • @MikeSherrill'Catcall':Mike 我正在使用 array_to_string 来捕获一些我需要稍后处理的值。你看到替代品了吗?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 感谢您的回答。我有一些不同的情况,我已经更新了原始帖子。任何不便敬请谅解。我没有在子查询中进行任何排序。
    • 我担心这就是答案:)。也许其他人有更多建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    • 2016-12-17
    相关资源
    最近更新 更多