当前位置: 首页 > 面试题库 >

postgresql:偏移量+限制变得非常慢

邵华皓
2023-03-14
问题内容

我有一张表tmp_drop_ids,其中有一列,有id330万个条目。我想遍历表,每200个条目执行一次操作。我有以下代码

LIMIT = 200
for offset in xrange(0, drop_count+LIMIT, LIMIT):
    print "Making tmp table with ids %s to %s/%s" % (offset, offset+LIMIT, drop_count)
    query = """DROP TABLE IF EXISTS tmp_cur_drop_ids; CREATE TABLE tmp_cur_drop_ids AS
    SELECT id FROM tmp_drop_ids ORDER BY id OFFSET %s LIMIT %s;""" % (offset, LIMIT)
    cursor.execute(query)

最初,此方法运行良好(生成tmp表的时间约为0.15秒),但偶尔会变慢,例如,大约有30万张票,它开始花费11-12秒的时间来生成此tmp表,然后大约有40万张。基本上看来是不可靠的。

我将在其他查询中使用这些ID,因此我认为在tmp表中放置ID的最佳位置。有没有更好的方法来遍历这样的结果?


问题答案:

请改用游标。使用OFFSET和LIMIT非常昂贵-因为pg必须执行查询,处理和跳过OFFSET行。偏移量就像“跳过行”,这很昂贵。

光标文档

游标允许对一个查询进行迭代。

BEGIN
DECLARE C CURSOR FOR SELECT * FROM big_table;
FETCH 300 FROM C; -- get 300 rows
FETCH 300 FROM C; -- get 300 rows
...
COMMIT;

也许可以使用服务器端游标,而无需显式使用DECLARE语句,而仅在psycopg(关于服务器端游标的搜索部分)中提供支持。



 类似资料:
  • 不知道为什么,模拟器无论切换界面还是动画都变得很慢,但是输入,很正常,没有慢。 尝试-1 我重新启动Xcode和模拟器,但没有任何效果。

  • 我有一个由5个分区组成的主题如下: 似乎分区的偏移量非常接近其余分区的偏移量之和。我不知道如何以及为什么。

  • 谢谢,伊利亚

  • 问题内容: 此代码不起作用 我需要使用哪种SQLcode才能使这种代码 仅* 使用SQL 即可工作! * 注意 不起作用,因为我主要关注偏移量,而不是限制本身。 问题答案: 根据MySQL 5.5规范: 该子句可用于约束语句返回的行数。接受一个或两个数字参数,这些参数都必须是非负整数常量,但以下情况除外: 在准备好的语句中,可以使用 占位符标记指定参数。 在存储的程序中,可以使用整数值的例程参数或

  • 问题内容: 将我的php版本更新到5.4.0-3后,我收到一个奇怪的PHP错误。 我有这个数组: 当我尝试像这样访问它时,会收到奇怪的警告 我真的不想只编辑我的php.ini并重新设置错误级别。 问题答案: 请尝试这种方式。…我已经测试了此代码。

  • 本文向大家介绍Kafka 偏移量的演变清楚吗?相关面试题,主要包含被问及Kafka 偏移量的演变清楚吗?时的应答技巧和注意事项,需要的朋友参考一下 我在[《Apache Kafka消息格式的演变(0.7.x~0.10.x)》文章中介绍了 Kafka 几个版本的消息格式。仔细的同学肯定看到了在 MessageSet 中的 Message 都有一个 Offset 与之一一对应,本文将探讨 Kafka各