我将 python 与 redshift_connector 结合使用,并使用 pandas 分析数据。当通过选择 n 列访问 redshift 数据库时,我得到了 i 行。但是,当我想向此查询添加新列时,一小时后超时。为了解决这个问题,我想到了选择 n+1 列,以迭代方式使用 LIMIT 和 OFFSET 来获取每一行。过了一会儿,它返回了 i 行,但有些东西没有加起来。当我比较结果时,后者产生了几个重复的行。如何编写一个查询,使其不会超时,但不会返回重复项?
不会超时的原始模拟查询:
SELECT a, b, c
FROM table
WHERE a IN ('attribute1','attribute2')
超时:
SELECT a, b, c, d
FROM table
WHERE a IN ('attribute1','attribute2')
如果我将第二个放在 while True 循环中,用 LIMIT 和 OFFSET 修改它,使用 pd.read_sql(query, connection) 获取数据,将其附加到 df 列表,最后连接列表,它给我返回了第一行的确切行数,但有重复。
如果没有 ORDER BY 子句,这就是我所期望的。 Redshift 是一个集群数据库,其中各个节点的响应时间将决定返回行的顺序。 由于此时间基于每次运行查询时的许多不受控制的变量,因此行顺序将会不同。
因此添加一个 ORDER BY 子句并确保它对所有行进行排序,而不可能进行任意排序。 执行此操作可能需要一些时间才能弄清楚,因为根据您选择的列,没有两行可以具有相同的订单位置。 此外,添加对行进行排序的工作可能会让您重新陷入超时情况。
基本上我认为这可能不是解决这个问题的最佳方法。这种方法不能保证返回一致的数据。 表可以在迭代查询之间发生变化。
了解为什么仅由于添加列而超时。 工作查询是否需要将近一个小时? 是什么导致查询时间这么长?数据传输时间?你的超时时间是多少?
根据超时情况,迭代返回数据的更好方法是使用游标。 无需订购,也无需考虑一致性。