2015-10-07 21 views
0

讀這article我發現下面的例子:獲取有關外部排序的一些細節在PostgreSQL中

EXPLAIN (ANALYZE, BUFFERS) SELECT * FROM foo ORDER BY c1; 

查詢的計劃是這樣的:

Sort (cost=172682.84..175182.84 rows=1000000 width=37) (actual time=584.215..681.531 rows=1000000 loops=1) 
    Sort Key: c1 
    Sort Method: external sort Disk: 45928kB 
    Buffers: shared hit=3197 read=5137, temp read=5741 written=5741 
    -> Seq Scan on foo (cost=0.00..18334.00 rows=1000000 width=37) (actual time=0.036..91.914 rows=1000000 loops=1) 
     Buffers: shared hit=3197 read=5137 
Total runtime: 711.195 ms 

As known外部排序是算法家族。這是否意味着PostgreSQL確實external merge sort?如果是這樣,我怎樣才能得到一些細節,例如批次數量和大小。它甚至有可能嗎?

+1

你需要尋找到的源代碼。 –

+0

@a_horse_with_no_name這是唯一的方法嗎? PosgtrSQL沒有提供它使用的算法的詳細信息,是嗎? –

+1

它不能得到比實際實現更詳細的內容。 –

回答

1

可以通過設置參數trace_sorts=onhttp://www.postgresql.org/docs/9.4/static/runtime-config-developer.html

除了獲得日誌文件這些信息,你可能想看看src/backend/utils/sort/tuplesort.c,至少在此評論:

此模塊處理的分類堆元組,索引元組或單個元素(並且可以輕鬆地支持其他種類的可排序對象,如有必要,可以使用 )。它可以有效地處理小數量和大數量的數據。少量使用qsort()在內存中進行排序。大型 數量使用臨時文件和標準外部排序 算法排序。

請參閱Knuth,第3卷,瞭解更多關於排序算法的外部排序 。我們使用替代 選擇將輸入劃分爲排序運行,優先級樹實現爲堆 (實質上是他的算法5.2.3H),然後合併使用多相運算的運行 合併Knuth算法5.4.2D。算法D 使用的邏輯「磁帶」是由logtape.c實現的,一旦每個塊從其「磁帶」中讀取,它就通過回收利用空間來避免空間浪費。

...

+0

是的,你抓到了我想要的東西。非常感謝你指出消息來源。 –

相關問題