pd.read_sql方法来计算大型Access数据库中的行数

2024-09-23 06:30:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图读取大型access数据库中的行数,并试图找到最有效的方法。这是我的密码:

driver = 'access driver as string'
DatabaseLink = 'access database link as string'
Name = 'access table name as string'

conn = pyodbc.connect(r'Driver={' + driver + '};DBQ=' + DatabaseLink +';') 
cursor = conn.cursor()
AccessSize = cursor.execute('SELECT count(1) FROM '+ Name).fetchone()[0]
connection.close()

这是可行的,AccessSize确实给了我一个包含数据库中行数的整数,但是计算起来太长了(我的数据库有200多万行和15列)

我试图通过pd.read_sql读取数据,并使用chunksize功能循环并不断计算每个块的长度,但这也需要很长时间。我还在游标执行部分中尝试了.fetchall,但是速度与.fetchone类似

我本以为会有一种更快的方法来快速计算表的长度,因为我不需要读取整个表。我的想法是找到最后一行的索引值,因为这本质上是行数,但我不确定如何做到这一点

谢谢


Tags: 方法name数据库密码stringaccessasdriver
2条回答

200万不应该花那么长时间。我使用过pd.read_sql(con,sql)如下:

con = connection
sql = """ my sql statement
here"""

table = pd.read_sql(sql=sql, con=con) 

你在做什么不同的事吗

在我的例子中,我使用的是一个db2数据库,也许这就是速度更快的原因

从对问题的评论:

Unfortunately the database doesn't have a suitable keys or indexes in any of its columns.

那么您就不能期望数据库有好的性能,因为每一次选择都是一次表扫描

我在网络共享上有一个Access数据库。它包含一个100万行的表,并且绝对没有索引。Access数据库文件本身是42 MiB。当我这样做的时候

t0 = time()
df = pd.read_sql_query("SELECT COUNT(*) AS n FROM Table1", cnxn)
print(f'{time() - t0} seconds')

它耗时75秒,生成45个MiB的网络流量。只需向表中添加一个主键,文件大小就会增加到48 MiB,但同样的代码需要10秒,并生成7 MiB的网络流量

TL;DR:将主键添加到表中,否则将继续受到性能不佳的影响

相关问题 更多 >