now() 作为参数传递给函数时如何求值

2024-04-01

我有一个表,它是按带有时区字段的时间戳进行范围分区的。我非常惊讶地发现以下 where 条件导致规划器查询分区中的每个“子”表:

WHERE reading_time > (now() - '72:00:00'::interval)

据我所知,规划器不知道执行时 now() 会是什么,因此它生成查询每个子表的计划。这是可以理解的,但这就违背了设置分区的初衷!如果我发出 Reading_time > '2018-03-31',它只会对具有满足这些条件的数据的表进行索引扫描。

如果我创建以下函数会发生什么

CREATE OR REPLACE FUNCTION public.last_72hours(in_time timestamp with time zone)

   Select * from precip where reading_time > (in_time - '72:00:00'::interval)
   --the function will then do work on the returned rows

END;

然后我可以调用该函数

SELECT last_72hours(now())

now() 什么时候被评估?或者,换句话说,文字时间值(例如 2018-03-31 1:01:01+5)是否传递到函数中?如果是字面值,那么 Postgres 只会查询相应的子表,对吧?但如果它在函数内评估 now() ,那么我会回到扫描每个子表索引的计划。似乎很难看出规划者在函数中做了什么。那是对的吗?


这里有几个问题;我会尽力回答所有问题。

PostgreSQL 无法评估now()在计划时,因为无法知道该语句何时执行。计划可以无限期保留。

如果你调用一个函数now()作为参数,它将在函数调用时进行评估。

如果您在函数内涉及分区表的 SQL 语句中使用参数(因此计划被缓存),则可能会发生两种情况:

  1. PostgreSQL 决定在第五次执行查询后切换到通用计划。那么就不能进行分区修剪。

  2. PostgreSQL 决定坚持使用自定义计划,以便进行分区修剪。

人们会假设通常会选择第二个选项,但要找出您可以使用auto_explain查看实际使用的计划。

使用动态 SQL 可能是一个好主意,以便始终使用当前参数值重新规划查询,并且肯定会使用分区修剪。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

now() 作为参数传递给函数时如何求值 的相关文章

随机推荐

  • 有人可以澄清一下 Joel On Software 引用的意思吗:(功能性程序没有副作用)

    我正在读书乔尔安软件 http www joelonsoftware com 今天又遇到了这个报价 http www joelonsoftware com articles ThePerilsofJavaSchools html 不了解功能
  • BigQuery JDBC 驱动程序返回的行数不会超过 100,000 行

    我在 Pentaho PDI 中使用 Google BigQuery 的 starschema JDBC 驱动程序 http code google com p starschema bigquery jdbc http code goog
  • AWS Lambda:Lambda 函数 S3 到 S3 复制的跨账户策略

    我们正在尝试实现 lambda 函数 该函数将根据源 S3 存储桶事件将对象从一个 S3 复制到跨账户中的另一个 S3 存储桶 目前 我们能够在同一 SAG 内的源和目标之间复制文件 但是当我们尝试跨账户实现相同的逻辑时 得到了 CopyO
  • windows下Qt应用程序和窗口图标

    我通过嵌入包含图标的标准 Windows 资源文件创建了一个简单的应用程序图标 不过 我还想在我的主应用程序窗口上使用此图标 是否有捷径可寻 到目前为止 似乎唯一的方法是单独加载包含窗口图标的图标 而不是重用已经存在的图标 这似乎是一个可怕
  • 更改 foreach 循环内的初始数组?

    我想要一个 foreach 循环 其中初始数组在循环内更改 eg array array red blue foreach array as key gt value array white echo value br 在此循环中 尽管我在
  • iOS Google 静默登录提供了缺少个人资料信息的(有效)令牌

    我已将 Google SignIn SDK v4 0 1 集成到我的 iOS 应用程序中 正常的身份验证过程通过以下方式正常工作 GIDSignIn sharedInstance signIn 检索到的 idToken 有效 包含电子邮件和
  • 如何使用 .Net 处理程序处理 .asp 扩展名?

    我有一个旧的经典 ASP 网站 我正在将其迁移到 IIS7 5 我不想在服务器上安装经典 ASP 因此我只想将 asp 文件视为 aspx 文件 我该如何在 IIS7 5 中执行此操作 编辑 澄清一下 我并不是在问如何让经典的 ASP 代码
  • Highstock日期输入jquery ui datepicker位置变化

    在 Highstock 中 您可以使用 jquery ui datepicker 而不是在日期字段中输入文本 如本演示所示 http jsfiddle net hcharge aNde9 http jsfiddle net hcharge
  • 在 Chrome 中播放多种声音

    我正在为 Facebook 开发 HTML5 游戏 我有以下 HTML 代码
  • 如何让小圆圈的边框变得平滑?

    有没有办法让纯 CSS 圆形边框在较小尺寸下看起来清晰明快 或者有什么方法可以使边框在外边缘周围不出现 锯齿状 非常感谢 Use box shadow针对此问题的 CSS 属性 请看下一个例子 http jsfiddle net RJMWR
  • GCC最高指令集,兼容多种架构

    我正在由具有不同架构的机器组成的集群上运行作业 gcc march native Q help target grep march cut f3给了我其中之一 broadwell haswell ivybridge sandybridge
  • 你能建议一个好的 minhash 实现吗?

    我正在尝试寻找一个可以在我的工作中利用的 minhash 开源实现 我需要的功能非常简单 给定一个集合作为输入 实现应该返回其 minhash 首选 python 或 C 实现 以防万一我需要破解它才能为我工作 任何指示都会有很大帮助 Re
  • 如何在 C# 注册表类中使用 REG_OPTION_OPEN_LINK

    我想打开一个符号链接的注册表项 据微软称 https learn microsoft com en us windows win32 api winreg nf winreg regopenkeyexw parameters我需要使用REG
  • 使用 NSDocument 时如何将故事板视图绑定到核心数据实体?

    我正在构建一个使用核心数据 NSDocument 故事板和 Cocoa 绑定的 OS X 应用程序 我的期望是发生以下情况 一个实例MyDocument NSDocument子类 被创建 MyDocument创建核心数据NSManagedO
  • Google Play -505 安装错误

    我在 Google Play 中有一个应用程序 它是使用工具和 API 22 构建的 一切运行良好 但上次使用 API 23 工具 23 1 的更新向用户显示编号为 505 的 Android 6 0 错误 在 Google Play 应用
  • Python/Django - 避免在源代码中保存密码

    我使用 Python 和 Django 创建 Web 应用程序 并将其存储在源代码管理中 按照 Django 通常的设置方式 密码在 settings py 文件中以纯文本形式显示 以纯文本形式存储我的密码会给我带来许多安全问题 特别是因为
  • 有没有办法从 json-server 文件生成 swagger.json

    对于原型设计 我们使用 json server 库 它根据我们的 db json 文件创建假 REST api 现在我们想使用 swagger 所以我的问题是 有没有办法从我们的 db json 文件生成 swagger json 如果没有
  • 如何在 Android 中拍照、保存并获取照片

    我一直在搜索拍摄照片的简单示例 并使用 URI 保存它并检索照片进行图像处理 我尝试了很多示例代码 但没有一个顺利 有人有示例代码吗 像这样定义一个变量 protected static final int CAPTURE IMAGE AC
  • 维护程序集版本号的最佳实践/指南

    我正在寻找有关如何管理 NET 程序集的三个不同程序集版本号的指示 建议甚至指示 产品版本是最简单的 因为这通常是由业务决定的 然后 文件版本似乎用于部署之间的版本控制 其中实际的程序集版本仅在发货时使用 现在 我只是在寻找一种简单的方法来
  • now() 作为参数传递给函数时如何求值

    我有一个表 它是按带有时区字段的时间戳进行范围分区的 我非常惊讶地发现以下 where 条件导致规划器查询分区中的每个 子 表 WHERE reading time gt now 72 00 00 interval 据我所知 规划器不知道执