是否建议为 Read 和 DML 设置 2 个单独的表

Is it suggestible to have 2 separate tables for Read and DML

我们有一个 table,截至目前,它有超过 600 列和超过 3000 万行。有20多列,定义了Index,table分布在5个partitions

实时 运行 有超过 5 个进程(写入特定分区),它们 Insert/Update 对此 table(大约 10k 插入和 1-每天 200 万次更新)。

另外,有超过 20 个进程,包含底层 procedures/views/queries,不断地从这个 table 读取。如果我将它与其他数据库进行比较,table 中的 select 尽管有索引,但速度很慢。

现在我们正计划重新设计和拆分 table,因为许多列现在已过时,并且许多列仅对特定分区有效。所以我们希望有 5 个单独的 tables,每个分区一个,具有特定于该分区的属性。

Would it be suggestible to have 2 separate set of tables, one for DMLs and one for Select, and synchronize them via triggers? Any other suggestions regarding the split/sync of the tables would be really appreciated.

我尝试用下面的 2 个分区复制场景。第一个 table 是当前正在使用的那个,我们将删除它并为每个分区创建 2 个单独的 table,具有特定于该分区的属性。

现有 Table: t ,我们稍后会删除。 Table 被 REGION

分割
+----+--------+-------+-------+-------+-------+
| ID | REGION | NAME  | COL_1 | COL_2 | COL_3 |
+----+--------+-------+-------+-------+-------+
|  1 | A      | FOO   |    12 | Y     |       |
|  2 | A      | BAR   |    13 | N     |       |
|  3 | B      | ALPHA |    14 |       |     1 |
+----+--------+-------+-------+-------+-------+

新 Table: t_A

+----+--------+------+-------+-------+
| ID | REGION | NAME | COL_1 | COL_2 |
+----+--------+------+-------+-------+
|  1 | A      | FOO  |    12 | Y     |
|  2 | A      | BAR  |    13 | N     |
+----+--------+------+-------+-------+

新 Table: t_B

+----+--------+-------+-------+-------+
| ID | REGION | NAME  | COL_1 | COL_3 |
+----+--------+-------+-------+-------+
|  3 | B      | ALPHA |    14 |     1 |
+----+--------+-------+-------+-------+

您几乎肯定不想手动创建单独的表集用于读取和写入。在 Oracle 中,读取器和写入器不会互相阻塞,除非您有一些极其罕见的情况,否则这 25 个并发进程不会导致热块性能问题。

拆分表更有可能产生新的缓存和复制问题。将数据量加倍也意味着可能有两倍的数据要塞入内存。自定义复制程序会显着降低写入性能,因为所有写入都是重复的,并且触发器的上下文切换会更多。

只有当您已经有一个只读系统时,才有意义为读取和写入创建单独的表,就像您使用数据保护创建逻辑备用数据库一样。在这种情况下,您可以使用 Oracle 的内置复制,它可能比自定义版本更快、更准确。如果您的第一个数据库资源不足,第二个数据库可能有助于提高性能。 (理想情况下,将所有内容都保存在一个数据库中总是更快,但实际上,您的服务器只能增长到这么大。)

正如其他人所提到的,在考虑分离表之前,您可能应该投入更多时间来调整现有查询。