【问题标题】:Oracle scoring report view based on multiple complex queries基于多个复杂查询的 Oracle 评分报告视图
【发布时间】:2011-08-21 15:40:22
【问题描述】:

我想在 Oracle 数据库中构建一个报告工具,该工具根据处理不同表的多个相当复杂的查询的结果计算分数。如果某些条件匹配,所有这些查询都会给我一个特定 ID 的列表。

这是一个例子:

假设将有三个查询“查找居住在西雅图的所有用户 ID”、“查找过去三个月内购买过汽车的所有用户 ID”和“查找在美国境内移动超过 3 个的所有用户 ID”次”。如果找到查询的用户 ID,则每个查询都会为用户获得分数,例如查询 1 = 3 分,查询 2 = 5 分,查询 3 = 2 分。最终结果应该给出与至少一个查询匹配的用户及其 ID 的列表。结果集将按所有分数的总和降序排列。结果集应该是最新的。

|用户 ID | points_lived_in_seattle | points_bought_car | points_moved |总和 | -------------------------------------------------- ---------------------------- | 123 | 3 | 0 | 2 | 5 | |第456章0 | 3 | 0 | 3 | |第789章0 | 0 | 2 | 2 |

在 Oracle 中实现这样的报告工具的最佳方法是什么?我正在考虑为其创建一个视图,但这将非常困难,因为在不久的将来可能会添加 20 个或更多查询。此外,我还担心组合所有查询的联接无法正常工作并导致结果集不正确。

我正在考虑的另一个选择是为每个查询创建一个物化视图,一个视图仅基于其他视图创建评分。

您将如何解决这个问题?如果其中一个查询速度非常慢,会对整个数据库的性能产生什么影响?

【问题讨论】:

    标签: sql database oracle view reporting


    【解决方案1】:

    您为什么要考虑物化视图?在一个语句中测试查询,如果它们足够快,则使用它们。如果没有,并且您已经检查了索引,为什么不直接将结果插入表中,然后“从表顺序中按 sum desc 选择 *”?

    【讨论】:

    • 使用物化视图的原因不就是您希望通过提高查询执行时间来聚合数据吗?我认为它会在执行之前预先计算昂贵的连接和聚合操作并将结果存储在表中。数据应该是最新的。只运行一次并将其插入表格将无济于事。我需要一个观点。您将如何将查询组合到 SQL 中的评分视图?
    • 如果您有昂贵的连接和聚合操作,那么数据库上的负载不会因物化视图而减少,而是会由于围绕它进行的所有额外活动而增加;虽然我承认查询时间会更快。据我了解,如果物化视图所在的表中的单行发生更改,则必须重新同步整个物化视图。这就是我对所有大量查询所做的事情。我们从数百万行的表中创建了 20-30 个表,其中包含分组依据,并将结果插入到参考表中,然后可以在几秒钟内进行查询。
    • 如果您希望您的报告只需几秒钟,并且您有大型表格,那么如果您使用表格、物化视图或单个视图来获取,那么使用 20 个连接将很难做到这一点他们都在一起。
    • 听起来你以前做过类似的事情。是的,我还必须处理数百万行表。不确定我是否正确阅读,但您通过运行分组查询创建多个视图,然后有一个聚合表,您可以从这些视图中插入数据?如果您能进一步澄清这一点,那就太好了。
    • @ben - 如果您在基表上有物化视图日志,则不需要刷新整个视图,并且您将其定义为快速刷新。当然,虽然有限制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    相关资源
    最近更新 更多