在SQL(Python/Pandas)中加速groupby子句

2024-09-30 01:30:20 发布

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

我已经彻底搜索了这个网站,还没有找到一个解决方案,为我工作。我用python编写代码,对SQL知之甚少。我目前需要创建一个代码来从SQL数据库中提取数据,并对其进行组织/汇总。我的代码如下:(为了数据安全起见,它被删除了)

conn = pc.connect(host=myhost,dbname =mydb, port=myport,user=myuser,password=mypassword)
cur = conn.cursor()
query = ("""CREATE INDEX index ON myTable3 USING btree (name);
    CREATE INDEX index2 ON myTable USING btree (date, state);
    CREATE INDEX index3 ON myTable4 USING btree (currency, type);

    SELECT tp.name AS trading_party_a,
    tp2.name AS trading_party_b,
    ('1970-01-01 00:00:00'::timestamp without time zone + ((mc.date)::double precision * '00:00:00.001'::interval)) AS val_date,
    mco.currency,
    mco.type AS type,
    mc.state,
    COUNT(*) as call_count,
    SUM(mco.call_amount) as total_call_sum,
    SUM(mco.agreed_amount) as agreed_sum,
    SUM(disputed_amount) as disputed_sum


    FROM myTable mc
    INNER JOIN myTable2 cp ON mc.a_amp_id = cp.amp_id
    INNER JOIN myTable3 tp ON cp.amp_id = tp.amp_id
    INNER JOIN myTable2 cp2 ON mc.b_amp_id = cp2.amp_id
    INNER JOIN myTable3 tp2 ON cp2.amp_id = tp2.amp_id,
    myTable4 mco



    WHERE (((mc.amp_id)::text = (mco.call_amp_id)::text))

    GROUP BY tp.name, tp2.name,
    mc.date, mco.currency, mco.type, mc.state

    LIMIT 1000""")

frame = pdsql.read_sql_query(query,conn)

即使我的限制设置为5,查询也需要15分钟才能运行。在添加groupby子句之前,它将在10秒内以限制5000运行。我想知道,因为我知道我的SQL不是很好,如果有人对可能导致延迟的地方有任何见解,以及需要做的任何改进。你知道吗

EDIT:我不知道如何查看SQL查询的性能,但是如果有人也能告诉我,我可以发布脚本的性能。你知道吗


Tags: nameidsqldateonastypecall
2条回答

我认为延迟是因为SQL先运行groupby语句,然后再运行其他所有语句。所以它会遍历整个大型数据集来对所有数据进行分组,然后再遍历一次来提取值并进行计数和求和。你知道吗

如果没有groupby,它就不必在开始生成结果之前解析整个数据集—它直接跳到求和和和计算所需的变量。你知道吗

关于加速你的工作流程,你可能有兴趣看看我的答案的第三部分:https://stackoverflow.com/a/50457922/5922920

如果您想在使用分布式文件系统时保持类似SQL的接口,除了Hadoop和Spark之外,您可能还需要查看HivePigSqoop。你知道吗

此外,为了跟踪SQL查询的性能,如果合适的话,您可以始终跟踪客户端代码的执行时间。你知道吗

例如:

import timeit

start_time = timeit.default_timer()

#Your code here

end_time = timeit.default_timer()

print end_time - start_time 

或者使用类似的工具来更深入地了解正在发生的事情:https://stackify.com/performance-tuning-in-sql-server-find-slow-queries/

相关问题 更多 >

    热门问题