2014-09-19 43 views
0

我的查詢是一個非常大的數據庫上的選擇不同,在pgAdmin sql工具查詢本身持續12秒。如何優化SELECT DISTINCT sql的分頁?

SELECT DISTINCT ON (city, airport, zip, country, name) city, airport, price, id FROM mytable; 

彈簧間歇讀取器的定義:

JpaPagingItemReader<MyEntity> reader; 
reader.setPageSize(PAGE_SIZE); 

如果我定義PAGE_SIZE是作爲數據庫列作爲大,性能等於12秒。 但是,如果我將大小設置爲較低的值(例如1.000.000數據行數據庫中的頁面大小= 100.000),則性能非常差(大約只有10倍)。

Spring-batch在後臺對查詢應用特定的分頁。什麼是不:

query.setFirstResult(); 
query.setMaxResult(); 

如果頁面大小爲10,書房是執行的查詢如下:

firstResult, maxResult 
    0, 10 
    10, 10 
    20, 10 
    30, 10... 

這又轉化爲LIMITOFFSET在SQL。

問題:是SELECT DISTINCT ON不能與分頁LIMIT/OFFSET組合?對我來說,好像完全選擇不同的查詢在每次「分頁」運行時都被再次執行,並且因此持續很長時間。

因此,如果數據庫必須在應用maxresults之前做出完全不同的選擇,我可以臨時保存「distinct」選擇並獲取下一頁嗎?

我該如何改進這一點,而不必將分頁大小設置爲100萬。或者在這裏改進不可能?

+0

使用查詢分析器來查看發生了什麼,如果那裏有列,而沒有索引可能會遇到麻煩。 – 2014-09-19 11:21:57

+0

我有一個關於「城市,機場,郵編,國家,名稱」的索引。 – membersound 2014-09-19 11:23:24

+1

如前所述,使用pgadmin工具來分析查詢(分頁和未分頁)的執行情況,看看發生了什麼以及需要花費那麼多時間。在postgresql指南中也提到了這一點*「由OFFSET子句跳過的行仍然需要在服務器內部進行計算;因此大的OFFSET可能效率低下。」* – 2014-09-19 11:25:34

回答

1

如果您不使用多個線程來處理這個問題,另一種方法是使用JdbcCusorItemReader。這樣你根本不需要優化查詢的分頁方面。如果你使用多個線程,這不是一個選項。

+0

好的,我沒有使用多個線程。 – membersound 2014-09-20 02:51:03