2017-11-29 16 views
1

私はPostgreSQLに巨大なテーブルを持っており、トップのK要素を取得する必要があります。 O(N logK)のトップKエントリを選択する方法はありますか?
ほとんどの明白な例:効率的なトップK PostgreSQL

SELECT * 
FROM table 
ORDER BY col 
LIMIT k 

は私たちに

sorted(arr)[:k] # in python 

に似O(N logN個)ソリューションを提供しますヒープを使用してそれを行うためのSQL方法はありますか?この例のよう

from heapq import nsmallest 
nsmallest(k, arr) 

分ヒープを用いてO(N logK)は?

+2

私はPostgreSQLでこれを表現する方法に気付きません。ただし、事前にcolでINDEXを作成すると、ORDER BYは基本的にはO(k)のみの実行時に自由になります。これはもちろん、colを含む同じフォームのクエリがたくさんある場合にのみ意味があります。 – SaiBot

+0

問題は、浮動列があり、任意の数の行を追加できることです(現在の最小/最大要素の値よりも低いまたは高い行を追加できます)。 –

+0

申し訳ありません。 float(数値)値を持つ列に対して索引(たとえば、btree)を作成できます。新しい行を挿入すると、索引で順序が処理されます(わずかな挿入コストの欠点があります)。 – SaiBot

答えて

0

事前に列に索引(たとえば、btree)を作成すると、その列のORDER BYの速度が大幅に向上します。挿入中にいくつかのオーバーヘッドが発生しますが、指定した列に同じフォームのクエリがたくさんある場合は、これが効果的です。 this page(「索引をソートに使用する」のところにあります)の質問に対して、興味深い情報や実験を見つけました。