2016-10-10 106 views
1

編輯 - 我使用的是Windows 10提高數據庫查詢速度與Python

是否有快速的替代pd._read_sql_query的MS SQL數據庫?

我在使用熊貓來讀取數據並在數據上添加一些列和計算。我已經刪除了大部分的修改,現在我基本上只是閱讀(每天一百到二百萬行;我的查詢是讀取前一天的所有數據)數據並將其保存到本地數據庫(Postgres的)。

我連接的服務器遍佈世界各地,除了查詢數據外,我沒有任何特權。如果可能,我希望解決方案保留在Python中。我想加快它,並消除任何開銷。另外,您可以看到我正在將文件臨時寫入磁盤,然後將其打開到STDIN副本。有沒有辦法跳過文件創建?它有時超過500MB,這似乎是一種浪費。

engine = create_engine(engine_name) 
query = 'SELECT * FROM {} WHERE row_date = %s;' 
df = pd.read_sql_query(query.format(table_name), engine, params={query_date}) 
df.to_csv('../raw/temp_table.csv', index=False) 
df= open('../raw/temp_table.csv') 
process_file(conn=pg_engine, table_name=table_name, file_object=df) 
+0

什麼是你的本地OS(你的PostgreSQL正在運行)? – MaxU

+0

Windows 10,對不起。添加到OP – trench

回答

0

UPDATE:

,你也可以嘗試使用bcp utility,這可能會更快被很多比較pd.read_sql()卸載數據,但你需要的Microsoft Command Line Utilities for SQL Server

本地安裝之後,你可以用PostgreSQL的COPY ... FROM ... ...

OLD回答:

你可以嘗試直接寫您的DF到PostgreSQL(跳過df.to_csv(...)df= open('../raw/temp_table.csv')部分):

from sqlalchemy import create_engine 

engine = create_engine(engine_name) 
query = 'SELECT * FROM {} WHERE row_date = %s;' 
df = pd.read_sql_query(query.format(table_name), engine, params={query_date}) 

pg_engine = create_engine('postgresql+psycopg2://user:[email protected]:port/dbname') 
df.to_sql(table_name, pg_engine, if_exists='append') 

只是測試無論是更快相比COPY FROM STDIN ...

+0

我曾經使用to_sql,但實際上它慢很多(即使創建一個文件並再次讀取它的時間)。在你的代碼中,你不會在任何地方使用df = pd.read_。沒有必要,或者你只是把這部分放出去?我想我會需要它,因爲我需要指定我查詢的日期。 – trench

+0

@trench,在這種情況下,我不認爲你可以加快它的速度,因爲'COPY ...'PostgreSQL命令專門用於加載/卸載數據,它已經非常優化。您可以嘗試在加載前刪除PostgreSQL表上的索引,並在加載完成後重新創建它 – MaxU

+0

啊,是的,要清楚,我很滿意COPY FROM速度。它工作得很快。我的原始查詢(read_sql_query)與熊貓持續使用,這就是我希望取代的。另外,編寫temporary.csv文件也需要很長時間。我認爲花費大約1500秒左右的時間來查詢數據並花費大量時間來編寫500MB臨時文件。我會看看你的bcp實用程序建議 – trench