【发布时间】:2021-11-07 01:30:54
【问题描述】:
我有以下视图。
CREATE OR REPLACE VIEW vw_myview AS
SELECT
emp_joining_dt,
emp_joining_dt+365 as emp_reminder_dt
FROM EMP
/
员工入职一年后,需要发送提醒。日常工作读取emp_reminder_dt 并触发它。
365 天基本上是不变的。但是,要求是公司可能希望将其更改为 183 或 730。
因此,值 365 配置在表中并从 DB 中读取。
CREATE OR REPLACE VIEW vw_myview AS
SELECT
emp_joining_dt,
emp_joining_dt+MyPackage.get_reminder_days as emp_reminder_dt
FROM EMP
/
上述方法的问题是每次查询视图时都会调用数据库 从配置表中读取值。
有人担心应该避免频繁查询数据库。
有没有办法从数据库中第一次读取值 365,然后从某个缓存中读取。 那么当值改变时,从数据库中读取第一次,然后从某个缓存中读取?
使用缓存只是我的猜测,但还有其他方法吗?
【问题讨论】:
-
经常查询?你每天运行一次,那么频繁吗?为什么要使用包 - 只需加入存储此值的表即可。
-
在大多数查询中查找表中的一行不应该是特别的负担。
-
无论你做什么,它已经从表
EMP中读取,这将比从表MyPackage读取单行和单列的成本要高得多。我不会再浪费一秒钟来担心它了。 -
" 需要发送提醒。",那么这显然是某些预定程序的一部分。因此,将术语作为输入参数,设置为过程调度的属性。尽管正如其他人所说,您对“频繁查询”的担忧是非常错误的。每天一次从表中获取单行的这一查询对于数据库而言并非微不足道。
-
您拥有的查找功能似乎是合理的。它是否被声明为确定性、并行启用并带有编译指示 UDF? (关于这是否是“确定性”的滥用,可以进行长时间而有趣的对话,因为它不是,但我会在这里将它用于语句级缓存。)你可以尝试
result_cache,但我不确定它比使用标准缓存查询表要快。
标签: sql oracle performance plsql view