优化sql scan查询以获取postgres db

时间:2016-05-14 05:21:10

标签: sql postgresql talend

我正在研究小型SQL逻辑

我有一个表消息,包含message_id,属于列

此表中的数据将以唯一的消息ID继续显示。

我的目标是将这些mesaages表数据存储到另一个数据库中。 [从postgres(源)DB到postgres(目的地)DB]

为此,我已经设置了一个ETL工作。这有助于我传输数据。

问题出现了,在postgres(source)DB中,消息表所在的位置,在该表中,message_id不是排序形式。数据看起来像这样......

我的etl作业每隔半小时运行一次,我的动机是每当etl作业运行时,都会根据message_id将数据从源db传递到destinaton db。在目标数据库中,我有一个存储过程可以帮助我从消息表中获取max(message_id)并将该值存储在另一个表中。所以在ETL中我在查询中使用该值,我用它来触发源数据库以获取大于我从目标数据库获得的message_id的数据。

所以它是一种负载增量过程。使用etl。但是用于从源数据库获取数据的查询就像这个http://prnt.sc/b3u5il

SELECT * FROM (SELECT * FROM MESSAGES ORDER BY message_id) as a WHERE message_id >"+context.vid+"

此查询每次运行时都会扫描所有表...因此需要花费很多时间来执行。我得到了我想要的结果。但是有什么方法可以让我以更快的方式执行这个过程。

任何人都可以帮我优化这个查询(不知道它是否可能)?或者欢迎任何其他建议。

由于

3 个答案:

答案 0 :(得分:1)

在您的情况下,提高效果的最有效方法是在排序列中添加 INDEX ,在这种情况下,message_id可以获得更好的效果。

通过这种方式,您的查询将执行索引扫描而不是全表扫描,这会妨碍性能。

您可以使用以下语句创建索引:

CREATE INDEX index_name
ON table_name (column_name)

答案 1 :(得分:0)

如果message_id不是主键或辅助索引中的前导列,则创建索引:

... ON MESSAGES (message_id)  

消除内联视图:

 SELECT m.*
   FROM MESSAGES m
  WHERE m.message_id > ?
  ORDER BY m.message_id

答案 2 :(得分:0)

创建B树索引: 您可以在创建索引时通过包括选项ASC,DESC,NULLS FIRST和/或NULLS LAST来调整B树索引的顺序;例如:

CREATE INDEX test2_info_nulls_low ON test2(info NULLS FIRST); CREATE INDEX test3_desc_index ON test3(id DESC NULLS LAST);