使用函数波动性优化 PostgreSQL 查询:Volatile, Stable, and Immutable

embedded/2024/9/25 21:25:33/

文章目录

  • 1.overview
  • 2. Volatile函数
  • 3. Stable函数
  • 4. Immutable 函数
  • 结论

1.overview

在 PostgreSQL 中,函数的不同波动性选择——即 Volatile(易变)、Stable(稳定)和Immutable(不可变)——在查询优化器规划和执行查询过程中起着重要作用。理解这些类别并正确应用它们可以带来显著的性能改进。让我们深入探讨每个类别,包括详细的示例,以说明它们的用例以及它们如何影响 PostgreSQL 的优化器。

2. Volatile函数

何时使用:当函数的输出在同一会话中具有相同输入参数的调用之间可能发生变化时,应使用volatile函数。 这包括进行外部调用、查询或修改数据库或依赖于非确定性源(例如curren time)的函数。
优化器行为:优化器假设volatile函数的结果在每次调用时都会发生变化。 因此,每次函数出现在查询中时,它都会重新执行该函数,从而避免任何依赖于函数结果的cache(缓存)或precomputing(预计算)的优化。
Example:

CREATE OR REPLACE FUNCTION fetch_latest_price(stock_symbol text)
RETURNS numeric AS $$
BEGIN-- Imagine this function queries a constantly updating table of stock pricesSELECT price INTO STRICT FROM stock_prices WHERE symbol = stock_symbol ORDER BY updated_at DESC LIMIT 1;RETURN price;
END;
$$ LANGUAGE plpgsql VOLATILE;-- Example Query
SELECT stock_symbol, fetch_latest_price(stock_symbol)
FROM stocks
WHERE stock_symbol = 'AAPL';

在此示例中, fetch_latest_price 是不稳定的(volatile),因为股票的价格可能会在调用之间发生变化。 PostgreSQL 将在每次调用时执行该函数,以确保检索到最新的价格。

3. Stable函数

何时使用:Stable 函数在以下情况下适用,当函数在单个事务或查询执行中对于相同的输入参数产生一致的输出,但在不同的事务之间可能会有所不同时。这些函数不会修改数据库,并且不受查询运行过程中可能发生的数据库状态变化的影响。
优化器行为:优化器可以对stable函数做出某些假设,比如在单个查询执行中重复使用结果。这可以减少函数调用次数,提高查询性能。
Example:

CREATE OR REPLACE FUNCTION user_has_permission(user_id int, permission text)
RETURNS boolean AS $$
BEGIN-- Checks if a user has a specific permission, which is unlikely to change during the execution of a querySELECT EXISTS (SELECT 1 FROM user_permissions WHERE user_id = user_id AND permission = permission) INTO result;RETURN result;
END;
$$ LANGUAGE plpgsql STABLE;-- Example Query
SELECT username
FROM users
WHERE user_has_permission(id, 'view_dashboard');

在这种情况下, user_has_permission 是稳定的,因为虽然用户权限可能会随着时间的推移而改变,但它们在查询执行期间不太可能改变。 优化器可以为每个用户调用一次该函数并重用结果,从而避免不必要的数据库查找。

4. Immutable 函数

何时使用:当输出结果完全由输入参数决定,并且无论会话状态或事务如何改变都不会变化,应使用immutable函数。
优化器行为:优化器可以对immutable函数应用最激进的优化。它可以在查询规划时预先计算结果,在多次执行中缓存结果,并在索引表达式中使用这些结果。
Example:

CREATE OR REPLACE FUNCTION add_numbers(a int, b int)
RETURNS int AS $$
BEGINRETURN a + b;
END;
$$ LANGUAGE plpgsql IMMUTABLE;-- Example Query
SELECT add_numbers(5, 10) AS result;

add_numbers 是不可变的,因为两个数字的和不会改变。在可能的情况下,PostgreSQL 可以预先计算对此函数的调用,甚至可以优化使用 add_numbers 的条件或存储过程的查询。

结论

将函数正确分类为volatile、stable或immutable可以让 PostgreSQL 的优化器做出明智的决策,从而制定更高效的执行计划。 易失性函数提供新鲜度,稳定函数平衡可预测性与灵活性,不可变函数通过结果缓存和预计算实现最高程度的优化。 了解和利用这些类别可以极大地提高基于 PostgreSQL 的应用程序的性能和可扩展性。


http://www.ppmy.cn/embedded/40287.html

相关文章

【玩转Google云】GCP 制品管理:Artifact Registry 使用详解

本篇博文将带您深入了解 Google Cloud Platform (GCP) 的 Artifact Registry,一个功能强大的统一制品仓库,用于存储、管理和保护您的软件制品。我们将详细介绍 Artifact Registry 的核心概念、优势以及使用步骤,帮助您轻松上手并将其集成到您的开发流程中。 目录 一、Arti…

Kubernetes最小单元Pod的生命周期

1.1 Pod生命周期 1.1.1 过程及状态 Pod 的生命周期管理是 Kubernetes 集群中非常重要的一部分,它涉及到 Pod 从创建到销毁的整个过程。下面是 Pod 生命周期中各个阶段的简要说明: Pod 创建过程:当一个 Pod 被创建时,Kubernetes 会…

【Go语言初探】(一)、Linux开发环境建立

一、操作系统选择 选择在Windows 11主机上运行的CentOS 7 Linux 虚拟机,虚拟化平台为VMWare Workstation. 二、安装Go语言环境 访问Go语言官网,选择Linux版本下载: 解压: tar -xvf go1.22.3.linux-amd64.tar.gz检验安装结果&…

[单机]完美国际_V155_GM工具_VM虚拟机

[端游] 完美国际单机版V155一键端PC电脑网络游戏完美世界幻海凌云家园 本教程仅限学习使用,禁止商用,一切后果与本人无关,此声明具有法律效应!!!! 教程是本人亲自搭建成功的,绝对是…

香港虚拟主机哪里可以试用?用于企业建站的

香港虚拟主机适合个人、企业建站,包括外贸企业网站、个人博客网站、中小企业官网等,那么作为新手不知道哪家香港虚拟主机好用的时候,该如何找到可以试用的香港虚拟主机呢? 香港虚拟主机也称作香港空间、香港虚拟空间,…

C++ | Leetcode C++题解之第76题最小覆盖子串

题目&#xff1a; 题解&#xff1a; class Solution { public:unordered_map <char, int> ori, cnt;bool check() {for (const auto &p: ori) {if (cnt[p.first] < p.second) {return false;}}return true;}string minWindow(string s, string t) {for (const au…

机器学习作业4——朴素贝叶斯分类器

目录 一、理论 一个例子&#xff1a; 二、代码 对于代码的解释&#xff1a; 1.fit函数&#xff1a; 2.predict函数: 三、实验结果 原因分析&#xff1a; 一、理论 朴素贝叶斯分类器基于贝叶斯定理进行分类&#xff0c;通过后验概率来判断将新数据归为哪一类。通过利用贝…