Postgresql报错语句太大

Postgresql error statement is too large

我在 python 和 sqlalchemy 上开发了一个脚本来获取和更新我最后的 activity 个活跃用户。

但是用户增加了很多,现在我收到以下错误

psycopg2.ProgrammingError: Statement is too large. Statement Size: 16840277 bytes. Maximum Allowed: 16777216 bytes

我在想如果我更新文件 postgres.conf 它会起作用,所以在 pgtune 的帮助下我更新了文件,但是它不起作用,所以我使用以下参数 /etc/syslog.conf 更新了我的内核

kern.sysv.shmmax=4194304
kern.sysv.shmmin=1
kern.sysv.shmmni=32
kern.sysv.shmseg=8
kern.sysv.shmall=1024

再次失败。

之后,我将查询分成多个部分以减小大小,但我遇到了同样的错误。

如何知道我需要更新什么参数来增加语句的大小?

工作流程

query = "SELECT id FROM {}.{} WHERE status=TRUE".format(schema, customer_table)
ids = ["{}".format(i)for i in pd.read_sql(query, insert_uri).id.tolist()]

read_query = """
SELECT id,
 MAX(CONVERT_TIMEZONE('America/Mexico_City', last_activity)) lastactivity
FROM activity WHERE
DATE_TRUNC('d', CONVERT_TIMEZONE('America/Mexico_City', last_activity)) =
DATE_TRUNC('d', CONVERT_TIMEZONE('America/Mexico_City', CURRENT_DATE))-{} and
 id in ({})
GROUP BY id
""".format(day, ",".join(ids))

last_activity = pd.read_sql(read_query, read_engine, parse_dates=True)

如果您只是从数据库中获取 ID 而没有通过任何其他方式过滤它们,则根本不需要获取它们,您只需将 SQL 语句作为子查询插入到第二个:

SELECT id,
 MAX(CONVERT_TIMEZONE('America/Mexico_City', last_activity)) lastactivity
FROM activity WHERE
 DATE_TRUNC('d', CONVERT_TIMEZONE('America/Mexico_City', last_activity)) =
 DATE_TRUNC('d', CONVERT_TIMEZONE('America/Mexico_City', CURRENT_DATE))-%s and
 id in (
    SELECT id FROM customerschema.customer WHERE status=TRUE
 )
GROUP BY id

此外,正如 Antti Haapala 所说,不要对 SQL 参数使用字符串格式,因为 它是不安全的 如果任何参数包含适当的引号,postgres 将将它们解释为命令而不是数据。