2017-06-07 13 views
1

我有一個PostgreSQL表,每天平均記錄約600萬條記錄。記錄正在被記錄時,查詢表格需要很長時間。有沒有辦法從該表中創建一個可以發佈新記錄的流光標?我希望能夠在記錄時將更改傳輸到我的網站。如何在PostgreSQL中查詢寫重的表?

在postgres中查詢表需要這麼長時間的原因是因爲我有〜550個併發的線程連接執行來自不同源的插入。每個線程都會對數據進行特定分析並存儲有價值的信息。我使用Perl快速分析和加載數據,但是使用Python構建來自postgres表的查詢。

期間通過的pgAdmin通過SQL加載時間,即使我查詢(讀查詢)表:

select var1, var2, var3 from pg_table 
where filter = 'xyz' 

甚至

select * from pg_table limit 100 

查詢是很慢的,這意味着結果採取〜 4分鐘後返回。當表格未被加載數據時,需要大約3秒。

順便說一句,謝謝你的一切建議。我剛剛在我的表上運行解釋分析,因爲它正在加載數據。下面是該查詢:

EXPLAIN ANALYZE select count(call_option_symbol) from optionsputnik; 

下面是結果:

QUERY PLAN 
Aggregate (cost=357092.30..357092.31 rows=1 width=51) (actual time=342775.893..342775.893 rows=1 loops=1) 
    -> Seq Scan on optionsputnik (cost=0.00..342868.24 rows=5689624 width=51) (actual time=0.025..341802.509 rows=5686946 loops=1) 
Planning time: 415.781 ms 
Execution time: 342775.974 ms 

我會嘗試和索引的表,我知道將加快行動的查詢時間,但不會使互動(來自網絡的處理請求,查詢表和返回)。

這是查詢計劃結果時,沒有被寫入表:

QUERY PLAN 
Aggregate (cost=463634.94..463634.95 rows=1 width=0) (actual time=2326.104..2326.104 rows=1 loops=1) 
    -> Seq Scan on optionsputnik (cost=0.00..445164.95 rows=7387995 width=0) (actual time=0.029..1773.378 rows=7383752 loops=1) 
Planning time: 0.045 ms 
Execution time: 2326.149 ms 

下面是我的表結構:

column_name,data_type,character_maximum_length 
load_time,character,30 
call_option_symbol,character,50 
call_bid,double precision, 
call_ask,double precision, 
call_bid_ask_size,character,50 
call_last,character,50 
call_delta,double precision, 
call_volume,double precision, 
call_open_interest,double precision, 
put_bid,double precision, 
put_ask,double precision, 
put_bid_ask_size,character,50 
put_last,character,50 
put_delta,double precision, 
put_volume,double precision, 
put_open_interest,double precision, 

我想嘗試表分成N個單獨的表可以同時減少寫連接的數量。還有什麼我可以嘗試或測試?

+1

爲什麼在寫入表時無法查詢表?你會用這些信息更新問題嗎?當您運行讀取查詢時會發生什麼?你使用Python還是Perl?請僅使用與您使用的技術相關的標籤。 – halfer

+0

感謝您的評論,我通過Perl寫入postgres,但試圖通過python從表中讀取。這就是爲什麼我讓他們在那裏。 – zad0xlik

+0

好的,到達那裏。請用「非常慢」的含義來更新問題,以及您希望達到的時間。「不可能」似乎是錯誤的詞,因爲你說閱讀查詢正在工作。 – halfer

回答

0

檢查您的I/O子系統是否承受壓力–,這將解釋所花費的時間。

如果您避免使用索引進行順序掃描,您可以獲得某些內容,但會大大降低插入速度。

這裏沒有免費的午餐。

您可以嘗試添加足夠的RAM以緩存表,這將顯着加快查詢速度。