提问人:ravindu93 提问时间:5/2/2023 最后编辑:M Zravindu93 更新时间:5/3/2023 访问量:121
查询超过1000万行的SQL表
Querying a SQL Table with over 10million rows
问:
我在 Dremio 中有一个超过 1000 万行的表。我已经从 Python PYODBC 连接到它。我想运行一个简单的查询,如下所示:
SELECT REPORTDATE, TRANSDATE
FROM TABLE
WHERE TRANSDATE = '2020-01-05'
问题是通过 Python 运行此查询需要很长时间。 对此的解决方案是什么?
答:
0赞
Abe
5/2/2023
#1
我建议使用 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()
如果它仍然运行得太慢,您可以使用以下属性将其分块拉取:
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_sql.htmlchunksize
0赞
Christopher Jones
5/3/2023
#2
使用 Oracle 的 python-oracledb 驱动程序而不是 pyodbc 并增加值,请参阅 https://python-oracledb.readthedocs.io/en/latest/user_guide/tuning.html#tuning-fetch-performancearraysize
cur = connection.cursor()
cur.arraysize = 5000
for row in cur.execute("SELECT * FROM very_big_table"):
print(row)
除非您真的想要 Pandas 数据帧,否则使用驱动程序本机调用将是最快的。
python-oracledb 的“Thin”模式(默认)可能比“Thick”模式更快。
评论
TRANSDATE
ALTER TABLE tablename ADD INDEX (transdate)
ADD UNIQUE INDEX