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
根据朋友的说法,oracle中的视图实际上更快用于缓存。这是真的? postgresql怎么样?我试过谷歌和stackoverflow(最接近的一个是MS SQL)。
答案 0 :(得分:9)
视图(表示非物化视图)不会被缓存。它们只是一个准备好的SQL语句,它在查询中代替视图引用运行。可以把它们想象成宏,或者是包含视图中包含的SELECT语句的变量。
物化视图(PostgreSQL不支持)与表类似,因为它们可以被索引。但物化视图在他们可以支持的范围内是众所周知的限制(IE:没有非确定性值)。
您发布的所有示例都不是自然的JOIN,如下所示:
SELECT cec.year, ces.*
FROM mam.subcategory ces
NATURAL JOIN mam.category cec
语法不受欢迎(虽然是ANSI),因为它充其量是模棱两可的,如果出现以下情况,你会遇到问题:
非实体化视图在很大程度上与JOIN语法无关。数据和索引将对性能产生更大的影响。
答案 1 :(得分:6)
视图有时可以帮助缓存略微。 基础是
SELECT a.name, b.zipcode
FROM table_a a JOIN table_b b ON a.id = b.id
是与
不同的查询SELECT a.name, b.zipcode
FROM table_b b JOIN table_a a ON a.id = b.id
即使它们在逻辑上相同。如果两者都被发送到Oracle,它们都会进入查询缓存。 [查询缓存是Oracle存储查询的地方,因此它不必重复语法/权限检查和计算查询执行路径。]通过具有封装table_a和table_b之间的连接的视图,多个查询结束的可能性较小在逻辑上相同的缓存中。
这是“不要重复自己”的更通用原则的一部分。如果重复代码,则需要重复测试和修补,并且有更多代码可能出错。任何表现优惠都是奖金。所以观点有好处,但表现并不重要。