优化SQL扫描查询,以获得从Postgres的结果DB
我小的SQL逻辑工作优化SQL扫描查询,以获得从Postgres的结果DB
我一个表的消息contaning MESSAGE_ID,ACCOUNTID栏目
数据被保存在这个表来具有独特消息ID。
我的目标是将这些台面数据存储到另一个数据库中。 [从postgres(来源)数据库到postgres(目的地)数据库]
为此我设置了ETL作业。这有助于我传输数据。
问题在于,在邮件表所在的postgres(source)DB中,在该表中message_id不是以排序的形式。和数据看起来像这样.....
而我的etl作业在每半小时后运行,我的动机是每当etl作业运行时,根据message_id从源数据库到destinaton数据库。在目标数据库中,我有一个存储过程,它可以帮助我从消息表中获取max(message_id),并将该值存储在另一个表中。因此,在ETL中,我在查询中使用该值来激发源数据库,以获取比我从目标数据库获取的message_id更大的数据。
所以它的一种负载增量process.using etl。但查询正在使用,以获得从源数据库的数据是这样的http://prnt.sc/b3u5il
SELECT * FROM (SELECT * FROM MESSAGES ORDER BY message_id) as a WHERE message_id >"+context.vid+"
这个查询扫描每次运行时的所有表...所以itakes这么多的时间来执行。我得到了我想要的结果。但是有什么办法可以让我以更快的速度执行这个过程。
任何人都可以帮助我优化这个查询(不知道它是否可能)?或任何其他建议,欢迎。
谢谢
是的。
如果MESSAGE_ID是不在主钥匙或次索引的前导列,则创建一个索引:
... ON MESSAGES (message_id)
并消除联视图:
SELECT m.*
FROM MESSAGES m
WHERE m.message_id > ?
ORDER BY m.message_id
最有效的方式来在你的情况下提高性能是一个索引到您的排序列在这种情况下message_id更好的性能。
通过这种方式,您的查询将执行索引扫描,而不是完整的表扫描,这会妨碍性能。
你可以用下面的语句创建一个索引:
CREATE INDEX index_name
ON table_name (column_name)
创建一个B-tree索引: 您可以通过选项ASC调整B树索引的顺序,DESC,NULLS FIRST ,和/或NULLS LAST创建索引时;例如:
CREATE INDEX test2_info_nulls_low ON test2(info NULLS FIRST); CREATE INDEX test3_desc_index ON test3(id DESC NULLS LAST);