gpt4 book ai didi

java - 运行子查询决定是否跳过外部查询,如果跳过不发送参数?

转载 作者:行者123 更新时间:2023-11-29 13:26:46 25 4
gpt4 key购买 nike

我有以下在 Java JDBC 中使用的查询

INSERT INTO account_photos (token, image, image_id, order_count) SELECT ?, ?, ?, ?  WHERE NOT EXISTS (SELECT 1 from account_photos where image_id = ?)

看起来它在获取 image 时会导致非常高的服务器负载和带宽使用,即使 image_id 在表中也是如此。

如果 NOT EXISTS 不为真,是否有办法不获取图像?

最佳答案

在此查询中,图像数据将在查询开始前传输到服务器。查询处理分阶段进行:

  • 解析:从客户端读取查询文本,验证其语法并将其转化为描述查询的内部结构
  • 绑定(bind):从客户端读取查询参数并将它们与已解析查询中的占位符匹配
  • 执行:实际运行查询

IF NOT EXISTS (SELECT ...) 发生在执行阶段。绑定(bind)阶段已经完成,这是通过网络传输图像数据以临时存储在数据库服务器内存中的绑定(bind)阶段。

您不能让 PostgreSQL 在绑定(bind)参数之前运行部分查询。 PostgreSQL 不支持惰性参数绑定(bind),它只在查询需要时才回调客户端请求参数数据。从根本上说,这并没有什么不可能,只是当前的 PostgreSQL 协议(protocol)、客户端驱动程序或数据库服务器不支持它。

因此,您必须分两个阶段执行此操作,作为两个单独的查询。判断图片是否存在,不存在才插入。

注意:您的查询可以尝试插入图像两次,因为两个并发查询都可以返回 false for not exists (select...),因此都可以继续insert

关于java - 运行子查询决定是否跳过外部查询,如果跳过不发送参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32417509/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com