我已经彻底搜索了这个网站,还没有找到一个解决方案,为我工作。我用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查询的性能,但是如果有人也能告诉我,我可以发布脚本的性能。你知道吗
我认为延迟是因为SQL先运行groupby语句,然后再运行其他所有语句。所以它会遍历整个大型数据集来对所有数据进行分组,然后再遍历一次来提取值并进行计数和求和。你知道吗
如果没有groupby,它就不必在开始生成结果之前解析整个数据集—它直接跳到求和和和计算所需的变量。你知道吗
关于加速你的工作流程,你可能有兴趣看看我的答案的第三部分:https://stackoverflow.com/a/50457922/5922920
如果您想在使用分布式文件系统时保持类似SQL的接口,除了Hadoop和Spark之外,您可能还需要查看Hive、Pig和Sqoop。你知道吗
此外,为了跟踪SQL查询的性能,如果合适的话,您可以始终跟踪客户端代码的执行时间。你知道吗
例如:
或者使用类似的工具来更深入地了解正在发生的事情:https://stackify.com/performance-tuning-in-sql-server-find-slow-queries/
相关问题 更多 >
编程相关推荐