【问题标题】:Oracle Database On Multiple Tablespaces多个表空间上的 Oracle 数据库
【发布时间】:2020-03-15 17:21:02
【问题描述】:

我们的 Oracle 数据库供应商建议在不同的磁盘驱动器上创建多个表空间(例如:TS1、TS2 ... 等)以提高读/写性能,但是,我只是发现一个表空间充满数据而其他表空间几乎是空的,供应商是否错过了任何额外的配置?如果供应商的观点适用,那么这是否意味着 Oracle 将管理在表空间上自动分配数据,它是平等的还是随机的?

【问题讨论】:

  • 在早期,当一个表空间通常由一个物理磁盘托管时,进行适当的表空间设计更为重要,例如将数据存储在与索引不同的表空间中以获得一些速度。现在有了 SAN 和/或虚拟基础架构,这不再那么重要了。不要期望任何性能提升由此。

标签: database oracle oracle11g tablespace


【解决方案1】:

嗯,您的数据库已经使用了不同的表空间(参见下面的示例,列表来自dba_tablespaces)。我认为您打算创建您明确使用的那些。

最明显的性能优势是将数据和索引表空间分开并将它们放在单独的磁盘上。索引通常会占用大量空间,与数据一样多(甚至更多)。如果您选择这样做,请不要忘记在存储数据或索引时指定要使用的表空间。例如,在我的 11gXE 中:

SQL> show user
USER is "SYS"
SQL> select tablespace_name from dba_tablespaces;

TABLESPACE_NAME
------------------------------
SYSTEM
SYSAUX
UNDOTBS1
TEMP
USERS

SQL> connect scott/tiger
Connected.
SQL> create table testt (id number) tablespace users;

Table created.

SQL> create index i1t on testt (id) tablespace system;

Index created.

SQL>

(最后一个没有多大意义;不要自己在SYSTEM表空间中创建任何东西,但我不想创建新的表空间)。

【讨论】:

  • 那么关于分离表和索引以提高性能的老栗子还有追随者吗?这不是真的,也不是真的。通过索引访问表是一个串行操作——索引“读取”必须在它甚至可以知道去哪里获取引用数据之前完成。他们之间根本不可能有任何冲突或争论。即使所有都在一个物理磁盘上。
  • 啊哈;谢谢你,@EdStevens。我不是 DBA,所以我当然不会争论,我没有必要的知识。我明白你在说什么。如果是我从表中读取一些数据是有道理的 - 好的,首先读取索引,然后读取数据。但是,如果有 500 个用户(或多或少同时)在同一个磁盘上读写数据会怎样?将不同磁盘上的表空间/数据文件分开不会有帮助吗?
  • 500 个并发用户?所以呢?想想这个假定的性能增益是基于什么:单个主轴上读写头的争用。这必须一次序列化为一个读取或写入请求。无论单个用户是否需要索引或表本身,争用都将发生在并发用户之间。现在考虑在现代存储系统上,“磁盘”很可能是多个主轴的抽象,加上磁盘缓冲......(待续)
  • 并且操作系统级别的多个“磁盘”实际上可能映射回同一组物理磁盘......现在,有一个论点支持将索引和表分开表空间。但这有利于易于管理,而不是性能。
  • 我明白了。再次感谢@EdStevens。因此,我的“答案”没有多大用处,所以我会删除它,但是 - 你的 cmets 很有价值,所以我会留下它(除非你发布你自己的答案;让我知道,我会删除我写的内容)。可悲的是,似乎 OP 的数据库供应商也是错误的。
【解决方案2】:

@user2155873 你说,

"如果供应商的观点适用,那么这是否意味着 Oracle 将管理在表空间上自动分配数据,并且是 是一样的还是随机的?”

Oracle 不会为您执行此操作。一张表(或表分区)或索引(或索引分区)只能占用一个表空间。您必须告诉 Oracle 您希望将对象存储在哪个表空间中。简单地创建更多表空间将无济于事,除非您实际在它们之间移动表和/或索引。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 1970-01-01
    • 2014-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多