每个函数都有一个易失性
级别(VOLATILE
, STABLE
, IMMUTABLE
)。如果 CREATE FUNCTION
命令没有明确声明范畴的话,VOLATILE
就是缺省。易失性范畴是给优化器的一个关于函数行为的承诺:
-
VOLATILE
可以做任何事情,包括修改数据库。它可以在使用同样参数调用时返回不同的结果。优化器对这样的函数不做任何假设。一个使用易失函数的查询在需要数据值的时候每次都重新计算函数的值。
-
STABLE
函数不会修改数据库,并且保证在同一个查询的环境里给出相同参数的情况下,会给出相同的结果。这个范畴允许优化器在一个查询里把多个函数调用优化成一个。特别是在索引扫描的条件表达式里面包含这样的函数是安全的。因为索引扫描只计算一次比较值,而不是每行一次。在索引扫描条件里使用一个
VOLATILE
函数是非法的。
-
IMMUTABLE
函数不会修改数据库,并且保证在任何情况下同样的参数永远返回同样的结果。这个范畴允许优化器在查询调用函数的时候预先把函数计算成一个常量参数。比如,类似 SELECT ... WHERE x = 2 + 2
的查询可以简化成 SELECT
... WHERE x = 4
,因为在加法操作符下层的函数是标记为 IMMUTABLE
的。
为了最佳的优化结果,应该尽可能使用最严格的易失性范畴标记你的函数。
任何有副作用的函数都必须
标记为 VOLATILE
,这样对它的调用就不会被优化。即使一个函数没有副作用,但它的数值可能在一个查询里改变,那么也必须标记为
VOLATILE
;例如 random()
, currval()
, timeofday()
函数。
在那些简单的规划后马上执行的交互查询上,STABLE
和 IMMUTABLE
没有什么区别:函数是在规划开始时执行还是在查询开始时执行的差别并不大。但是如果规划被保存并且后来被重用,那差别可就大了。如果把一个函数标记为 IMMUTABLE
而它实际上又不是,那么就会导致在随后使用其规划的时候用上一个不完整的数值。如果在使用预先准备好语句或者使用一种缓冲规划的函数语言(比如
PL/pgSQL),那么后果可能很严重。
因为 MVCC 的快照行为(参阅章12
),一个只包含 SELECT
命令的函数可以安全地标记为 STABLE
,即使它所选择的表可能会被其它并发查询修改也一样。PostgreSQL 将会在执行 STABLE
函数时为调用它的查询建立快照,因此它在该查询的生存期内都会看到一致的数据库视图。还要指出的是,current_timestamp
函数族都是稳定的,因为它们的数值在一个事务里是不改变的。
同样的快照行为也用于 IMMUTABLE
函数里面的 SELECT
命令。通常,在一个 IMMUTABLE
函数里选择一个数据库的表是不明智的,因为如果表的内容改变,那么这种不变性就将改变。不过,PostgreSQL 并不禁止你这样做。
一个常见的错误是把一个函数标记为 IMMUTABLE
,而实际上这个函数的结果依赖某个配置参数。比如,一个操作时间戳的函数可能有依赖于 timezone
设置的结果。为了安全考虑,这样的函数应该标记为 STABLE
。
【注意】
在 PostgreSQL 8.0 之前,要求 STABLE
和 IMMUTABLE
函数不能修改数据库这个约束并未由系统强制。版本 8.0 通过要求这类函数不能包含 SELECT
之外的 SQL
命令来强制这个约束。不过,这么做并不是完全防弹的升级,因为这样的函数仍然可以调用那些可能修改数据库的 VOLATILE
函数。如果你这么做的话将会发现 STABLE
或 IMMUTABLE
并不会觉察到被它调用的函数对数据库所做的修改。
分享到:
相关推荐
它以其高性能、稳定性和易用性著称,广泛应用于Web应用程序和企业级系统中。 ##### 数据库发展简介 - **关系型数据库**:一种基于关系模型的数据库,其中数据被组织成一系列表格,通过定义明确的关系(如主键和外键...
在这个过程中,你可以根据需要添加日志记录和错误处理,以确保脚本的稳定性和可维护性。例如,使用try-except语句捕获可能出现的异常,并记录错误信息。 在`createSpatialIndex`这个文件中,可能包含了实现上述功能...
- **说明**:B树索引是最常见的索引类型,采用二叉树结构,所有叶子节点具有相同的深度,保证了查询效率的稳定性。适用于精确查询、模糊查询和比较查询。 - **分类**:`UNIQUE`, `NON-UNIQUE`(默认),`REVERSE ...
这些都会对系统的性能和稳定性产生重要影响。 总结来说,SBT二叉树文件索引是一种高效的数据结构,用于快速定位和访问大型文件中的数据。通过解析`SbtIndex.cpp`和`SbtNode.cpp`源代码,我们可以深入了解这种索引...
Java程序性能优化是每个开发人员都需要关注的重要领域,它涵盖了多个方面,旨在提高代码执行效率,减少资源消耗,以及提升应用程序的稳定性和响应速度。在本文中,我们将深入探讨Java性能优化的关键点,帮助你的Java...
在IT行业中,系统稳定性与性能优化是至关重要的领域,它们直接影响到软件产品的用户体验、资源利用率以及整体系统的可靠性。本文将基于“系统稳定性及性能优化”的主题进行深入探讨,结合提供的资源——《系统稳定性...
在C#编程中,索引器是一个特殊的功能,它允许我们像访问数组那样访问类的成员,即使这些成员并不是实际的数组。...在实际开发中,我们需要根据需求灵活运用,同时遵循最佳实践,以确保代码的稳定性和可维护性。
- 源码中可能包含了单元测试和集成测试用例,确保快速索引功能的正确性和稳定性。 - 使用Android Studio的调试工具,如Logcat,来追踪和解决潜在问题。 通过对这些源码的分析和学习,开发者可以了解如何在自己的...
- **Web应用程序与企业级应用:** MySQL在众多领域中扮演着核心角色,例如网站数据存储、电子商务系统、日志记录等。 - **知名企业和网站:** 许多全球知名品牌和网站选择MySQL作为其后端数据库管理系统,这不仅...
在实际项目中,可能还需要添加错误处理机制,如处理无法访问的文件或目录,以及异常处理代码以确保程序的稳定运行。此外,为了提供友好的用户界面,你可能需要设计一个交互式的控制台应用或图形用户界面,让用户可以...
SQL Server采用基于代价的优化器,根据查询的特性决定是否使用索引以及使用哪个索引。 1. 聚簇索引(Clustered Indexes): - 聚簇索引决定了表中数据的实际物理顺序,每个表只能有一个聚簇索引。 - 它们的优点...
- **文档模型**:在Lucene中,文档是以Field(字段)的形式存储的,每个Field可以有自己的Analyzer(分析器),用于对文本进行分词等预处理操作。 #### 三、Lucene并行索引技术 针对Lucene在处理大量数据时效率...
集群设置对系统的稳定性和性能至关重要。 6. **安全与权限配置**:保护数据安全,控制用户访问权限。这部分配置防止未经授权的访问,保护敏感信息。 在实际操作中,我们通常会参考官方文档或社区经验来编写和调整...
集中式索引服务器的异步套接字聊天程序是一种基于网络通信的设计模式,它结合了P2P(点对点)技术与集中式服务的概念。在这个设计中,一个中心化的索引服务器扮演着协调者的角色,负责管理和维护客户端之间的连接...
GenLODGridIndex v1.0修复了前一版本的Bug,提高了算法的稳定性和准确性,确保了LOD转换过程的无缝和流畅。 这个工具通常包含以下几个部分: 1. **核心源文件**:这是实现算法的核心代码,可能包括C++、C#或其他...
本文主要针对数据库开发程序员、处理大规模数据库项目以及对数据库优化感兴趣的读者,分享一些存储过程的编写经验和优化策略。 1. 跨库操作:在使用其他库的表或视图时,推荐在当前库中创建视图,而非直接引用原库...
**使用Lucene对数据库建立索引及搜索** Lucene是一个高性能、可伸缩的信息检索库,它是...然而,实际应用时需要注意索引维护(如实时更新、删除和优化),以及处理多线程和并发访问的问题,确保系统的稳定性和高效性。
Mysql索引优化案例 在对数据库进行操作时,尤其是在处理包含大量数据的表时,查询的性能问题是一个常见且...在设计和维护数据库时,合理设计索引并持续进行性能监控和优化,可以显著提升数据库的运行效率和稳定性。