写密集功能的体系结构

Gan*_*row 8 ruby oracle memcached caching ruby-on-rails-3

我使用由Oracle数据库支持的Ruby on Rails和我当前项目的memcached.

有一个非常常用的功能,它依赖于单个数据库视图作为数据源,并且此数据源内部具有其他数据库视图和表.

它是一个虚拟的数据库视图,能够从一个地方访问所有内容,而不是物化的数据库视图.

用户大部分时间都在他们想要更新的功能中,因此拥有最新的数据非常重要.

从此视图获取数据时,我将安全表内部连接到视图(安全表不是视图本身的一部分),其中包含一些我们用于在更细粒度级别上控制数据访问的字段.例如,安全表具有user_id, prop_1, prop_2列,其中prop_1, prop_2是db视图上可用的列,并且user_id是登录用户.有些用户在安全表中有相同的道具说prop_1 = 1 and prop_2 = 1,但也可以prop_1像其他用户一样但有不同的prop_2喜欢prop_1 = 2 and prop_2 = 1.prop_1和prop_2有许多不同的组合,将它们视为另一个表的FK,因此可能有很多条目.

到目前为止,在应用程序上检索记录的时间差不多是10秒,这很慢.我正在考虑替代方法.

我首先要做的是物化视图,但由于用户经常更新,因此可能不是最佳选择,因为刷新视图可能需要一些时间.

我想到的第二件事是缓存,使用prop_1prop_2组合作为底层数据的复合键,因为许多用户具有相同的组合,并且具有相同组合的任何人都可以访问相同的数据.

但是,这种方法可能需要更多的代码重写和逻辑来保存和检索片段中的数据,而不是像在数据库视图中那样使用一个查询从一个位置.

根据您的经验,您是如何解决相同/类似问题的?或者,我可以尝试一种更好的方法吗?

Mat*_*eak 0

很多时候,加入复杂视图会带来性能问题。

prop_1和是prop_2您想要限制的值吗?也就是说,您是否将视图加入到这些列的安全表中,例如

WHERE  my_view.prop_1 = security_table.prop_1
AND    my_view.prop_2 = security_table.prop_2
AND    security_table.user_id = :current_user_id
Run Code Online (Sandbox Code Playgroud)

下一个问题: 是否prop_1映射prop_2到视图基础表中的列?如果是这样,它们是否可以用于快速访问基础表中的行(在您的视图之外)吗?

如果是这样,我会尝试DBMS_RLS.ADD_POLICY在基础表上添加安全策略来增强安全性(即,限制值prop_1prop_2基于当前用户的值),并且根本不将安全表加入到视图中。

如果您向基础表添加安全策略,Oracle 将在访问表时添加这些谓词,然后再添加查询变得复杂这可能会给 Oracle 的优化器提供额外的帮助,使该过程更快。

没有看到你的代码,很难说更多。