在Oracle中,查看速度是否比自然连接快?那么postgresql呢?

myt*_*mer 2 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
Run Code Online (Sandbox Code Playgroud)

根据朋友的说法,oracle中的视图实际上更快用于缓存目的.这是真的?postgresql怎么样?我试过谷歌和stackoverflow(最接近的一个是MS SQL).

OMG*_*ies 9

查看

视图(表示非物化视图)不会被缓存.它们只是一个准备好的SQL语句,它在查询中代替视图引用运行.可以把它们想象成宏,或者包含视图中包含的SELECT语句的变量.

物化视图(PostgreSQL不支持)与表类似,因为它们可以被索引.但是物化视图在他们可以支持的范围内是众所周知的限制(IE:没有非确定性的价值).

自然的联接

您发布的所有示例都不是自然JOIN,如下所示:

      SELECT cec.year, ces.*
        FROM mam.subcategory ces
NATURAL JOIN mam.category cec
Run Code Online (Sandbox Code Playgroud)

语法是不受欢迎的(尽管是ANSI),因为它充其量是模棱两可的,如果出现以下情况,您将面临问题:

  • 列被添加或重命名
  • 使用此方法只能连接两个表
  • 如果列以不寻常的方式跨表连接,则几乎无法控制连接的细节.加入标准是什么并不明显 - 显式是可读的并保证一致的结果.

结论

非实体化视图在很大程度上与JOIN语法无关.数据和索引将对性能产生更大的影响.


Gar*_*ers 6

视图有时可以稍微帮助缓存.基础是

SELECT a.name, b.zipcode 
FROM table_a a JOIN table_b b ON a.id = b.id
Run Code Online (Sandbox Code Playgroud)

是一个不同的查询

SELECT a.name, b.zipcode 
FROM table_b b JOIN table_a a ON a.id = b.id
Run Code Online (Sandbox Code Playgroud)

即使它们在逻辑上是相同的.如果两者都被发送到Oracle,它们都会进入查询缓存.[查询缓存是Oracle存储查询的地方,因此它不必重复语法/权限检查和计算查询执行路径.]通过具有封装table_a和table_b之间的连接的视图,多个查询结束的可能性较小在逻辑上相同的缓存中.

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