16

我的团队维护一个大约为 10 的 Oracle 数据库。200GB 大小。所有数据(表、索引等)都位于单个“USERS”表空间中。这是一个坏主意吗?拥有多个表空间有什么好处,在什么情况下我想向我的数据库添加更多表空间?

谢谢!

4

5 回答 5

24

我的偏见(这主要是个人喜好问题)是,如果创建额外的表空间没有令人信服的好处,那么使用单个表空间会更轻松。

  • 将对象放在不同的表空间中没有性能优势。有一个古老的神话,分离表和索引会带来一些性能优势。将 I/O 分散到所有可用的心轴有一个潜在的好处,但是最好在单个表空间中使用多个数据文件而不是使用多个表空间,因为 Oracle 会在不同数据文件中循环分配范围,假设您的 SAN 是'还没有做一些事情来平衡 I/O。
  • 如果您有大型的静态查找/历史表,这样您就可以通过引入较小的事务表空间来将数据库的新副本带到客户端站点,这将是考虑多个表空间的原因。但是很少有应用程序具有这种设置。如果您必须带上全部 200 GB,那么您拥有多少表空间并不重要。
  • 同样,如果您有大型只读对象,将它们放在只读表空间中可以大大减少备份所需的时间和空间。不过,这在数据仓库之外的实践中并不是特别常见。
  • 如果您的应用程序可以在没有某些对象子集的情况下运行,那么创建单独的表空间可能会有好处,这样您就可以脱机并执行表空间级恢复。同样,很少有应用程序可以在没有一组对象的情况下运行——例如,如果您丢失了索引表空间,那么应用程序很可能就像您丢失所有内容一样死机。
  • 如果您有大量空表或大部分空表以及许多非常大的表,则从空间利用率的角度来看,具有不同扩展分配策略的单独表空间可能是更可取的。这种情况偶尔会发生在打包的应用程序中,其中任何给定的安装都使用了相对较小百分比的可用表,并且您不希望每个空表都有相对较大的范围分配给它。使用本地管理的表空间中的自动扩展区管理,这往往不是主要问题,如果您想使用统一扩展区,则可能更令人担忧。
  • 如果不同的对象对磁盘性能有不同的优先级,并且您有不同类型的可用磁盘,则单独的表空间可以让您将不同的对象放在不同的磁盘集上。例如,在数据仓库中,您可能希望将旧数据放在更慢、更便宜的磁盘上,而将新数据放在更昂贵的磁盘上。OLTP 应用程序很少发生这种情况。

除非您的应用程序属于这些特殊情况之一,否则拥有单独表空间的唯一好处是吸引 DBA 的组织意识。就个人而言,我非常高兴能够避免每次创建对象时都指定表空间名称,或者在不可避免地错误地在默认表空间中创建对象时花费循环从“错误”表空间中移动对象。就个人而言,当使用具有自动扩展区管理的本地管理表空间对具有不同统一扩展区大小的手动优化表空间集使用时,如果“浪费”了几十 MB 的空间,我并不太担心。另一方面,优秀的 DBA 往往非常关心事情的组织方式“就这样”,所以我

于 2009-08-18T05:36:44.433 回答
10

请参阅http://download.oracle.com/docs/cd/B10501_01/server.920/a96521/tspaces.htm

请参阅http://download.oracle.com/docs/cd/B28359_01/server.111/b28318/physical.htm

您可以使用多个表空间来执行以下任务:

控制数据库数据的磁盘空间分配

为数据库用户分配特定的空间配额

通过使单个表空间联机或脱机来控制数据的可用性

执行部分数据库备份或恢复操作

跨设备分配数据存储以提高性能

于 2009-08-18T01:15:07.933 回答
5

使用不同表空间的一个原因是希望使用表空间传输在数据库之间移动数据。如果您想要移动一组有限的数据而不必导出和导入它,那么表空间传输是一个不错的选择,特别是如果出于测试原因,数据与源系统具有完全相同的物理结构很重要(例如,用于性能分析工作)。

于 2009-12-17T10:17:38.760 回答
5

我强烈不同意 Justin Caves 的评估。生产 DBA 可能会有非常不同的意见。

可传输表空间功能用于在数据库之间移动数据子集,而无需移动整个数据库。

只读表空间,因此您不必每周备份整个数据库,这可能需要很多小时,而且您无法忍受这段时间内的性能损失,即使您限制了速率。

由于庞大的规模,仅在固定日期备份某些表空间,尽管许多地方没有这么大的数据库。与上述相同的原因。

根据您的应用程序,假设有一些模块可以在应用程序端彼此独立运行。如果它们每个都有自己的一组表空间,您可以将一个应用程序表空间脱机以进行重组,而不会影响其他模块......它们可以正常运行。

至于数据和索引的分离:传统的原因是将两者放在不同的磁盘上,这样它们就不会在性能方面相互竞争。当今的存储能力问题不大,比如 SAN,它们实际上都是同一个存储区域,但仍然存在如果您将所有对象都放在同一个表空间中,您无法在本地将索引与表分开,那么即使使用本地管理的表空间,您也会在文件头级别发生争用!即使您在一个表空间中创建 20 个数据文件,您也无法决定表和索引的位置,然后有一天您会注意到由于针对索引所在的表的大量活动,您在文件头级别遇到了重大争用碰巧在同一个数据文件中!事实上废弃了。如果您只有一个 ts,那么您无疑会遇到文件头争用。

进行这种逻辑分离还有更多原因,不,这在很大程度上与性能无关,更多的是与生产环境中的管理有关。

于 2013-01-23T15:46:15.097 回答
1

S. Lott 已经给出了一个很好的列表,列出了人们可能希望将其拆分到多个表空间的一般原因。

更具体的你的情况...

我会问自己现在是否有具体的理由来改变事情。进行这样的结构性改变绝非易事。是否存在性能问题?您是否正在违反存储空间限制?您需要分配空间配额吗?您当前的备份和恢复计划是否满足您的需求?

如果您可以回到过去并从头开始重做某些事情,您肯定会计划明智地将数据库划分为不同的表空间。但现在值得吗?

于 2009-08-18T02:52:50.877 回答