查询超过1000万行的SQL表

Querying a SQL Table with over 10million rows

提问人:ravindu93 提问时间:5/2/2023 最后编辑:M Zravindu93 更新时间:5/3/2023 访问量:121

问:

我在 Dremio 中有一个超过 1000 万行的表。我已经从 Python PYODBC 连接到它。我想运行一个简单的查询,如下所示:

SELECT REPORTDATE, TRANSDATE 
FROM TABLE 
WHERE TRANSDATE = '2020-01-05'

问题是通过 Python 运行此查询需要很长时间。 对此的解决方案是什么?

python sql 性能 pyodbc dremio

评论

1赞 Barmar 5/2/2023
确保列上有索引。否则,它必须读取每一行。TRANSDATE
1赞 ravindu93 5/2/2023
@Barmar非常感谢您的回复。你能告诉我怎么做吗?这是否意味着我必须在表中添加新的索引列?
1赞 Barmar 5/2/2023
我不知道 Dremio,但在普通 SQL 中它是ALTER TABLE tablename ADD INDEX (transdate)
2赞 Barmar 5/2/2023
不。如果要声明它唯一,请使用ADD UNIQUE INDEX
2赞 Barmar 5/2/2023
任何数据库教科书或教程都应该解释索引的作用。这是一个基本的 DBMS 概念。

答:

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.html
chunksize

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”模式更快。