这是一个由两部分组成的问题。如果你正在检查这个,谢谢你的时间!我的Postgres查询如何执行得更快?我可以使用Python来提供更快的迭代吗?
有没有办法让我的查询速度更快?
我以前问过一个问题here,并最终能够自己解决问题。
但是,当我针对包含40,000多条记录的数据库运行时,我设计的查询结果非常慢(25分钟以上)。
该查询服务于其目的,但我希望你们中的一位聪明人能够指出我如何使查询以更优选的速度执行。
我的查询:
with dupe as ( select json_document->'Firstname'->0->'Content' as first_name, json_document->'Lastname'->0->'Content' as last_name, identifiers->'RecordID' as record_id from ( select *, jsonb_array_elements(json_document->'Identifiers') as identifiers from staging ) sub group by record_id, json_document order by last_name ) select * from dupe da where ( select count(*) from dupe db where db.record_id = da.record_id ) > 1;
此外,一些示例数据:
行1:
{ "Firstname": "Bobb", "Lastname": "Smith", "Identifiers": [ { "Content": "123", "RecordID": "123", "SystemID": "Test", "LastUpdated": "2017-09-12T02:23:30.817Z" }, { "Content": "abc", "RecordID": "abc", "SystemID": "Test", "LastUpdated": "2017-09-13T10:10:21.598Z" }, { "Content": "def", "RecordID": "def", "SystemID": "Test", "LastUpdated": "2017-09-13T10:10:21.598Z" } ] }
行2:
{ "Firstname": "Bob", "Lastname": "Smith", "Identifiers": [ { "Content": "abc", "RecordID": "abc", "SystemID": "Test", "LastUpdated": "2017-09-13T10:10:26.020Z" } ] }
如果我把在我的查询结果中,或一部分结果放入可以使用Pandas进行操作的Python环境中,我如何迭代我的查询(或子查询)的结果以达到与原始查询相同的最终结果?
是否有一种更简单的方法,使用Python,以与Postgres相同的方式遍历未嵌套的json数组?
例如,在执行此查询后:
select json_document->'Firstname'->0->'Content' as first_name, json_document->'Lastname'->0->'Content' as last_name, identifiers->'RecordID' as record_id from ( select *, jsonb_array_elements(json_document->'Identifiers') as identifiers from staging ) sub order by last_name;
如何,使用Python /熊猫,我可以采取查询的结果,并执行类似:
da = datasets[query_results] # to equal my dupe da query db = datasets[query_results] # to equal my dupe db query
然后执行
相当于select * from dupe da where ( select count(*) from dupe db where db.record_id = da.record_id ) > 1;
in Python?
如果我在这里没有提供足够的信息,我很抱歉。我是一名Python新手。任何和所有的帮助,非常感谢!谢谢!!
首先从使用CTE('WITH'查询)转换为使用子查询在FROM表单。见https://blog.2ndquadrant.com/postgresql-ctes-are-optimization-fences/ –
感谢克雷格!我现在正在阅读这篇文章,看起来这可能会有所帮助。 +1 – jmoneygram
一旦你弄清楚了方法,它在SQL中执行的事情几乎总是比客户端迭代更快。有时需要一些额外的思考。在编辑中,请为您的查询显示“EXPLAIN ANALYZE”输出。 –