我在 Dremio 中有一张超过 1000 万行的表。我已经从 Python PYODBC 连接到它。我想运行如下所示的简单查询:
SELECT REPORTDATE, TRANSDATE
FROM TABLE
WHERE TRANSDATE = '2020-01-05'
问题是通过 Python 运行这个查询需要很长时间。 解决方案是什么?
我建议使用 sqlalchemy 或 pandas 进行调用。
就我个人而言,我使用 pandas(下面的示例使用 cx_Oracle,因为我们使用 Oracle 服务器):
import pandas as pd
qry = '''
SELECT REPORTDATE, TRANSDATE
FROM TABLE
WHERE TRANSDATE = '2020-01-05'
'''
dsn_tns = cx_Oracle.makedsn('host-name','port',service_name='database')
conn = cx_Oracle.connect(user=user_name, password=pwd, dsn=dsn_tns)
c = conn.cursor()
results = pd.read_sql(qry , conn)
c.close()
conn.close()
如果它仍然运行得太慢,你可以使用
chunksize
属性将它拉成块:使用Oracle的python-oracledb驱动代替pyodbc并增加
arraysize
值,参见https://python-oracledb.readthedocs.io/en/latest/user_guide/tuning.html#tuning-fetch-performance
cur = connection.cursor()
cur.arraysize = 5000
for row in cur.execute("SELECT * FROM very_big_table"):
print(row)
除非你真的想要一个 Pandas 数据框,否则使用驱动程序本地调用将是最快的。
python-oracledb 的“Thin”模式(默认)可能比“Thick”模式更快。