SELECT cec.*
FROM mam.category cec
SELECT cec.year, ces.*
FROM mam.subcategory ces
JOIN mam.category cec ON CEC.CATEGORY_ID = CES.CATEGORY_ID
SELECT cec.year, ceo.*
FROM mam.options ceo
JOIN mam.subcategory ces ON CES.SUBCATEGORY_ID = CEO.SUBCATEGORY_ID
JOIN olr.iep_cost_est_category cec ON CEC.CATEGORY_ID = CES.CATEGORY_ID
据一位 friend 说,出于缓存目的,oracle 中的 View 实际上更快。这是真的? postgresql 呢?我试过 google 和 stackoverflow(最接近的是 MS SQL)。
最佳答案
观看次数
Views,即非物化 View ,不被缓存。它们只是一个准备好的 SQL 语句,运行时代替查询中的 View 引用。将它们想象成宏,或保存 View 中包含的 SELECT 语句的变量。
物化 View (PostgreSQL 不支持)类似于表,因为它们可以被索引。但众所周知,物化 View 在支持的范围内受到限制(即:没有非确定性值)。
自然连接
您发布的示例都不是自然 JOIN,它们看起来像这样:
SELECT cec.year, ces.*
FROM mam.subcategory ces
NATURAL JOIN mam.category cec
语法不受欢迎(尽管是 ANSI),因为它充其量是模棱两可的,并且在以下情况下会让您面临问题:
- 列被添加或重命名
- 使用此方法最多只能连接两个表
- 如果列以不寻常的方式跨表连接,您几乎无法控制连接的细节。连接标准是什么并不明显 - 显式既可读又保证一致的结果。
结论
非物化 View 在很大程度上与 JOIN 语法无关。数据和索引将对性能产生更大的影响。
关于sql - View 是否比 Oracle 中的自然连接更快? postgresql 呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4754289/