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).
视图(表示非物化视图)不会被缓存.它们只是一个准备好的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语法无关.数据和索引将对性能产生更大的影响.
视图有时可以稍微帮助缓存.基础是
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之间的连接的视图,多个查询结束的可能性较小在逻辑上相同的缓存中.
这是"不要重复自己"的更通用原则的一部分.如果重复代码,则需要重复测试和修补,并且有更多代码可能出错.任何表现优惠都是奖金.所以观点有好处,但表现并不重要.
| 归档时间: |
|
| 查看次数: |
1753 次 |
| 最近记录: |