SQL Server中的聚集索引与Oracle中的索引组织表


8

作为数据库开发人员,我正在从SQL Server过渡到Oracle,并且已经在这里找到了一些很棒的资源(如何从SQL Server DBA过渡到Oracle?以及作为DBA,我将如何从Oracle过渡到SQL Server。 ?),但是我很难找到有关在Oracle中使用索引组织表的良好信息。

在我的前世中,我们在OLTP-ish数据集市中广泛使用了SQL Server中的聚集索引,并取得了巨大的成功。索引组织表是否可以方便地用作Oracle中的工具?


1
我的研究似乎表明它们没有得到广泛使用-是@Gaius在这里说的:dba.stackexchange.com/questions/1847/…吗?甲骨文员工只是错过了吗?
JHFB 2013年

物联网在Oracle中很少使用。我想我只用过我在12年2作为Oracle DBA
Philᵀᴹ

Answers:


7

如果要从SQL Server过渡到Oracle,建议先尝试使用堆表,因为它们是在Oracle中存储数据的标准形式。对于大多数工作负载,在DML和查询性能方面,Oracle中具有常规索引的堆表是最平衡的存储形式。

如果以后发现性能问题或瓶颈,则应研究专用的高级存储方法,例如IOT,分区,集群,反向键索引等。

特别是关于物联网,我建议不要将其普遍使用,因为初学者可能会遇到很多“陷阱”:

  • 物联网没有真正的rowid(因为本身没有表格)。
  • 因此,IOT上的二级索引没有真正指向行的指针,而仅仅是猜测,可能导致索引扫描效率低下。
  • 在IOT上禁用了某些功能,例如虚拟列表压缩,复合分区。
  • 您必须在创建时决定将非索引列(内联或在溢出段中)存储哪里,这可能会导致某些查询的性能下降。

6

Oracle中的IOT与SS中的聚簇索引并不完全相同,因为Oracle统计信息包括行的物理散布,而SS统计信息中不包括物理位置。有关更多信息,请参见Lewis和Fritchey之间关于Oracle和Sql Server中的统计数据的辩论。(http://www.red-gate.com/products/oracle-development/deployment-suite-for-oracle/education/webinars/webinar-statistics-oracle-sql-server-jonathan-lewis )这就是为什么集群的原因SS中的索引比堆好。聚集索引将物理位置数据添加到统计信息中。当您知道索引提供了将要搜索的数据行的共置时,IOT就是很好的选择,例如,order_date上的索引和客户的订单表将是一个很好的IOT。


谢谢@吉姆。因此,听起来好像SS中的聚集索引克服了统计信息中缺乏物理信息的缺点;因此,从理论上讲,如果没有这样的索引,Oracle应该运行得更快?同样要澄清的是,我想使用IOT来保证特定列的数据行的物理位置接近吗?
JHFB 2013年

1
@JHFB-是的,IOT保证将根据索引中的列对构成表的主键索引的数据进行物理排序。因此,这可以用于确保给定父级的子表中的行在物理上彼此靠近。
克里斯·萨克森

3

文森特对物联网的警告提出了一些要点,但您也可以从中获得一些重大利益。

我个人认为它们在Oracle中没有得到充分利用,应该被广泛考虑-不仅仅是解决性能问题的方法。由于您必须重新创建表以在IOT和堆之间进行转换,因此,除非性能问题严重,否则在经常使用且频繁使用的数据库上不太可能发生此更改。

Martin Widlake撰写了许多有关物联网的文章。使用它们可以获得一些明显的好处:

  • 显着减少物理和逻辑IO读取
  • 更有效地使用缓冲区高速缓存,这可以提高系统范围的性能
  • 由于仅维护索引而不是表,因此节省了空间(除非有溢出段)

但是,要获得这些好处,您需要一个表(几乎)始终在查询中包含主键的前导列,并且您可能一次要获取几行。此类表的一些常见示例是:

  • 多个通常在订单中发现的详细信息-订单项目,发票-发票行等。
  • 通常以“单向”查询的多对多分辨率表。例如,在一个customer_addresses表中,查找一个客户的所有地址,而不是查找一个地址的所有客户,是非常普遍的。

缺点是插入数据的速度较慢,因此您需要权衡成本和收益。归根结底,这取决于了解您的数据并了解如何使用它来指导决策。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.