我正在使用性能较慢的Oracle数据库,因为在某些表上加入以获取结果。我正在考虑创建一个存储这些数据的新表,以便可以快速检索它而无需执行连接。另一种方法是为我正在执行的连接创建一个视图,然后始终查询视图以获取数据。使用新表与创建视图之间的性能折衷是什么?我认为一个视图仍然需要运行连接,因此它不会提供与新表一样好的性能。
Oracle数据库视图的信息在这里: - http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_8004.htm - What is a View in Oracle?
根据以下回复进行澄清。查询大部分已经过优化,因此我不想进行优化。更喜欢新表或物化视图,但想知道哪个可能更好。我对表演很感兴趣。编写更多代码以使新表与旧表保持同步不是问题。我只会在对旧表进行修改的地方添加修改语句。如果它比添加新表慢,我不想使用物化视图。
区别在于对数据化视图或新表的数据刷新是否更有效。对于新表,基本上我将在旧表更新的地方添加更新语句。因此,当用户查询新表时,数据已经存在(不需要进一步处理)。但是对于物化视图,如果视图仅在用户查询视图时刷新自身,那么这可能会更慢。
答案 0 :(得分:7)
视图只是一个存储查询,因此查询视图和对基表发出相同查询之间的性能应该没有差别。
创建单独的表可能会提高查询的性能,但它违反了规范化,然后您必须编写使该表保持同步的代码。如果您需要查询返回正确的结果而不是近似结果,这意味着您的DML操作(插入,更新和删除)将变得更慢,以便处理保持数据同步。如果这主要是一个报告数据库,那么这可能是一个适当的权衡,但在事务性能至关重要的OLTP环境中它将更不合适。
如果您要创建表格,我通常建议您考虑创建materialized view。这具有表的性能优势,但Oracle负责保持同步,因此您不必为此编写大量自定义代码。
但是,首先实现数据的具体化解决方案并不是很明显。你确定你不是只是错过了一些索引吗?
答案 1 :(得分:5)
materialized view
可能是您正在寻找的。常规view
不作为表存在,它只引用它所基于的表。但是,像Linutis评论的那样,您应该首先尝试优化查询。您可能需要在连接中涉及的列上使用索引,并在您正在使用的表上收集统计信息。
答案 2 :(得分:5)
视图只是查询的包装器,使用视图的性能与使用查询的性能相同(如果忽略查询解析开销)。
因此,如果使用大量连接,使用视图将无助于解决问题。但是经过Oracle中查询优化的大量经验,我可以给你一些注意事项:
union all
代替union
可以完成的任务。coalesce
,(甚至在使用sub-select作为参数的情况下使用它),这些是我现在想到的事情。希望它会有所帮助。