2017-06-06 329 views
2

希望你們都很好,做得很好!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) 

請指教!

鏈接我提到:

  1. Postgresql sorting mixed alphanumeric data
  2. Alphanumeric Sorting in PostgreSQL
  3. Alphanumeric sorting with PostgreSQL
  4. Alphanumeric case in-sensitive sorting in postgres
+3

在兩列上創建索引ASC。我敢打賭它會改善很多。 –

+0

查看多列索引:https://www.postgresql.org/docs/current/static/indexes-multicolumn.html –

+2

那麼,排序數據是一個相當緩慢的過程,但爲什麼你想排序2mio +記錄開始?通常你只需要處理一部分數據,只能對合理數量的行進行排序。 –

回答

0

可能是你可以做使用NEW_PRIORITYDECIMAL一個更好的解決方案。

假設PRICE中的值不大於999999,PRIORITY也不是太大,可以使用PRIORITY*1000000+PRICE

無論如何,我認爲在評論中使用索引可能是更好的解決方案。

要創建一個 「綜合指數」,你可以用以下sintax:

CREATE INDEX index_name ON table_name (priority ASC, price ASC); 
+0

我已經在這個方法上集思廣益,發現一些漏洞,因此我不得不放棄這種方法。我有各種各樣的情況(比如'priority'是1,'price'是1000.0,'priority'是2,price是5000.0。我在計算優先級(基於一些規則)之前將它保存到數據庫中。 –

+0

等等。使用PRIORITY * 1000000 + PRICE將給你所需數據的數據... – etsa

+0

nopes @etsa考慮這一個:'price = 50000.5和優先級= 10'和'price = 75000.0和priority = 5'和'price = 100.25 and priority = 1'。我總是期待看到最後一個搜索結果的第一個和第一個搜索結果 –

2

如何創建index?索引是一種提高數據庫性能的機制。創建索引可能很慢,可能會持續幾個小時,但您會注意到進一步查詢的差異。

0

數據多久變化一次?如果不常用,請使用CLUSTER。 請參閱:https://www.postgresql.org/docs/9.5/static/sql-cluster.html 它將基本上按您的索引順序對錶進行排序。 將此羣集與來自etsa的答案組合在一起。

問題是,CLUSTER不維護順序。 因此,如果您插入了新行,它將被插入到最後一行。