【发布时间】:2017-06-06 14:14:08
【问题描述】:
希望你们一切都好,一切都好!
我有一个表 items 有 200 万+条记录,结构如下所示:
id (int) | price (decimal) | priority (int)
-------------------------------------------
10001 | 59000.25 | 1
10002 | 73000.91 | 2
10003 | 1000.23 | 1
10004 | 9567.18 | 1
我正在寻找的解决方案非常简单:如何按 ASC|DESC 顺序在 price+priority 上对这张表进行排序?
当前可行的解决方案:我正在使用ORDER BY priority ASC, price ASC。但据我所知,对多列进行排序很慢且没有经过优化(因此我面临实时缓慢)。
我尝试过的解决方案:我已在此表中添加了一个临时列:
id (int) | price (decimal) | priority (int) | new_priority (varchar)
--------------------------------------------------------------------
10001 | 59000.25 | 1 | a59000.25
10002 | 73000.91 | 2 | b73000.91
10003 | 1000.23 | 1 | a1000.23
10004 | 9567.18 | 1 | a9567.18
我已经替换了 1 => a, 2 => b, 3 => c 直到 10(我在数据库中的最大数量)
现在,每当我尝试使用 SQL 时,它们都不起作用
SELECT * FROM items
ORDER BY new_priority ASC
SELECT * FROM items
ORDER BY new_priority::bytea
SELECT * FROM items
ORDER BY SUBSTRING(new_priority FROM '^(.*?)( \\d+)?$'),
COALESCE(SUBSTRING(new_priority FROM ' (\\d+)$')::INTEGER, 0)
请指教!
我参考的链接:
【问题讨论】:
-
在两列上创建索引 ASC。我敢打赌它会改善很多。
-
好吧,排序数据是一个相当缓慢的过程,但是为什么要从 2mio+ 记录开始排序呢?通常您会处理数据子集,并且只对合理数量的行进行排序。
-
limit和offset将无济于事,因为为了使其正常工作,数据库仍会进行全面扫描。数据库需要知道总量,因此它可以知道从哪里开始/停止使用限制/偏移子句。关于索引,它类似于create index idx_blabla on yourTable (priority ASC, price ASC)供参考阅读:postgresql.org/docs/8.3/static/indexes-ordering.html -
"因此我正面临实时缓慢" - 如果您的查询速度较慢,那么 Edit 您的问题并添加使用
explain (analyze, verbose)生成的执行计划。 Formatted text 请no screen shots
标签: sql postgresql sorting pg