我正在研究小型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+"
此查询每次运行时都会扫描所有表...因此需要花费很多时间来执行。我得到了我想要的结果。但是有什么方法可以让我以更快的方式执行这个过程。
任何人都可以帮我优化这个查询(不知道它是否可能)?或者欢迎任何其他建议。
由于
答案 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);