问题描述
大家好,我有一个与实体化观点有关的问题。
我们有3个表: INVOICE_MAIN,INVOICE_BALANCE和INVOICE_LINE,以及一个视图发票加入INVOICE_MAIN和INVOICE_BALANCE。
在表INVOICE_LINE中有INVOICE_ID (FK到表发票) 、TOTAL_EXCL_VAT和TOTAL_VAT列。
在表INVOICE_BALANCE中有INVOICE_ID (FK到表发票),TOTAL_EXCL_VAT和TOTAL_VAT列-都包含总和。
表INVOICE_BALANCE通过som PL/SQL代码和工作表保持最新,因此插入到现有发票上的INVOICE_LINE表不会阻止同一发票的其他插入 (它们成为INVOICE_BALANCE的更新)。有一个计划的作业,它会读取工作表并执行合并到INVOICE_BALANCE表中。一切正常与多个会话 (超过20) 插入。
我们可以用INVOICE_LINE上的实体化视图日志和实体化视图替换INVOICE_BALANCE表并避免锁定吗?
理由是Oracle可以编写比我们更好的代码,并且当前的解决方案有点 “笨拙”,需要基本上永不停止的计划作业。
我们有3个表: INVOICE_MAIN,INVOICE_BALANCE和INVOICE_LINE,以及一个视图发票加入INVOICE_MAIN和INVOICE_BALANCE。
在表INVOICE_LINE中有INVOICE_ID (FK到表发票) 、TOTAL_EXCL_VAT和TOTAL_VAT列。
在表INVOICE_BALANCE中有INVOICE_ID (FK到表发票),TOTAL_EXCL_VAT和TOTAL_VAT列-都包含总和。
表INVOICE_BALANCE通过som PL/SQL代码和工作表保持最新,因此插入到现有发票上的INVOICE_LINE表不会阻止同一发票的其他插入 (它们成为INVOICE_BALANCE的更新)。有一个计划的作业,它会读取工作表并执行合并到INVOICE_BALANCE表中。一切正常与多个会话 (超过20) 插入。
我们可以用INVOICE_LINE上的实体化视图日志和实体化视图替换INVOICE_BALANCE表并避免锁定吗?
理由是Oracle可以编写比我们更好的代码,并且当前的解决方案有点 “笨拙”,需要基本上永不停止的计划作业。
专家解答
除了 “笨拙” 之外,您当前的解决方案还有什么具体问题?您希望通过使用mv获得什么好处?
不知道您的环境细节,也许mv会更好,也许不会。
您当然可以将MV中的值求和以获得总数。
如果在提交时使其快速刷新,则Oracle数据库将作为更改行的事务的一部分对其进行更新。
但是一次只有一个进程可以刷新一个MV。因此,如果表上有20个并发事务,这可能是一个问题。
也就是说,您当前提交作业的方法意味着更新余额是一个单独的交易。所以你有一个很短的时期,余额无论如何都不是最新的。因此,您可能可以通过频繁的计划刷新 (例如每分钟) 来摆脱。
或者,当您使用12.2时,您可以查看实时实体化视图。这两全其美: 从MV中获得最新结果的能力。但只是定期刷新。这些工作原理是在运行查询时应用MV日志中的更改。
在以下位置阅读有关这些的更多信息:
https://blogs.oracle.com/sql/12-things-developers-will-love-about-oracle-database-12c-release-2#real-time-mv
https://oracle-base.com/articles/12c/real-time-materialized-views-12cr2
https://richardfoote.wordpress.com/2017/07/10/12-2-introduction-to-real-time-materialized-views-the-view/
最终要决定MV是否更好,您需要决定如何评估。并对您当前的方法进行基准测试,以确保它不会在其他地方引入问题。
不知道您的环境细节,也许mv会更好,也许不会。
您当然可以将MV中的值求和以获得总数。
如果在提交时使其快速刷新,则Oracle数据库将作为更改行的事务的一部分对其进行更新。
但是一次只有一个进程可以刷新一个MV。因此,如果表上有20个并发事务,这可能是一个问题。
也就是说,您当前提交作业的方法意味着更新余额是一个单独的交易。所以你有一个很短的时期,余额无论如何都不是最新的。因此,您可能可以通过频繁的计划刷新 (例如每分钟) 来摆脱。
或者,当您使用12.2时,您可以查看实时实体化视图。这两全其美: 从MV中获得最新结果的能力。但只是定期刷新。这些工作原理是在运行查询时应用MV日志中的更改。
在以下位置阅读有关这些的更多信息:
https://blogs.oracle.com/sql/12-things-developers-will-love-about-oracle-database-12c-release-2#real-time-mv
https://oracle-base.com/articles/12c/real-time-materialized-views-12cr2
https://richardfoote.wordpress.com/2017/07/10/12-2-introduction-to-real-time-materialized-views-the-view/
最终要决定MV是否更好,您需要决定如何评估。并对您当前的方法进行基准测试,以确保它不会在其他地方引入问题。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




