是否比Oracle中的自然连接更快?那么postgresql呢?

时间:2011-01-21 00:40:23

标签: sql oracle postgresql oracle9i

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)。

2 个答案:

答案 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之间的连接的视图,多个查询结束的可能性较小在逻辑上相同的缓存中。

这是“不要重复自己”的更通用原则的一部分。如果重复代码,则需要重复测试和修补,并且有更多代码可能出错。任何表现优惠都是奖金。所以观点有好处,但表现并不重要。