我试图在一个大约26.6亿行的SQL表上运行以下查询,请记住,我使用的是Python psycopg(但如果能让我的生活更轻松,我可以使用其他东西),最终将这些结果转换为csv文件:
import csv
from psycopg2 import sql
year = 2013
stmt=sql.SQLI(f"""SELECT * FROM skill TABLESAMPLE SYSTEM (1) WHERE skillclusterfamily='Science and Research' AND DATE_PART('year',jobdate)={year}""")
cur.execute(stmt)
res=cur.fetchall()
print(res)
字符串
请记住,仅1%就相当于2660万行,在我的系统上,这个单一的查询将花费大约2个小时,这太长了。我没有访问NVIDIA GPU的权限,但我只想查询这些数据并将其放入CSV文件中,以便在其他地方使用。我的最终目标是使用for循环编写一个包含2007-2021年数据的csv文件,并使用从表中随机采样的数据将其存储在一个csv文件中,因为2660万行应该足够了,因此我只做了1%。有什么方法可以使这种查询更快吗?我无法安装扩展。
我尝试了系统和伯努利采样,老实说,两者都没有更快。
2条答案
按热度按时间dsf9zpds1#
使用
TABLESAMPLE
会使查询变慢。相反,您应该创建一个支持WHERE
条件的索引,并使用LIMIT
来限制结果行数。de90aj5v2#
我认为,为了让你的查询运行得更快,不要使用(SELECT *),只选择你需要的。其次,你应该先计算表中有多少行,然后划分数据,并使用多线程概念来更快地访问数据。第三,在你的条件查询中,对列创建索引和分区,在你的例子中,这些列是“skillclusterfamily,year”。例如:我的表中有20亿行,我将使用5个线程从该表中读取数据,线程1负责阅读从0到400.000.000的行,线程2负责读取从400.000.001到800.000.000的行...等等。