是否建议为 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 的内置复制,它可能比自定义版本更快、更准确。如果您的第一个数据库资源不足,第二个数据库可能有助于提高性能。 (理想情况下,将所有内容都保存在一个数据库中总是更快,但实际上,您的服务器只能增长到这么大。)
正如其他人所提到的,在考虑分离表之前,您可能应该投入更多时间来调整现有查询。
我们有一个 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 的内置复制,它可能比自定义版本更快、更准确。如果您的第一个数据库资源不足,第二个数据库可能有助于提高性能。 (理想情况下,将所有内容都保存在一个数据库中总是更快,但实际上,您的服务器只能增长到这么大。)
正如其他人所提到的,在考虑分离表之前,您可能应该投入更多时间来调整现有查询。