希望你們都很好,做得很好!PostgreSQL:在字母數字字符串和小數位字段排序
我有一個表items
擁有200萬+記錄結構看起來象下面這樣:
id (int) | price (decimal) | priority (int)
-------------------------------------------
10001 | 59000.25 | 1
10002 | 73000.91 | 2
10003 | 1000.23 | 1
10004 | 9567.18 | 1
,我尋找的解決方案是非常簡單的:如何在price+priority
在ASC排序此表|倒序?
當前和工作解決方案:我正在使用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(最大號我在數據庫中)
現在,每當我嘗試低於SQLs,他們都沒有工作
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)
請指教!
鏈接我提到:
- Postgresql sorting mixed alphanumeric data
- Alphanumeric Sorting in PostgreSQL
- Alphanumeric sorting with PostgreSQL
- Alphanumeric case in-sensitive sorting in postgres
在兩列上創建索引ASC。我敢打賭它會改善很多。 –
查看多列索引:https://www.postgresql.org/docs/current/static/indexes-multicolumn.html –
那麼,排序數據是一個相當緩慢的過程,但爲什麼你想排序2mio +記錄開始?通常你只需要處理一部分數據,只能對合理數量的行進行排序。 –