我有一個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個單獨的表可以同時減少寫連接的數量。還有什麼我可以嘗試或測試?
爲什麼在寫入表時無法查詢表?你會用這些信息更新問題嗎?當您運行讀取查詢時會發生什麼?你使用Python還是Perl?請僅使用與您使用的技術相關的標籤。 – halfer
感謝您的評論,我通過Perl寫入postgres,但試圖通過python從表中讀取。這就是爲什麼我讓他們在那裏。 – zad0xlik
好的,到達那裏。請用「非常慢」的含義來更新問題,以及您希望達到的時間。「不可能」似乎是錯誤的詞,因爲你說閱讀查詢正在工作。 – halfer