2016-05-14 83 views
0

我小的SQL邏輯工作優化SQL掃描查詢,以獲得從Postgres的結果DB

我一個表的消息contaning MESSAGE_ID,ACCOUNTID欄目

數據被保存在這個表來具有獨特消息ID。

我的目標是將這些檯面數據存儲到另一個數據庫中。 [從postgres(來源)數據庫到postgres(目的地)數據庫]

爲此我設置了ETL作業。這有助於我傳輸數據。

問題在於,在郵件表所在的postgres(source)DB中,在該表中message_id不是以排序的形式。和數據看起來像這樣.....

而我的etl作業在每半小時後運行,我的動機是每當etl作業運行時,根據message_id從源數據庫到destinaton數據庫。在目標數據庫中,我有一個存儲過程,它可以幫助我從消息表中獲取max(message_id),並將該值存儲在另一個表中。因此,在ETL中,我在查詢中使用該值來激發源數據庫,以獲取比我從目標數據庫獲取的message_id更大的數據。

所以它的一種負載增量process.using etl。但查詢正在使用,以獲得從源數據庫的數據是這樣的http://prnt.sc/b3u5il

SELECT * FROM (SELECT * FROM MESSAGES ORDER BY message_id) as a WHERE message_id >"+context.vid+" 

這個查詢掃描每次運行時的所有表...所以itakes這麼多的時間來執行。我得到了我想要的結果。但是有什麼辦法可以讓我以更快的速度執行這個過程。

任何人都可以幫助我優化這個查詢(不知道它是否可能)?或任何其他建議,歡迎。

謝謝

回答

0

是的。

如果MESSAGE_ID是不在主鑰匙或次索引的前導列,則創建一個索引:

... ON MESSAGES (message_id) 

並消除聯視圖:

SELECT m.* 
    FROM MESSAGES m 
    WHERE m.message_id > ? 
    ORDER BY m.message_id 
1

最有效的方式來在你的情況下提高性能是一個索引到您的排序列在這種情況下message_id更好的性能。

通過這種方式,您的查詢將執行索引掃描,而不是完整的表掃描,這會妨礙性能。

你可以用下面的語句創建一個索引:

CREATE INDEX index_name 
ON table_name (column_name) 
0

創建一個B-tree索引: 您可以通過選項ASC調整B樹索引的順序,DESC,NULLS FIRST ,和/或NULLS LAST創建索引時;例如:

CREATE INDEX test2_info_nulls_low ON test2(info NULLS FIRST); CREATE INDEX test3_desc_index ON test3(id DESC NULLS LAST);